机器人发送文件到钉钉群
python发送文件到群聊
本文用具记录往钉钉群中用机器人推送文件消息,钉钉文档已经很全面了,本文只做具体案例展示
一、上传文件获取mediaId
defupload_dingtalk_media(access_token, file_path, media_type="file"):""" 上传文件到钉钉,返回 media_id :param access_token: 钉钉 access_token :param file_path: 本地文件路径 :param media_type: image / voice / video / file :return: media_id or None """ url ="https://oapi.dingtalk.com/media/upload"# MIME 类型映射 mime_map ={'.xlsx':'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet','.xls':'application/vnd.ms-excel','.docx':'application/vnd.openxmlformats-officedocument.wordprocessingml.document','.doc':'application/msword','.pdf':'application/pdf','.txt':'text/plain','.png':'image/png','.jpg':'image/jpeg','.jpeg':'image/jpeg','.gif':'image/gif','.amr':'audio/amr','.mp4':'video/mp4'} ext = os.path.splitext(file_path.lower())[1] mime_type = mime_map.get(ext,'application/octet-stream')# 关键:只取文件名,不含路径 filename = os.path.basename(file_path)withopen(file_path,'rb')as f: files ={'media':(filename, f, mime_type)# key 是 'media',filename 是纯文件名} data ={'type': media_type } params ={'access_token': access_token }# 不要手动设置 headers response = requests.post( url, params=params, data=data, files=files # 不要加 headers={'Content-Type': ...}) result = response.json()print("响应:", result)if result["errcode"]==0:return result["media_id"]else:print("上传失败: {}".format(result['errmsg']))returnNone注意事项:文件名字要不包含中文、其他字符,最好是全英文的,否则会上传失败{‘errcode’: 40035, ‘errmsg’: ‘缺少参数 media’}
二、获取群信息、机器人信息,因自定义机器人不支持推送文件,所以使用企业机器人
defdingding_CWGX_getToken(): url ="https://oapi.dingtalk.com/gettoken?appkey=%s&appsecret=%s"%("dingpwshwcfdszttvrsy","T**********H") requestData ={'appKey':'ding**********sy','appsecret':'T9**********H'}try:# print(requestData) # {"errcode":40035,"errmsg":"缺少参数 corpid or appkey"} ,data=requestData response = requests.get(url,timeout=30)if response.status_code ==200: str_res = response.text token =(json.loads(str_res)).get('access_token')return token except Exception as e: rpa.logger.error(traceback.format_exc())# 报错日志return''def dingding_ro bot_send_file(file_path,access_token,mediaId):""" 推送钉钉群消息,返回 processQueryKey :param access_token: 钉钉 access_token :param file_path: 本地文件路径 :return: processQueryKey or None """ifnot access_token: access_token = dingding_CWGX_getToken()ifnot mediaId: mediaId = upload_dingtalk_media(access_token,file_path) url ="https://api.dingtalk.com/v1.0/robot/groupMessages/send" headers ={"x-acs-dingtalk-access-token":access_token,"Content-Type":"application/json"}# 发送 file消息 postdata ={"msgParam":"{\"mediaId\":\"{}\",\"fileName\":\"表格.xlsx\",\"fileType\":\"xlsx\"}".format(mediaId),"msgKey":"sampleFile","robotCode":"ding**********sy","openConversationId":"cid+**********=="}try:print(postdata) result = requests.post(postUrl,headers=headers,data=json.dumps(postdata),timeout=30)print(result.text)if result["processQueryKey"]:return result["processQueryKey"]else:print("发送失败: {}".format(result['errmsg']))returnNoneexcept Exception as e: rpa.logger.error(traceback.format_exc())# 报错日志return'失败'注意事项:robotCode 在钉钉应用中创建的机器人中获取,openConversationId获取方式chooseChat
完工