用Python开发钉钉群机器人

Crossin的编程教室

共 2250字,需浏览 5分钟

 · 2021-03-19

作者:刘悦

来源:刘悦的技术博客

原文:v3u.cn/a_id_132



大家好,欢迎来到 Crossin的编程教室 !

如今,远程办公已经非常普遍,很多公司都选择阿里旗下的办公软件钉钉来作为管理工具。

u1s1,钉钉这个产品真的是有很多槽点,让我一言难尽。但其中的机器人功能还是让人眼前一亮,属于比较极客的功能,它可以将第三方服务的信息聚合到钉钉群中,实现信息的自动化同步。

例如:通过聚合Github、Gitlab等源码管理服务,实现源码更新同步;通过聚合Trello、JIRA等项目协调服务,实现项目信息同步;同时,支持Webhook协议的自定义接入,支持更多可能性,例如:将运维报警提醒、自动化测试的结果报告提醒、工作、生活日程安排(上班打卡、下班吃饭、健身、读书、生日、纪念日...)等等的提醒,通过自定义机器人聚合到钉钉中。

不过关于钉钉机器人网上的一些攻略年代都比较久远,代码很多都基于python2,为了与时俱进,我们尝试用python3.7来开发配置钉钉自定义机器人。

首先明确一点,钉钉自定义机器人早就不支持在手机端创建了,所以打开你的pc端或者mac端的钉钉客户端,在需要机器人的聊天群界面,点击智能群助手:

随后点击添加机器人按钮:

此时能看到很多已经封装好的第三方机器人,本次我们选择自定义机器人:

值得一提的是,钉钉的机器人基于webhook协议,webhook呢是一个api概念,是微服务api的使用范式之一,也被称为反向api,即前端不主动发送请求,完全由后端推送,有机会会专门写一篇文章阐述webhook。

在添加机器人界面里,填写一些机器人的信息:

需要注意的是,在安全设置一栏里,我们选择加签的方式来验证,在此说明一下,钉钉机器人的安全策略有三种,第一种是使用关键字,就是说你推送的消息里必须包含你创建机器人时定义的关键字,如果不包含就推送不了消息,第二种就是使用加密签名,第三种是定义几个ip源,非这些源的请求会被拒绝,综合来看还是第二种又安全又灵活。

创建成功后,系统会分配给你一个webhook地址,这个地址需要保存一下,地址中有唯一的accesstoken。

OK,那么怎么利用这个地址让你的机器人推送消息呢?查看官方文档:https://developers.dingtalk.com/document/app/custom-robot-access

文档中只给了计算签名部分的Python代码,我们把推送部分代码也给加上:

import time
import hmac
import hashlib
import base64
import urllib.parse

timestamp = str(round(time.time() * 1000))
secret = 'SEC90485937c351bfaed41fea8eda5f1e155bbf22842d5f9d6871999e05822fd894'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote(base64.b64encode(hmac_code))
# print(timestamp)
# print(sign)

import requests,json #导入依赖库
headers={'Content-Type': 'application/json'} #定义数据类型
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=替换成你的accesstoken值&timestamp='+timestamp+'&sign='+sign
#定义要发送的数据
data = {
"msgtype": "text",
"text": {"content": '都谁没加到群里来?小心升不了班'},
}
res = requests.post(webhook, data=json.dumps(data), headers=headers) #发送post请求

print(res.text)

推送效果是下面这样的:

除了纯文本之外,还可以发送图片、链接、markdown、ActionCard、FeedCard 等消息类型,具体配置可参考文档。

如此这般,我们就完成了一个最简单的钉钉机器人。在这个基础上,你就可以打开脑洞,扩展各种功能啦!

有什么好想法,欢迎在文章下留言分享。如果文章对你有帮助,欢迎转发/点赞/收藏~



_往期文章推荐_

Python微博工具人,每日一句英语自动发




如需了解付费精品课程教学答疑服务
请在Crossin的编程教室内回复: 666

浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报