需求:每天固定时间需要向钉钉群推送数据文件
1.由于钉钉群机器人推送消息类型只支持text,link,markdown等形式,并不支持文件和图片类媒体文件的推送,所以咱们这里就需要用到钉钉的API接口来实现了,进入钉钉开放平台:
在这里咱们是可以看到支持文件类消息的,下面怎么实现呢
2.群消息的推送是需要三个参数的,access_token(调用接口凭证),chatid(群会话id,可以通过jsapi工具获取,后边详情介绍),msg(步骤1),咱们一个一个参数来看
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,然后进行调用才可以
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和群聊名称。
语音和图片类消息同道理,鄙人菜鸟一枚,才疏学浅,希望路过的各位大佬希望不吝赐教!
对python感兴趣的朋友们可以扫码关注公众号,会不定时更新一些python基础、网络爬虫、数据分析等知识,也欢迎大家前来探讨交流,公众号加星标,不迷路!