python监控视频图像识别人物-自动发送钉钉-附源码
涉及到的点
- 钉钉消息自动发送;
- 监控图片上传阿里云OSS;
- 监控视频图像识别;
使用python读取监控视频流,每秒截图一帧进行图像识别,识别出人物的图像进行保存并上传阿里云OSS,将图像URL通过钉钉机器人发送到钉钉群
钉钉
自定义机器人接入
步骤一:获取自定义机器人webhook
- 打开机器人管理页面。以PC端为例,打开PC端钉钉,点击头像,选择机器人管理
- 在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像,*勾选 “加签” *
- 完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成
- 加签:
i. 把timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。
参数 | 说明 |
---|---|
timestamp | 当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时。 |
secret | 密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串。 |
签名计算代码示例(Python)
#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)
ii. 把 timestamp和第一步得到的签名值拼接到URL中
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX
参数 | 说明 |
---|---|
timestamp | 第一步使用到的时间戳。 |
sign | 第一步得到的签名值。 |
-
完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX
注意 请保管好此Webhook 地址,不要公布在外部网站上,泄露后有安全风险
步骤二:使用自定义机器人
获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息.
注意
- 发起POST请求时,必须将字符集编码设置成UTF-8。
- 每个机器人每分钟最多发送20条。消息发送太频繁会严重影响群成员的使用体验,大量发消息的场景 (譬如系统监控报警)可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里
当前自定义机器人支持文本 (text)、链接 (link)、markdown(markdown)、ActionCard、FeedCard消息类型,请根据自己的使用场景选择合适的消息类型,达到最好的展示样式。
自定义机器人发送消息时,可以通过手机号码指定“被@人列表”。在“被@人列表”里面的人员收到该消息时,会有@消息提醒。免打扰会话仍然通知提醒,首屏出现“有人@你”。
步骤三:测试自定义机器人
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"msgtype": "text","text": {"content": "我就是我, 是不一样的烟火"}}'
钉钉部分源码
def sendmgs2ding(objectname):
#print (objectname)
def ding_sign():
timestamp = str(round(time.time() * 1000))
secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx'
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)
return timestamp,sign
ding_sign = ding_sign()
get_timestamp = ding_sign[0]
get_sign = ding_sign[1]
ss = requests.session()
baseurl = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxx"
paramsurl = "×tamp="+str(get_timestamp)+"&sign="+str(get_sign)
uurl = baseurl+paramsurl
baseheaders = {
'Content-Type': 'application/json'
}
baseparams = {
'timestamp': get_timestamp,
'sign': get_sign
}
basedata = {
"msgtype": "markdown",
"markdown": {
"title": "视频监控告警",
"text": "#### 视频监控告警 \n> 视频监控检测到人物 \n>"
"![screenshot]("+objectname+")\n>"
},
"at": {
"atMobiles": [
"136xxxxx"
],
"isAtAll": "false"
}
}
response = ss.post(uurl,headers=baseheaders,data=json.dumps(basedata))
print (response.status_code)
#print (response.url)
print (response.text)
if response.status_code == 200:
response = response.json()
https://developers.dingtalk.com/document/app/custom-robot-access
阿里云OSS
OSS文件上传
上传本地文件
OSS将本地文件视为文件对象(File Object),上传时必须以二进制方式打开(如rb模式),示例代码如下:
# -*- coding: utf-8 -*-
import oss2
# 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州为例,其它Region请按实际情况填写。
bucket