本站改版新增arduino频道
准备用ESP32-S3做个监控设备,监测未接入环动设备的运行情况,当设备出现问题可以通过企业微信机器人和钉钉群机器人报警。
micropython做钉钉群 机器人的时候出现了问题,钉钉机器人安全设置为“加密”,官方给的DEMO中使用的python库在micropython中都没有,网上找了一圈也没找到micropython能用的钉钉机器人代码。
安全设置如果是关键词或IP地址应该跟微信机器人一样比较简单,但这个机器人已经在很多设备上运行很久了,不想修改以前的代码,只能继续研究micro python。
研究了两天,终于弄出一个micropython能用的钉钉群机器人代码。
import urequests as requests
import json
def sendDingTalkMsg(msgAlert):
import time
import uhashlib
import ubinascii
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=3ae63bd51de7053486b32d4e2d2eeb176e4f52b8798fdbd680e4be61f78cec87'
secret_key = 'SEC1306372b3167575940247b5fdc840fabda0fe28408b0e8c8dd232d29c70f2e9e'
timestamp = str(round((time.time() + 946656000) * 1000))
def hmac_sha256(key, message):
block_size = 64
if len(key) > block_size:
key = uhashlib.sha256(key).digest()
if len(key) < block_size:
key = key + b'\x00' * (block_size - len(key))
o_key_pad = bytearray([0x5c ^ b for b in key])
i_key_pad = bytearray([0x36 ^ b for b in key])
inner = uhashlib.sha256(i_key_pad + message).digest()
hmac_code = uhashlib.sha256(o_key_pad + inner).digest()
return hmac_code
def get_Hmac():
secret_enc = secret_key.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret_key)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac_sha256(secret_enc, string_to_sign_enc)
return hmac_code
def is_alnum(char):
return ('0' <= char <= '9') or ('a' <= char <= 'z') or ('A' <= char <= 'Z')
def url_encode(s):
result = []
for char in s:
if is_alnum(char) or char in '-_.~':
result.append(char)
elif char == ' ':
result.append('+')
else:
result.append('%{:02X}'.format(ord(char)))
return ''.join(result)
hmac = get_Hmac()
base64_data = ubinascii.b2a_base64(hmac)
base64_data = base64_data.decode('utf-8')
sign = url_encode(base64_data)
if sign.endswith("%0A"):
sign=sign.rstrip('%0A')
signed_webhook = '{}×tamp={}&sign={}'.format(webhook, timestamp, sign)
headers = {'content-type': "application/json"}
body = {
"msgtype":"text",
"at":{
"isAtAll":"true"
},
"text": {
"content":msgAlert
}
}
d = json.dumps(body)
response = requests.post(signed_webhook, data = d.encode("utf-8"), headers = headers)
if response.status_code == 200 and response.json().get('errcode') == 0:
print("钉钉发送成功")
else:
print("钉钉发送失败",response.text)
Copyright © 2014 ESP56.com All Rights Reserved
晋ICP备14006235号-22 晋公网安备14108102001165号
执行时间: 0.0095601081848145 seconds