问题描述:钉钉机器人发送文件
近日由于项目的需要,我们需要定时提取系统数据,拆分至各个城市,并且分发至各个城市的钉钉群中,供城市端使用。
但是公司下属20多个城市,每个城市都需要单独发送,耗时且容易出错!
此时,我便想到了“钉钉机器人”文档地址:钉钉开发文档
目前钉钉机器人已经广泛的使用在公司的日常数据播报中,但是日常都是以图文的形式为主,并且钉钉机器人的开发文档中,也主要是图文模式,没有现成的发送文件的方法。
问题解决:使用钉钉的“media_id”文件链接实现文件的发送
上传文件至钉钉,钉钉会给这个文件一个media_id,通过media_id,即可实现文件下载,我只需要通过钉钉机器人推送这个链接即可(如果有服务器直接放到服务器上生成下载链接也可以)
第一步:获取access_token
第二步:上传文件,获取media_id 文档:钉钉开发文档
第三步:使用钉钉机器人发送下载链接 文档:钉钉开发文档
第四步:代码编写
import requests
import json
from urllib3 import encode_multipart_formdata
import time
def getToken():
''' 获取最新的access_token'''
corpid = 'xxxxxx'
secrect = 'xxxxxxxxxx'
url = 'https://oapi.dingtalk.com/gettoken?corpid=%s&corpsecret=%s' % (corpid, secrect)
req = requests.get(url)
access_token = json.loads(req.text)
return access_token['access_token']
def get_media_id(file_path,file_name,access_token):
'''上传文件并且返回对应的media_id'''
url_post=r"https://oapi.dingtalk.com/media/upload?access_token=%s&type=file"%access_token
headers={}
data={}
data['media']= (file_name, open(file_path, 'rb').read()) #说明:file_name,不支持中文,必须为应为字符
encode_data = encode_multipart_formdata(data)
data = encode_data[0]
headers['Content-Type'] = encode_data[1]
r = requests.post(url_post, headers=headers, data=data)
media_id=json.loads(r.text)["media_id"]
return media_id
def send_file(access_token,media_id,url_robot,msg,key):
'''通过群机器人发送链接,达到点击链接下载文件的目的'''
header = {
"Content-Type": "application/json",
"Charset": "UTF-8"
}
send_time=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
down_load_url="https://oapi.dingtalk.com/media/downloadFile?access_token=%s&media_id=%s"%(access_token,media_id)
data={
"actionCard": {
"title": "%s"%key,
"text": " %s nn更新时间:%s "%(msg,send_time),
"hideAvatar": "0",
"btnOrientation": "0",
"btns": [
{
"title": "点击下载数据",
"actionURL": down_load_url
},
]
},
"msgtype": "actionCard"
}
r = requests.post(url_robot,data=json.dumps(data),headers=header)
print (r.text)
return json.loads(r.text)
def send_file_robot(file_path,url_robot,msg,key):
'''依次为文件路径,Webhook地址,需要发送的消息,钉钉安全设置的自定义关键字'''
access_token=getToken()
file_name=file_path.split('')[-1]
media_id=get_media_id(file_path,file_name,access_token)
result=send_file(access_token,media_id,url_robot,msg,key)
print(result)
if __name__ == "__main__":
url_robot='Webhook地址'
file_path=r'C:UsersAdministratorDesktopfiletest.xlsx'#文件路径
msg='需要说明的话'
key='joyooooo' #钉钉安全设置的自定义关键字
send_file_robot(file_path,url_robot,msg,key)
测试效果:
点击下载数据,弹出下载框:
最终,配合数据提取、拆分模块和定时任务,便可实现数据文件的定时批量发送了~
觉得有用的话,赞个吧,谢谢!