问题描述:钉钉机器人发送文件

近日由于项目的需要,我们需要定时提取系统数据,拆分至各个城市,并且分发至各个城市的钉钉群中,供城市端使用。

但是公司下属20多个城市,每个城市都需要单独发送,耗时且容易出错!

此时,我便想到了“钉钉机器人”文档地址:钉钉开发文档

目前钉钉机器人已经广泛的使用在公司的日常数据播报中,但是日常都是以图文的形式为主,并且钉钉机器人的开发文档中,也主要是图文模式,没有现成的发送文件的方法。

问题解决:使用钉钉的“media_id”文件链接实现文件的发送

上传文件至钉钉,钉钉会给这个文件一个media_id,通过media_id,即可实现文件下载,我只需要通过钉钉机器人推送这个链接即可(如果有服务器直接放到服务器上生成下载链接也可以)

第一步:获取access_token




java 钉钉发送文件 钉钉发送文件夹怎么弄_java 钉钉发送文件


第二步:上传文件,获取media_id 文档:钉钉开发文档


java 钉钉发送文件 钉钉发送文件夹怎么弄_json_02


java 钉钉发送文件 钉钉发送文件夹怎么弄_开发文档_03


第三步:使用钉钉机器人发送下载链接 文档:钉钉开发文档


java 钉钉发送文件 钉钉发送文件夹怎么弄_access 更新整列数据_04


第四步:代码编写


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)


测试效果:


java 钉钉发送文件 钉钉发送文件夹怎么弄_access 更新整列数据_05


点击下载数据,弹出下载框:


java 钉钉发送文件 钉钉发送文件夹怎么弄_json_06


最终,配合数据提取、拆分模块和定时任务,便可实现数据文件的定时批量发送了~

觉得有用的话,赞个吧,谢谢!