最近想利用家门口的萤石云摄像头做一个智能门铃,当有人按下门铃的时候通过RTSP获取摄像头数据并生成一张图片,然后自动推送到微信。其实所有流程都已经完成了,图片也成功推送到微信,但是有个坑,就是默认情况下萤石云会加密视频流,导致无法通过RTSP获取视频流,一开始我是通过萤石云APP手动关闭视频加密的,开始没想到过两天视频加密又自动打开了!翻阅了百度和google几十页,没找到想要的结果,郁闷了几天......然后我登录萤石云开放平台,翻阅了开发文档,发现可以通过http post来关闭视频加密,于是立马用Python写了一个脚本。脚本具体逻辑如下:
1、读取存在磁盘上的json,获取请求报文
2、发起http请求,关闭视频加密
3、判断返回码,如果返回accessToken异常或过期,则首先获取accessToken
4、发起http请求,利用appKey和appSecret获取accessToken
5、使用新的accessToken关闭视频加密
6、保存新的请求报文
由于使用这个方法还是会自动关闭,所以在获取视频流前先运行这段代码,这样就可以保证关闭视频加密了。具体代码如下:
closeCoder.py
import requests
import json
#功能:关闭萤石云视频加密
#萤石云开发文档 https://open.ys7.com/doc/zh/book/index/user.html
#读取json文件,获得请求内容
filename = "cancel.json"
with open(filename) as file_obj:
datas = json.load(file_obj)
print(datas)
#发起请求
r = requests.post("https://open.ys7.com/api/lapp/device/encrypt/off", data=datas)
print(r.text)
#数据转换成json
codeJson = r.json()
#获取返回码
code = codeJson['code']
#如果返回码为'10002'(accessToken异常或过期),则重新获取accessToken,重新请求关闭视频加密,并且保存请求内容
if code == '10002':
#根据appKey和appSecret获取accessToken
datas = {'appKey': '你的appKey','appSecret':'你的appSecret'}
r = requests.post("https://open.ys7.com/api/lapp/token/get", data=datas)
keyJson = r.json()
data = keyJson['data']
#提取accessToken
accessToken = data['accessToken']
datas = {'deviceSerial':'你的摄像头序列号','validateCode':'你的摄像头加密码'}
datas['accessToken'] = accessToken
#重新请求关闭视频加密
r = requests.post("https://open.ys7.com/api/lapp/device/encrypt/off", data=datas)
#保存请求内容
with open(filename, 'w') as file_obj:
json.dump(datas, file_obj)
print(r.text)
cancel.json内容如下:
{"deviceSerial": "你的摄像头序列号", "validateCode": "你的视频加密码", "accessToken": "你的accessToken"}
当然,以上操作前提是首先去萤石云开放平台,使用你登录萤石云视频APP的帐号登录,获取你的摄像头序列号,并且创建一个应用获取你的appKey、appSecret,至于摄像头加密码如果你没修改过的话应该就是贴在你的摄像头上的那个。