(目前还是新手,程序难免有废话代码,请大家耐心看__比心)
第一步:创建群聊机器人,参考官方手册
官方链接:自定义机器人的创建和安装 - 钉钉开放平台
此步骤可以得到两个关键参数:
Webhook(机器人的通信网址):https://oapi.dingtalk.com/robot/send?############(如这样)
secret(加签未解密密钥):SECe2######################30 #密钥,机器人安全设置页面,加签一栏下面显示的SECe开头的字符串。
第二步:计算时间戳,解算secret密钥
这里也使用官方提供的代码(我自己加了些备注)
此步骤可以得到两个关键参数,并合成最终的webhook(带时间戳和密钥的机器人的通信网址):
timestamp(时间戳)
sign(解密后的密钥)
webhook(机器人的通信网址)
#python 3.8
#导入依赖库
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) #显示解密过的密钥(如需要查看请删除#号)
webhook = "{}×tamp={}&sign={}".format(webhook,timestamp,sign) #{}分别代表{通讯网址}和{时间戳}和{密钥}
第三步:编码交互内容
在content中输入文本内容即可
headers = {'Content-Type': 'application/json;charset=utf-8'}
data = {
"msgtype": "text",
"text": {
"content": "需要发送至群中的内容"
},
"at": {
"isAtAll": True #是否@所有人,True是,False否
}
}
resp = requests.post(webhook,
data=json.dumps(data).encode("utf-8"),
headers=headers,
)
print (resp.json())
完整代码展示(这部分内容是根据我自己的需求加入了交互部分)
#字符提示:
#qm是输入的群名
#my是每个群加签的密钥
#wz网址是每个机器人的后台网址
#nr是发到群中的文字内容
#sy是否需要at所有人
#导入依赖库
import requests,json
#签名计算依赖的库
import time,hmac,hashlib,base64,urllib.parse
#给操作者的提示
print("提示:\"此操作小程序,目前仅支持联动一群、二群、和测试群,请悉知\"\n\n")
qm = input("第一步:###请您选择要发通知的群号###\n\n群名包含一下内容(输入时不用加引号):\n\n\"1:一群\" \"2:二群\" \"3:测试群\"\n请输入群号:")
print("")
if qm == "1" or qm == "2" or qm == "3":
if qm == "1":
my = "此处输入一群的未解密密钥"
wz = "此处输入一群的网址"
if qm == "2":
my = "此处输入二群的未解密密钥"
wz = "此处输入二群的网"
if qm == "3":
my = "此处输入测试群的未解密密钥"
wz = "此处输入测试群的网址"
else:
print("输入错误,程序结束")
exit()
#先将密钥解析得到时间戳(timestamp)以及签名值(sign)
timestamp = str(round(time.time() * 1000))
secret = my
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))
webhook = "{}×tamp={}&sign={}".format(wz,timestamp,sign) #{}分别代表wz和my
nr = input("第二步:###输入文本内容###\n①此输入的内容会直接发至群中,建议现在测试群测试。\n②文本内容如需换行请在段尾输入\"\ n\"中间无空格。\n\n")
nr = "\"" + nr + "\""
sy = input("第三步:###是否需要@所有人?### 1:是 2:否\n")
if sy == "1":
sy = "True"
elif sy == "2":
sy = "Flase"
headers = {'Content-Type': 'application/json;charset=utf-8'}
data = {
"msgtype": "text",
"text": {
"content": eval(nr) #eval()计算在字符串中的有效Python表达式,并返回一个对象
},
"at": {
"isAtAll": sy
}
}
resp = requests.post(webhook,
data=json.dumps(data).encode("utf-8"),
headers=headers,
)
print (resp.json())