python3.7+钉钉API实现自动发送文件消息

需求:每天固定时间需要向钉钉群推送数据文件

1.由于钉钉群机器人推送消息类型只支持text,link,markdown等形式,并不支持文件和图片类媒体文件的推送,所以咱们这里就需要用到钉钉的API接口来实现了,进入钉钉开放平台:

java发送钉钉markdown消息 python钉钉转发消息_json

在这里咱们是可以看到支持文件类消息的,下面怎么实现呢

2.群消息的推送是需要三个参数的,access_token(调用接口凭证),chatid(群会话id,可以通过jsapi工具获取,后边详情介绍),msg(步骤1),咱们一个一个参数来看

java发送钉钉markdown消息 python钉钉转发消息_python_02


3.access_token:

def getAccess_token():
    url = 'https://oapi.dingtalk.com/gettoken?appkey=********&appsecret=*******'
    appkey = '*********' # 管理员账号登录开发者平台,应用开发-创建应用-查看详情-appkey
    appsecret = '********' # 应用里的appsecret
    headers = {
        'Content-Type': "application/x-www-form-urlencoded"
    }
    data = {'appkey': appkey,
            'appsecret': appsecret}
    r = requests.request('GET', url, data=data, headers=headers)
    access_token = r.json()["access_token"]
    return access_token

4.msg中的media_id:

钉钉推送媒体文件需要先上传至媒体文件中,生成一个独立的media_id,然后进行调用才可以

java发送钉钉markdown消息 python钉钉转发消息_java发送钉钉markdown消息_03

access_token和type两个参数都显然没有问题,这个media_id怎么传递呢,它需要的是文件名为media,并且包含filelength、content-type等信息,咱们可以把需要上传的文件放在files的参数里来实现

def getMedia_id():
    access_token = getAccess_token()  # 拿到接口凭证
    path = '*********'  # 文件路径
    url = 'https://oapi.dingtalk.com/media/upload?access_token=' + access_token + '&type=file'
    files = {'media': open(path, 'rb')}
    data = {'access_token': access_token,
            'type': 'file'}
    response = requests.post(url, files=files, data=data)
    json = response.json()
    return json["media_id"]

是不是发现没有headers,在网上看到过很多例子都将文件以multipart/form-data形式把数据放在了headers里面,结果你发现人家压根不读你的头信息,你说气不气,这也是这文档坑的地方了,文件也上传了,media_id咱们也拿到了,接下来就可以愉快的推送文件了
5.推送消息至钉钉群:

def SendFile():
    access_token = getAccess_token()
    media_id = getMedia_id()
    chatid = '********'  # 通过jsapi工具获取的群聊id
    url = 'https://oapi.dingtalk.com/chat/send?access_token=' + access_token
    header = {
        'Content-Type': 'application/json'
    }
    data = {'access_token': access_token,
            'chatid': chatid,
            'msg': {
                'msgtype': 'file',
                'file': {'media_id': media_id}
            }}
    r = requests.request('POST', url, data=json.dumps(data), headers=header)
    print(r.json())

6.完整代码:

# -*- coding: utf-8 -*-
import requests
import json


def getAccess_token():
    url = 'https://oapi.dingtalk.com/gettoken?appkey=********&appsecret=*******'
    appkey = '*********' # 管理员账号登录开发者平台,应用开发-创建应用-查看详情-appkey
    appsecret = '********' # 应用里的appsecret
    headers = {
        'Content-Type': "application/x-www-form-urlencoded"
    }
    data = {'appkey': appkey,
            'appsecret': appsecret}
    r = requests.request('GET', url, data=data, headers=headers)
    access_token = r.json()["access_token"]
    return access_token


def getMedia_id():
    access_token = getAccess_token() # 拿到接口凭证
    path = '*********' # 文件路径
    url = 'https://oapi.dingtalk.com/media/upload?access_token=' + access_token + '&type=file'
    files = {'media': open(path, 'rb')}
    data = {'access_token': access_token,
            'type': 'file'}
    response = requests.post(url, files=files, data=data)
    json = response.json()
    return json["media_id"]


def SendFile():
    access_token = getAccess_token()
    media_id = getMedia_id()
    chatid = '*******'# 通过jsapi工具获取的群聊id
    url = 'https://oapi.dingtalk.com/chat/send?access_token=' + access_token
    header = {
        'Content-Type': 'application/json'
    }
    data = {'access_token': access_token,
            'chatid': chatid,
            'msg': {
                'msgtype': 'file',
                'file': {'media_id': media_id}
            }}
    r = requests.request('POST', url, data=json.dumps(data), headers=header)
    print(r.json())


if __name__ == '__main__':
    SendFile()

7.chatid的获取:

进入JSAPI控制台https://wsdebug.dingtalk.com,手机钉钉扫码登录(主管理员),往下划,执行v0.1.2中的biz.chat.chooseConversationByCorpId,这时手机会弹出选择群聊,选择你需要获取chatid的群,JSAPI控制台就会出现chatid和群聊名称。

java发送钉钉markdown消息 python钉钉转发消息_python_04

语音和图片类消息同道理,鄙人菜鸟一枚,才疏学浅,希望路过的各位大佬希望不吝赐教!