现在,我们都使用钉钉上网课,并且钉钉对于开发者们也是很友好。我们今天就来学习做一个钉钉机器人。
首先,下载PC端的钉钉,登录一下。
然后新建一个用于测试的群聊。
点击右边菜单栏中第一项,点击智能群助手。
添加机器人。
选择自定义。
名字随意。下面的安全设置有三种,主要是防止被别人控制。
第一个自定义关键字是说你在以后发送的文字中必须要有这个关键字,否则发送不成功。加签是一种特殊的加密方式,在开发文档中有,先不讲。
IP地址就是说你在发送时会获取你的IP地址,如果不匹配就发送不成功。这个加密的方式可以自己选择,我们选择加签。如果你想使用IP的话,可以访问https://ip.cn/。
我们看一看安全设置旁边的说明文档。
往下划一点,找到Python。因为我们先使用Python制作。
复制这段代码:
import time
import hmac
import hashlib
import base64
import urllib.parse
timestamp = str(round(time.time() * 1000))
secret = 'this is secret'
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_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)
有一点复杂,不过这才叫加密呀。
我们回到钉钉APP,选中加签,然后“阅读”一下免责条款,点击继续。
复制一下这段网址。然后顺一下我们的思路。
首先,我们要使用爬虫访问这段网址(注意:要使用POST而不是GET。于这两个可以看https://cnblogs.com),然后传一下JSON数据,就可以发送信息了。
我们先定义一个函数,叫做pwd,它用于加签。钉钉的开发文档中是这样写的“把timestamp和第一步得到的签名值拼接到URL中。例https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX”,这里面的timestamp和签名值是加密输出的值,就是最后两个print里面的值。我们在函数pwd中先计算,然后返回拼接的URL。
dingtalk_robot.py
import time
import hmac
import hashlib
import base64
import urllib.parse
def pwd():
timestamp = str(round(time.time() * 1000))
secret = 'this is secret'
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_plus(base64.b64encode(hmac_code))
return "https://oapi.dingtalk.com/robot/send?access_token" \
"=c5b73c1dd2a7d506e80038344eff5812f713c3b7ac17a0200a23e6fcb2d1dcb4"+"×tamp={0}&sign={1}".format(timestamp, sign)
为了遵循PEP8,我们将所有导入都放到了最前面。这没有丝毫影响。
尝试调用一下。
terminal -- python 3.8.1
>>> import dingtalk_robot
>>> dingtalk_robot.pwd()
'https://oapi.dingtalk.com/robot/send?access_token=c5b73c1dd2a7d506e80038344eff5812f713c3b7ac17a0200a23e6fcb2d1dcb4×tamp=1588136544177&sign=bH6X1O2YHwI42cld%2B6M7QC%2BrFrdPowlfCQ4jw5Aa%2FCA%3D'
>>>
运行正常,然后我们尝试访问这个网址。
正常访问,但由于浏览器默认使用GET请求,所以还是不要用浏览器了。
首先,新建一个名为send的函数。导入requests库。
dingtalk_robot.py
import time
im