很多时候,我们都希望计算机程序能够为我们自动化的处理一些学习、工作和生活上的任务,毕竟「偷懒」可是促进科技进步和社会发展的一大动力。基于这种需求,诞生了很多种自动化的工具,比如爬虫,自动地帮我们采集数据;比如智能问答机器人,自动地回答客户提出的问题。
在聊天工具大肆侵入我们生活各个方面的今天,各种消息无时无刻不在侵扰我们的每一寸时间,这种情况下,一个聊天的机器人就很有必要了。
今天,我们来学习一下使用 Python 开发一个钉钉的应答机器人,助你「人生苦短,少回消息」。
开始吧
前提
搭建钉钉应答机器人,需要先准备或拥有以下权限:
-
钉钉企业的管理员或子管理员(如果不是企业管理员,可以自己创建一个企业,很方便的)
-
有公网通信地址(内网穿透也可以);
钉钉群机器人开发文档:https://developers.dingtalk.com/document/app/overview-of-group-robots
创建「机器人」应用
登录「钉钉开发者后台」,选择「应用开发」——「企业内部开发」—— 「机器人」
输入好机器人的基本信息之后,就会生成创建一个「钉钉机器人」
我们的后端应用通过其提供的「AgentId」、「AppKey」、「AppSecret」就能够与钉钉机器人进行通信。
接收消息
在钉钉机器人的设定中,当用户@机器人时,钉钉会通过机器人开发者的服务器地址,用 POST 请求方法把消息内容发送出去,其 HTTP header 如下所示:
{
"Content-Type": "application/json; charset=utf-8",
"timestamp": "1577262236757",
"sign":"xxxxxxxxxx"
}
其中,timestamp
是消息发送时的时间戳,sign
是签名值,我们需要对这两个值进行校验。
如果timestamp
与系统当前时间相差1小时以上,则为非法请求。
如果sign
签名值与后台计算的值不一样,也为非法请求。
其中sign
签名值的计算方法为:header中的timestamp + “\n” + 机器人的appSecret当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,得到最终的签名值。
其 Python 实现代码如下所示:
import hmac
import hashlib
import base64
timestamp = '1577262236757'
app_secret = 'this is a secret'
app_secret_enc = app_secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, app_secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = base64.b64encode(hmac_code).decode('utf-8')
print(sign)
其发送的消息格如下所示:
{
"conversationId": "xxx",
"atUsers": [
{
"dingtalkId": "xxx",
"staffId":"xxx"
}
],
"chatbotCorpId": "dinge8a565xxxx",
"chatbotUserId": "$:LWCP_v1:$Cxxxxx",
"msgId": "msg0xxxxx",
"senderNick": "杨xx",