Files
HAS-SL100_Api/API_Keys.py
2025-10-31 07:58:07 +00:00

1706 lines
78 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
from email.header import Header
import unittest
import requests
import websockets
import asyncio
import datetime
import json
from datetime import datetime
import serial
from hashlib import sha256
import json
from fengzhuang import cks
import random
from email.header import Header
import unittest
import requests
import hmac
import hashlib
import hashlib
import base64
import urllib.parse
import time
import hmac
import base64
import hashlib
import hmac
import hashlib
import hashlib
import base64
import urllib.parse
import time
import hmac
import base64
import serial
import hashlib
from serial.win32 import GetCommTimeouts
timess = GetCommTimeouts
from hashlib import sha256
# from jiekou.接口1.login import response, str_sign
timestamp = str(int(time.time()))
uuid = "44c12d6471794f6fb712b7ceee128e83"
url = "http://api.hassecurity.cn"
class apis:
def __init__(self):
timestamp = str(int(time.time()))
self.login_url = url+"/v1/user/login"
self.getusers_url = url+"/v1/user/info"
self.resetSend_url = url+"/v1/user/resetSend"
self.resetpwd_url = url+"/v1/user/reset"
self.putAvatar_url = url+"/v1/user/putAvatar"
self.updatePwd_url = url+"/v1/user/updatePwd"
self.updateInfo_url= url+"/v1/user/updateInfo"
self.deletet_url = url+"/v1/device/remove"
self.putClient_url = url+"/v1/user/putClient"
self.bind_url = url+"/v1/device/bind"
self.upgradedVersion_url = url+"/v1/device/upgradedVersion"
self.models_url = url+"/v1/device/models"
self.newList_url = url+"/v1/device/newList"
self.UpdateName_url = url+"/v1/device/upName"
self.evenlist_url = url+"/v1/event/list"
self.eventread_url = url+"/v1/event/read"
self.evendelete_url = url+"/v1/event/delete"
self.eventunreadNum_url = url+"/v1/event/unreadNum"
self.time_url = url+"/time"
self.getUrl_url = url+"/getUrl"
self.homeCreate_url = url+"/v1/device/homeCreate"
self.homeslist_url = url+"/v1/device/homes"
self.homeUpdate_url = url+"/v1/device/homeUpdate"
self.homeChange_url = url+"/v1/device/homeChange"
self.homeDevices_url = url+"/v1/device/homeDevices"
self.homeUsers_url = url+"/v1/device/homeUsers"
self.homeShare_url = url+"/v1/device/homeShare"
#分享家庭后需要去调用获取消息列表拿msg_id传入到用户反馈分享结果
self.messagelist_url = url+"/v1/message/list"
self.homeShareFeedback_url = url+"/v1/device/homeShareFeedback"
self.homeShareRemove_url = url+"/v1/device/homeShareRemove"
self.homeAddDevice_url = url+"/v1/device/homeAddDevice"
self.homeDelete_url = "http://api.hassecurity.cn/v1/device/homeDelete"
self.cloudToken_url = url+"/v1/cloud/getToken"
self.cloudFiles_url = url+"/v1/cloud/files"
self.cloudputToken_url = url+"/v1/cloud/putToken"#设备获取文件上报token
self.cloudputFile_url = url+"/v1/cloud/putFile"
# self.cloudputToken_url = "http://api.hassecurity.cn/v1/cloud/putFile"
self.messageread_url = url+"/v1/message/read"
self.messageunreaNum_url = url+"/v1/message/unreadNum"
self.messagedelete_url = url+"/v1/message/delete"
self.deviceshare_url = url+"/v1/device/share"
self.deviceshareRecords_url = url+"/v1/device/shareRecords"
self.deviceshareFeedback_url = url+"/v1/device/shareFeedback"
self.deviceshareDelete_url = url+"/v1/device/shareDelete"
self.feedbackcreate_url = url+"/v1/feedback/create"
self.feedbacklist_url = url+"/v1/feedback/list"
self.feedbackinfo_url = url+"/v1/feedback/info"
self.feedbacksend_url = url+"/v1/feedback/send"
self.leavewordlist_url = url+"/v1/leaveword/list"
self.leavewordunreadNumber_url = url+"/v1/leaveword/unreadNumber"
self.leavewordread_url = url+"/v1/leaveword/read"
self.leaveworddeviceList_url = url+"/v1/leaveword/deviceList"#设备获取留言列表
self.leaveworddeviceUnreadNumber_url = url+"/v1/leaveword/deviceUnreadNumber"
self.leaveworddeviceRead_url = url+"/v1/leaveword/deviceRead"
self.devicereset_url = url+"/v1/device/reset"
self.bindmac_url = "http://admin.hassecurity.cn/v1/getUuid"#传mac
self.activate_url = "http://admin.hassecurity.cn/v1/confirm"#传mac uuid
self.devicegetAllUser_url = url+"/v1/device/getAllUser"
self.deviceputAllUser_url = url+"/v1/device/putAllUser"
self.devicelogin_url = url+"/v1/device/login"
# 关联的字典
self.relations = {}
#sign加密
def __get__relations(self, params=''):
"""
获取关联后的字符串
约定,如果要使用关联的变量,形式为{paramname}
:param s: 需要关联的字符串
:return: 返回关联后的字符串
"""
if params is None or params == '':
return None
for key_value in self.relations.keys():
params = params.replace('{' + key_value + '}', str(self.relations[key_value]))
return params
def randoms(self, value):
str = "ABCDEFGHIJKLMNOPQRSTabcdefglijklmnopqr1234567890"
params = ''.join(__import__('random').choice(str) for i in range(value))
print(params)
# self.relations['randoms'] = params
# print(self.relations['randoms'])
return params
def randomChinese(self, value):
str = "中文测试四五六七八九十"
params = ''.join(__import__('random').choice(str) for i in range(value))
print(params)
# self.relations['randomChinese'] = params
# print(self.relations['randomChinese'])
return params
def randomspecial(self, value):
str = "!@#$&*带中文字符"
params = ''.join(__import__('random').choice(str) for i in range(value))
print(params)
# self.relations['randomspecial'] = params
# print(self.relations['randomspecial'])
return params
def randomnumber(self):
return random.choice([1, 2,3,4,5,6,7,8,9,10,11,12])
# def assertss(self,code,masg,printok):
# try:
# assert response["code"] == code
# assert response["msg"] == masg
# print(printok,"接口正常",response)
# except:
# print(printok,"接口异常",response)
def replace_plus_in_query(self,query_string):
# 使用urllib.parse.quote_plus编码查询字符串
encoded_query = urllib.parse.quote_plus(query_string)
# 替换所有的'+'为其他字符,例如空格' '或者'-'等
replaced_query = encoded_query.replace('+', ' ') # 例如,将'+'替换为空格
return replaced_query
def get_hmac_sha256(self,message, secret):
"""
生成HMAC-SHA256签名
:param message: 待加密的源字符串
:param secret: 密钥
:return: Base64编码后的签名
"""
message = message.encode('utf-8') # 字符串转字节
secret = secret.encode('utf-8') # 密钥转字节
# HMAC-SHA256加密
signature = hmac.new(secret, message, digestmod=hashlib.sha256).hexdigest()
# Base64编码并返回字符串
return base64.b64encode(signature.encode()).decode()
#get请求拼接sign,带token
def get_sign(self):
str_sign = ("GET" + "&" + self.relations['access_token'] + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" +
"bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&")
# print(str_sign)
return str_sign
def delete_sign(self,data):
str_sign = "DELETE" + "&" + self.relations['access_token'] +"IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted((data).items())).replace("+", " ")
return str_sign
def get_signs(self, data):
str_sign = "GET" + "&" + self.relations['access_token'] +"IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted((data).items())).replace("+", " ")
return str_sign
# def post_sign(self,data):
# str_sign = "POST" + "&" + self.relations['access_token'] +"IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
# sorted((data).items())).replace("+", " ")
# return str_sign
import urllib.parse
def post_sign(self, data):
# 1. 构造基础签名部分(保持原样)
base_str = (
"POST" + "&" + self.relations['access_token'] +
"IOS_1.0.30" + "994f9d2e0c5ad0f3" +
"b6e91dfb8defa381cb1c3eda4e5235f0" +
"bbf91e0d-d397-4775-8296-25c99e5f7403" +
str(timestamp) + "&"
)
# 2. 对参数差异化编码
encoded_params = []
for key, value in sorted(data.items()):
# 关键点:对值进行定制化编码
encoded_value = self._encode_special_chars(str(value))
encoded_pair = f"{key}={encoded_value}"
encoded_params.append(encoded_pair)
# 3. 拼接参数(不强制替换 +,除非服务端要求)
param_str = "&".join(encoded_params)
return base_str + param_str
def _encode_special_chars(self, s):
"""差异化编码特殊字符"""
# 定义不需要编码的字符(根据服务端要求调整)
SAFE_CHARS = "-_.~#@!$&*()" # 例如允许 #、!、$、& 不编码
encoded = []
for char in s:
if char.isalnum() or char in SAFE_CHARS:
encoded.append(char)
else:
encoded.append(urllib.parse.quote(char))
return "".join(encoded)
def bind_mac_sign(self,data,value):
str_sign = value + "&" + "1" + "TEST_SL100_20240801" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "TEST" + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ").replace("%20", ":")
return str_sign
def get_params(self, data):
"""对应Postman的GetParams()函数处理GET参数或POST Body"""
if not data:
return ""
# 对参数排序对应sortedKeys
sorted_items = sorted(data.items())
# 拼接key=value&格式(对应循环处理逻辑)
param_str = ""
for key, value in sorted_items:
# 对应escape()编码Python用urllib.parse.quote
encoded_value = urllib.parse.quote(str(value), safe='').replace("+", "%20")
param_str += f"{key}={encoded_value}&"
# 去除最后一个&对应slice(0, -1)
return param_str.rstrip('&')
def post_signsss(self,data):#data body
str_sign = "POST" + "&" + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ")
return str_sign
#设备
def postdevice_sion(self,data):
str_sign = "POST" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + uuid + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ").replace("%3A", ":")
return str_sign
return str_sign
#带参数
def getdevice_sion(self,data):
str_sign = "GET" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + uuid + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ").replace("%3A", ":")
return str_sign
#不带参数
def getdevice_sionNOdata(self):
str_sign = "GET" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + uuid + "&"
return str_sign
#post不带参数
def postdevice_sionNOdata(self):
str_sign = "GET" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + uuid + "&"
return str_sign
'带uid uid放的顺序也很重要' '设备云存储'
def getdevice_sionuuid(self):
str_sign = "GET" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "7e1558dff183cd08" + uuid +"&"
return str_sign
def postdevice_sionsuuid(self,data):
str_sign = "POST" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "7e1558dff183cd08" + uuid + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ").replace("%3A", ":")
return str_sign
'post带deta' '设备云存储'
def postdevice_sionuuid(self, data):
"""优化签名生成,严格遵循编码规范"""
# 构建基础前缀与GET完全一致
"uuid替换了"
# prefix = "POST&SL100bbf91e0d-d397-4775-8296-25c99e5f7403{}{}576ad09e31e148f68180c985f5eea989&".format(
# timestamp, "7e1558dff183cd08"
# )
prefix = "POST&SL100bbf91e0d-d397-4775-8296-25c99e5f7403{}{}{}&".format(
timestamp, "7e1558dff183cd08",uuid
)
# 处理参数:排序+编码(移除不必要的替换)
sorted_params = sorted(data.items())
encoded_params = urllib.parse.urlencode(sorted_params)
# 拼接完整签名
str_sign = prefix + encoded_params
return str_sign
def postdevice_sionuuids(self, data):
# 1. 将嵌套data转为JSON字符串注意服务端需支持此格式
data_str = json.dumps(data, separators=(',', ':')) # 去除空格,压缩格式
# 2. 对JSON字符串进行urlencode编码而非直接对字典编码
encoded_data = urllib.parse.quote(data_str, safe='') # safe='' 表示编码所有特殊字符
# 3. 构造正确前缀参考步骤1修复后的顺序
prefix = "POST&SL100&bbf91e0d-d397-4775-8296-25c99e5f7403&{}&{}&{}&".format(
timestamp, "7e1558dff183cd08", uuid
)
# 4. 拼接签名(前缀 + 编码后的参数)
str_sign = prefix + encoded_data
return str_sign
#云存获取设备 带了uid
def device_sions(self,data):
base_sign = (
"POST" + "&" +
"SL100" + "&" +
"bbf91e0d-d397-4775-8296-25c99e5f7403" + "&" +
str(timestamp) + "&" +
uuid+
# "576ad09e31e148f68180c985f5eea989"
"7e1558dff183cd08"
)
# 如果有参数则添加参数部分
if data:
param_str = "&" + urllib.parse.urlencode(sorted(data.items())).replace("+", " ").replace("%3A", ":")
return base_sign + param_str
return base_sign
def webtoken(self):
login_Headers = {
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
"access_token": self.relations['access_token']
}
return login_Headers
def asserts(self,assertss,code,value,value1):
if assertss['code'] == code or assertss['msg'] == 'ok':
print(value,assertss)
else:
print(value1,assertss)
def assertsmsg(self,assertss,code,value,value1,msg):
if assertss['code'] == code and assertss['msg'] == msg:
print(value,assertss)
else:
print(value1,assertss)
def gethttpheaders(self, value):
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(value, "c5ca86260e08e561996e5960dc93d2f0"),
'Content-Type': 'application/json',
"access_token": self.relations['access_token']
}
return login_Headers
#设备
def deviceheaders(self, value):
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'timestamp': timestamp,
'sign': self.get_hmac_sha256(value, "a94f6fe623ce98720825198e9b57c4d7"),
'Content-Type': 'application/json',
'uuid': uuid,
'model': 'SL100',
'uid' : '7e1558dff183cd08'
}
return login_Headers
def getdeviceheaders(self, value):
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'timestamp': timestamp,
'sign': self.get_hmac_sha256(value, "a94f6fe623ce98720825198e9b57c4d7"),
'Content-Type': 'application/json',
'uuid': uuid,
'model': 'SL100'
}
return login_Headers
def bandmacheaders(self,value):
timestamp = str(int(time.time()))
login_Headers = {
'factory_id':'TEST',
'label':'TEST_SL100_20240801',
'batch':"1",
'model':'SL100',
'timestamp': timestamp,
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'sign': self.get_hmac_sha256(value,"rCeOzwisLFLasvlt"),
'Content-Type' : 'application/json'
}
return login_Headers
#delete
def DELTEThttpheaders(self, value):
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(value, "c5ca86260e08e561996e5960dc93d2f0"),
"access_token": self.relations['access_token']
}
return login_Headers
# http请求头
def httpheaders(self,value):
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(value, "c5ca86260e08e561996e5960dc93d2f0"),
'Content-Type': 'application/json'
}
return login_Headers
#登录子账号(分享账号)
def uesrlog_share(self):
data = {
"username": "15814087116",
"type": "password",
"password": "10d50a1e43a718a9c31bc450a0985131",
"phone_brand": "XiaoMi 14",
"code": "767092"
}
#
str_sign = "POST" + "&" + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ")
# self.post_sign(data)
# print(str_sign)
# 带密钥KEY 通过sha256加密之后base64
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(str_sign, "c5ca86260e08e561996e5960dc93d2f0"),
'Content-Type': 'application/json'
}
# print(login_Headers)
response = requests.post(url=self.login_url, headers=login_Headers, data=json.dumps(data)).json()
# print("用户登录",response)
access_token = response["data"]["access_token"]
self.relations['access_token'] = access_token
# print('------------------------------',self.relations)
try:
assert response["code"] == 1000
assert response["msg"] == "ok"
# print("用户登陆成功",response)
except Exception as e:
pass
# print("用户登录失败",response)
return access_token
#登录获取token
def uesrlog(self):
data = {
"username": "18875374973",
"type": "password",
"password": "10d50a1e43a718a9c31bc450a0985131",
"phone_brand": "XiaoMi 14",
"code": "767092"
}
#
str_sign = "POST" + "&" + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ")
# self.post_sign(data)
# print(str_sign)
# 带密钥KEY 通过sha256加密之后base64
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(str_sign, "c5ca86260e08e561996e5960dc93d2f0"),
'Content-Type': 'application/json'
}
# print(login_Headers)
response = requests.post(url=self.login_url, headers=login_Headers, data=json.dumps(data)).json()
# print("用户登录",response)
access_token = response["data"]["access_token"]
self.relations['access_token'] = access_token
# print('------------------------------',self.relations)
try:
assert response["code"] == 1000
assert response["msg"] == "ok"
print("用户登陆成功",response)
except Exception as e:
print("用户登录失败",response)
return access_token
def uesrlogerror(self):
'未注册账号登录'
data = {
"username": "18875374974",
"type": "password",
"password": "10d50a1e43a718a9c31bc450a0985131",
"phone_brand": "XiaoMi 14",
"code": "767092"
}
response = requests.post(url=self.login_url,headers=self.httpheaders(self.post_signsss(data)),data=json.dumps(data)).json()
asserts = response
# if asserts["code"] == 1100 and asserts["msg"] == "invalid username or password":
# print("未注册账号登录失败,接口正常",response)
# else:
# print("未注册账号登录失败,接口正常",response)
self.asserts(asserts,1000,"未注册账号登录成功,接口异常","未注册账号登录失败,接口正常")
# try:
# assert response["code"] == 1100
# assert response["msg"] == "ok"
# print("未注册账号登录成功",response)
# except Exception as e:
# print("未注册账号登录失败",response)
# #
def getlog(self):
'获取用户信息'
str_sign = ("GET" + "&" + self.relations['access_token'] + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" +
"bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&")
# print("第二个",str_sign)
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(str_sign, "c5ca86260e08e561996e5960dc93d2f0"),
'Content-Type': 'application/json',
"access_token": self.relations['access_token']
}
response = requests.get(url=self.getusers_url, headers=login_Headers)
print("获取用户信息",response.text)
#错误密码
def pwdsuser(self,value):
'错误密码'
data = {
"username": "18875374973",
"type": "password",
"password": "10d50a1e43a718a9c31bc450a0985132",
"phone_brand": "XiaoMi 14",
"code": "767092"
}
str_sign = "POST" + "&" + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ")
# print(str_sign)
# 带密钥KEY 通过sha256加密之后base64
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'phone_code': 'b6e91dfb8defa381cb1c3eda4e5235f0',
'timestamp': timestamp,
'app_version': 'IOS_1.0.30',
'sign': self.get_hmac_sha256(str_sign, "c5ca86260e08e561996e5960dc93d2f0"),
'Content-Type': 'application/json'
}
# print(login_Headers)
response = requests.post(self.login_url, headers=login_Headers, data=json.dumps(data)).json()
# print("错误密码",response)
try:
assert response["code"] == 1100
# assert response["msg"] == "ok"
print("错误密码登录失败接口返回正常",response)
except:
print("错误密码登录成功返回异常",response)
#
def resetSend(self):
'发送忘记密码验证码'
data = {
"username": "18875374973",
"type": "password",
"password": "10d50a1e43a718a9c31bc450a0985131",
}
str_sign = "POST" + "&" + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ")
response = requests.post(self.resetSend_url, headers=self.httpheaders(str_sign), data=json.dumps(data)).json()
print("发送忘记密码验证码",response)
# #忘记密码
# def resetpwd(self):
# data = {
# "username": "18875374973",
# "code":"",
# "password": "10d50a1e43a718a9c31bc450a0985131",
# }
#
# str_sign = "POST" + "&" + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
# sorted(data.items())).replace("+", " ")
# str_sign = "GET" + "&" + self.relations[
# 'access_token'] + "IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&"
# response = requests.post()
#获取用户头像上传地址
def putAvatar(self):
#调用get拼接sign 然后headers传入get_sign
# self.get_sign()
response = requests.get(url=self.putAvatar_url,headers=self.gethttpheaders(self.get_sign()))
print('获取用户头像地址',response.json())
def UpdatePwd(self):
'修改密码'
data={
"new_password":"10d50a1e43a718a9c31bc450a0985131"
}
# str_sign = "POST" + "&" + self.relations['access_token'] +"IOS_1.0.30" + "994f9d2e0c5ad0f3" + "b6e91dfb8defa381cb1c3eda4e5235f0" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "&" + urllib.parse.urlencode(
# sorted(data.items())).replace("+", " ")
response = requests.post(url=self.updatePwd_url, headers=self.gethttpheaders(self.post_sign(data)), data=json.dumps(data)).json()
# print("修改密码",response)
try:
assert response["code"] == 1000
assert response["msg"] == "ok"
print("修改密码接口正常",response)
except:
print("修改密码接口异常",response)
# print("头文件",self.gethttpheaders(self.get_sign()))
#修改昵称--------------
def updateInfo(self):
data={
"nickname":"123"
}
response = requests.post(url=self.updateInfo_url, headers=self.gethttpheaders(self.post_sign(data)), data=json.dumps(data)).json()
# print("修改昵称",response)
# self.assertss(1000,"ok","修改昵称")
try:
assert response["code"] == 1000
assert response["msg"] == "ok"
print("修改昵称接口正常",response)
except:
print("修改昵称接口异常",response)
# assert response.json.post('code')==1000
def updateInfomax(self):
'''修改昵称--30字符'''
data={
"nickname":self.randoms(30)
}
response = requests.post(url=self.updateInfo_url, headers=self.gethttpheaders(self.post_sign(data)), data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,5000,"修改昵称--30字符接口正常","修改昵称--30字符接口异常")
def updateInfomin(self):
'''修改昵称--1字符'''
data={
"nickname":self.randoms(1)
}
response = requests.post(url=self.updateInfo_url, headers=self.gethttpheaders(self.post_sign(data)), data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"修改昵称--1字符接口正常","修改昵称--1字符接口异常")
def updateInfoSpecial_symbols(self):
'''修改昵称--特殊字符'''
data={
"nickname":self.randomspecial(5)
}
response = requests.post(url=self.updateInfo_url, headers=self.gethttpheaders(self.post_sign(data)), data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"修改昵称--特殊符号接口正常","修改昵称--特殊符号接口异常")
def updateInfoSpecial_Chinese(self):
'''修改昵称--特殊字符'''
data={
"nickname":self.randomChinese(5)
}
response = requests.post(url=self.updateInfo_url, headers=self.gethttpheaders(self.post_sign(data)), data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"修改昵称--中文接口正常","修改昵称--中文接口异常")
def putClient(self):
'上报登录设备信息'
data = {
"push_type":2,
"push_token":"cbc16bcc7a47203727415cb2ca339147",
"zone":"-8.00"
}
response = requests.post(url=self.putClient_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
# print('',response)
try:
assert response["code"] == 1000
assert response["msg"] == "ok"
print("上报设备登录信息接口返回正常",response)
except Exception as e:
print("上报设备登录信息接口返回异常",response)
#-------------------------------------------------------------------设备绑定-------------------------------------------------------------------
def bind(self,code,value,value1,data,msg):
'设备绑定'
data = {
"uid": "7e1558dff183cd08",#主账号
# "uid": "d500a9738331eeb9", #295账号
# "mac": "b8:a9:af:01:74:27",
"mac": data,
"zone": "8.00",
"version": "1.00.43"
}
str_sign = "POST" + "&" + "SL100" + "bbf91e0d-d397-4775-8296-25c99e5f7403" + timestamp + "44c12d6471794f6fb712b7ceee128e83" + "&" + urllib.parse.urlencode(
sorted(data.items())).replace("+", " ").replace("%3A", ":")
login_Headers = {
'appid': '994f9d2e0c5ad0f3',
'request_id': 'bbf91e0d-d397-4775-8296-25c99e5f7403',
'timestamp': timestamp,
'sign': self.get_hmac_sha256(str_sign, "a94f6fe623ce98720825198e9b57c4d7"),
'Content-Type': 'application/json',
# 'uuid': 'f3d7ad96ed424b15a5c27e7cdb1015fd',
'uuid':'44c12d6471794f6fb712b7ceee128e83',
'model': 'SL100'
}
response = requests.post(url=self.bind_url,headers=login_Headers,data=json.dumps(data)).json()
# print('绑定',response)
asserts = response
self.assertsmsg(asserts,code,value,value1,msg)
return asserts
def deletedevices(self):
'删除设备'
params = {
"uuid": "f3d7ad96ed424b15a5c27e7cdb1015fd"
# "uuid": "576ad09e31e148f68180c985f5eea989"
}
response = requests.delete(url=self.deletet_url, headers=self.DELTEThttpheaders(self.delete_sign(params)),
params=params)
asserts = response.json()
self.asserts(asserts,1000,"设备删除成功,删除接口正常","设备删除失败,删除接口异常")
def upgradedVersion_Front(self):
'''获取前板设备可升级版本'''
params = {
"uuid":"f3d7ad96ed424b15a5c27e7cdb1015fd",
"flag": "Front"
}
response =requests.get(url=self.upgradedVersion_url,headers=self.gethttpheaders(self.get_signs(params)),params=params)
# print(response.json())
asserts = response.json()
self.asserts(asserts,1000,"获取前板设备可升级版本接口正常","获取前板设备可升级版本接口异常")
def upgradedVersion_Rear(self):
'''获取后板设备可升级版本'''
params = {
"uuid": "f3d7ad96ed424b15a5c27e7cdb1015fd",
"flag": "Rear"
}
response = requests.get(url=self.upgradedVersion_url, headers=self.gethttpheaders(self.get_signs(params)),
params=params)
# print(response.json())
asserts = response.json()
self.asserts(asserts, 1000, "获取后板设备可升级版本接口正常", "获取后板设备可升级版本接口异常")
def models(self):
'''获取所有设备型号列表'''
response = requests.get(url=self.models_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts,1000,"<获取所有设备型号列表接口正常>","获取所有设备型号列表接口异常")
def newList(self):
'''获取五分钟内绑定的设备'''
response = requests.get(url=self.newList_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts,1000,"<<获取五分钟内绑定的设备接口正常>>","<获取五分钟内绑定的设备接口异常>")
def UpdateName(self,randoms):
'''修改设备名称----20字符'''
data = {
"uuid":"f3d7ad96ed424b15a5c27e7cdb1015fd",
'name':randoms
}
response = requests.post(url=self.UpdateName_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"<修改设备名称-输入个字符接口正常>","<修改设备名称-输入20个字符接口异常>")
def UpdateName_max(self,randoms):
'''修改设备名称--21字符'''
data = {
"uuid": "f3d7ad96ed424b15a5c27e7cdb1015fd",
'name': randoms
}
response = requests.post(url=self.UpdateName_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
try :
assert response["code"] == 5000
assert response["msg"] == "system error, please contact the administrator"
print("<修改设备名称-输入21个字符接口正常>",response)
except Exception as e:
print("<修改设备名称-输入21个字符接口异常>",response)
def UpdateName_min(self,randoms):
'''修改设备名称--1字符'''
data = {
"uuid": "f3d7ad96ed424b15a5c27e7cdb1015fd",
'name': randoms
}
response = requests.post(url=self.UpdateName_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<修改设备名称-输入1个字符接口正常>", "<修改设备名称-输入1个字符接口异常>")
def UpdateName_special(self,randoms):
'''修改设备名称--特殊字符'''
data = {
"uuid": "f3d7ad96ed424b15a5c27e7cdb1015fd",
'name': randoms
}
response = requests.post(url=self.UpdateName_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<修改设备名称-输入特殊字符接口正常>", "<修改设备名称-输入特殊字符接口异常>")
def UpdateName_Chinese(self,randoms):
'''修改设备名称--特殊字符'''
data = {
"uuid": "f3d7ad96ed424b15a5c27e7cdb1015fd",
'name': randoms
}
response = requests.post(url=self.UpdateName_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<修改设备名称-输入中文接口正常>", "<修改设备名称-输入中文接口异常>")
#-------------------------------------------------------------获取事件部分-------------------------------------------------------------
def evenlist(self):
params = {
"uuid": uuid,
"start_time": int(time.time()),
"date": datetime.now().strftime("%Y-%m-%d"), # 已实现实时日期
"type": self.randomnumber(),#随机获取1~12种tpye类型的事件消息列表
"rows" : 30,#最大条数
}
print(f"打印type事件类型{params}")
# 发起请求并获取响应
response = requests.get(
url=self.evenlist_url,
headers=self.gethttpheaders(self.get_signs(params)),
params=params
)
asserts = response.json()
self.asserts(asserts, 1000, "<<获取事件列表接口正常>>", "<获取事件列表接口异常>")
# ---------------- 新增提取第一个事件的id并返回 ----------------
first_event_id = None # 初始化默认值,避免无数据时报错
# 检查响应数据结构是否正确(防止接口返回空列表或格式异常)
if asserts.get("code") == 1000 and asserts.get("data") and asserts["data"].get("list"):
event_list = asserts["data"]["list"]
if len(event_list) > 0: # 确保列表非空
first_event_id = event_list[0]["id"] # 取第一个事件的id
print(f"从evenlist提取到第一个事件id{first_event_id}")
else:
print("evenlist接口返回无事件数据无法提取msg_id")
return first_event_id # 返回提取到的id无数据时返回None
def eventread(self):
data = {
"msg_id" : "685bdb011c9c06e0e8a43066",
"uuid" : uuid
}
response = requests.post(url=self.eventread_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"<<<修改事件消息的读取状态接口正常>>>","<<修改事件消息的读取状态接口异常>>")
def evendel(self):
# ---------------- 关键调用evenlist获取第一个事件的id ----------------
msg_id = self.evenlist() # 接收evenlist返回的第一个事件id
if not msg_id: # 若未提取到id如无事件数据直接提示并退出避免无效请求
print("未获取到有效事件id无法执行删除操作")
return
# 使用提取到的msg_id构造参数
params = {
"msg_id": msg_id, # 替换固定值使用实时提取的id
"uuid": uuid
}
# 发起删除请求
response = requests.delete(url=self.evendelete_url,headers=self.DELTEThttpheaders(self.delete_sign(params)),params=params
)
asserts = response.json()
self.asserts(asserts, 1000, "<<<删除事件消息接口正常>>>", "<<删除事件消息接口异常>>")
def eventunreadNum(self):
params = {
"uuid" : uuid
}
response = requests.get(url=self.eventunreadNum_url,headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts,1000,"<<<获取事件未读数量接口正常>>>","<<获取事件未读数量接口异常>>")
#------------------------------------------------公共接口---------------------------------------
def times(self):
response = requests.get(url=self.time_url)
asserts = response.json()
self.asserts(asserts,1000,"<<<获取服务器当前时间戳接口正常>>>","<<获取服务器当前时间戳接口异常>>")
def getUrl(self):
headers = {
'Content-Type': 'application/json',
"appid" : "994f9d2e0c5ad0f3"
}
params = {
"uid" : "7e1558dff183cd08"
}
response = requests.get(url=self.getUrl_url,headers=headers,params=params)
asserts = response.json()
self.asserts(asserts,1000,"<<<<获取服务器地址接口正常>>>>","<<<获取服务器地址接口异常>>>")
# -------------------------------------------------------------------------------------设备家庭------------------------------------------------------------------------
def homeCreate(self,randoms):
data={
"name" :randoms
}
response = requests.post(url=self.homeCreate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<创建家庭接口正常>>>>","<<<创建家庭接口异常>>>")
def homeCreatepecial(self,randoms):
data={
"name" :randoms
}
response = requests.post(url=self.homeCreate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<创建家庭-特殊字符接口正常>>>>","<<<创建家庭-特殊字符接口异常>>>")
def homeCreateChinese(self,randoms):
data={
"name" :randoms
}
response = requests.post(url=self.homeCreate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<创建家庭-中文字符接口正常>>>>","<<<创建家庭-中文字符接口异常>>>")
def homeCreateMax(self,randoms):
data={
"name" :randoms
}
response = requests.post(url=self.homeCreate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<创建家庭-21字符接口正常>>>>","<<<创建家庭-21字符接口异常>>>")
def homeCreateMin(self, randoms):
data = {
"name": randoms
}
response = requests.post(url=self.homeCreate_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<创建家庭-1字符接口正常>>>>", "<<<创建家庭-1字符接口异常>>>")
def homeslist(self):
response = requests.get(url=self.homeslist_url, headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
# 校验接口返回状态
self.asserts(asserts, 1000, "<<<获取家庭列表接口正常>>>", "<<<获取家庭列表接口异常>>>")
# 提取最后一个id
if "data" in asserts and len(asserts["data"]) > 0:
last_id = asserts["data"][-1]["id"]
print("最后一个家庭的id", last_id)
self.relations['home_id'] = last_id
return last_id # 返回id供其他方法使用
else:
print("家庭列表为空或数据格式错误")
return None
def homeDelete(self):
time.sleep(1)
self.homeslist()
# home_id = self.homeslist()
params = {
"home_id":self.relations["home_id"]
}
# print("这是家庭id"+self.relations["home_id"],params)
response = requests.delete(url=self.homeDelete_url,headers=self.gethttpheaders(self.delete_sign(params)),params=params)
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<<删除家庭接口正常>>>>>>>","<<<<<删除家庭接口异常>>>>>")
def homeUpdate(self,randoms):
data = {
"home_id" : "685d3d5c8e2acc38e53eb38a",
"name" : randoms,
"location": "深圳"
}
response = requests.post(url=self.homeUpdate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<<修改家庭名称或地址接口正常>>>>>","<<<<修改家庭名称或地址接口异常>>>>")
def homeUpdatepecial(self,randoms):
data = {
"home_id" : "685d3d5c8e2acc38e53eb38a",
"name" : randoms,
"location": "深圳"
}
response = requests.post(url=self.homeUpdate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<<修改家庭名称-特殊字符接口正常>>>>>","<<<<修改家庭名称-特殊字符接口异常>>>>")
def homeUpdateMax(self,randoms):
data = {
"home_id" : "685d3d5c8e2acc38e53eb38a",
"name" : randoms,
"location": "深圳"
}
response = requests.post(url=self.homeUpdate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<<修改家庭名称-30字符接口正常>>>>>","<<<<修改家庭名称-30字符接口异常>>>>")
def homeChange(self):
data = {
"home_id" : "685d3d5c8e2acc38e53eb38a",
"uuid" : uuid
}
response = requests.post(url=self.homeChange_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts =response
self.asserts(asserts,1000,"<<<<<更换设备所属家庭(最后一个家庭)接口正常>>>>>","<<<<更换设备所属家庭(最后一个家庭)接口异常>>>>")
def homeChangenoe(self):
data = {
"home_id": "6865f9dd8e2acc38e53eb69f",
"uuid": uuid
}
response = requests.post(url=self.homeChange_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<更换设备所属家庭(第一个家庭)接口正常>>>>>", "<<<<更换设备所属家庭(第一个家庭)接口异常>>>>")
def homeDevices(self):
params = {
"home_id": "685d3d5c8e2acc38e53eb38a"
}
response = requests.get(url=self.homeDevices_url, headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts,1000,"<<<<<获取家庭下的设备列表接口正常>>>>>","<<<<获取家庭下的设备列表接口异常>>>>>")
def homeUsers(self):
params = {
"home_id" : "685d3d5c8e2acc38e53eb38a"
}
response = requests.get(url=self.homeUsers_url, headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts,1000,"<<<<<<获取家庭下的用户接口正常>>>>>>","<<<<<获取家庭下的用户接口异常>>>>>")
def homeShare(self):
data = {
"home_id" :"685d3d5c8e2acc38e53eb38a",
"username" : "15814087116"
}
response = requests.post(url=self.homeShare_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"<<<<<<分享家庭给用户接口正常>>>>>>>>","<<<<<分享家庭给用户接口异常>>>>>")
# 登录被分享账号去获取消息ID传入用户反馈结果
#分享后需要去获取消息列表
def messagelist(self):
#登录被分享账号去获取消息列表
time.sleep(1)
self.uesrlog_share()
response = requests.get(url=self.messagelist_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts,1000,"<<<<<<<获取消息列表正常>>>>>>>","<<<<<获取消息列表异常>>>>>")
# 提取消息列表中的第一个id
if asserts.get('code') == 1000 and asserts.get('data') and asserts['data'].get('list'):
message_list = asserts['data']['list']
if message_list:
return message_list[0].get('id') # 返回第一个消息的id
return None # 没有找到消息时返回None
def messagelisttype(self):
#登录被分享账号去获取消息列表
time.sleep(1)
self.uesrlog_share()
response = requests.get(url=self.messagelist_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts,1000,"<<<<<<<获取消息列表正常>>>>>>>","<<<<<获取消息列表异常>>>>>")
# 提取type等于4的消息的id
if asserts.get('code') == 1000 and asserts.get('data') and asserts['data'].get('list'):
message_list = asserts['data']['list']
# 筛选出type等于4的消息
type_4_messages = [msg for msg in message_list if msg.get('type') == 4]
if type_4_messages:
return type_4_messages[0].get('id') # 返回第一个type等于4的消息的id
else:
print("没有找到type等于4的消息")
return None # 没有找到消息或type等于4的消息时返回None
def messagelists(self):#用来调用下面删除消息的
response = requests.get(url=self.messagelist_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
# self.asserts(asserts,1000,"<<<<<<<获取消息列表正常>>>>>>>","<<<<<获取消息列表异常>>>>>")
# 提取消息列表中的第一个id
if asserts.get('code') == 1000 and asserts.get('data') and asserts['data'].get('list'):
message_list = asserts['data']['list']
if message_list:
return message_list[0].get('id') # 返回第一个消息的id
return None # 没有找到消息时返回None
def homeShareFeedback(self,number):
#获取msg_id
msg_id = self.messagelist()
if not msg_id:
print("获取消息id失败无法执行反馈操作")
return
data = {
"msg_id" : msg_id,
"accept" : number#同意 1同意 2拒绝
}
# print(msg_id,"查看")
response = requests.post(url=self.homeShareFeedback_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"<<<<<<<用户反馈分享结果接口(同意加入家庭)正常>>>>>>>","<<<<<用户反馈分享结果接口(同意加入家庭)异常>>>>>")
def homeShareRemove(self):
time.sleep(1)
self.uesrlog()#登录主账号去删除分享
data = {
"home_id" : "685d3d5c8e2acc38e53eb38a",
"uid" : "f032bda4b2fbcced"
}
response = requests.post(url=self.homeShareRemove_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"<<<<<<<删除分享者接口正常>>>>>>>","<<<<<删除分享者接口异常>>>>>")
#-------------------------------------------------------------
def homeShareFeedbackNo(self,value):
#分享家庭给用户
self.homeShare()
#获取msg_id
msg_id = self.messagelist()
if not msg_id:
print("获取消息id失败无法执行反馈操作")
return
data = {
"msg_id": msg_id,
"accept": value # 拒绝
}
# print(msg_id,"查看")
response = requests.post(url=self.homeShareFeedback_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<<<用户反馈分享结果接口(拒绝加入家庭)正常>>>>>>>","<<<<<用户反馈分享结果接口(拒绝加入家庭)异常>>>>>")
def homeAddDevice(self,value):
time.sleep(1)
self.uesrlog()#再登录原账户进行后续的接口调用
data = {
"home_id" : value,
"uuid" : uuid
}
# 683ffa2f77375f5bb1a44521
response = requests.post(url=self.homeAddDevice_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<<<家庭内添加设备接口正常>>>>>>>","<<<<<家庭内添加设备接口异常>>>>>")
#''''''''''''''''''''''''''''''云存储'''''''''''''''''''''''''''''''''''''''''''''''''''''
def cloudToken(self):
params = {
"uuid" : uuid
}
response = requests.get(url=self.cloudToken_url,headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<<<APP获取文件下载token接口正常>>>>>>>>","<<<<<<APP获取文件下载token接口异常>>>>>>")
def cloudFiles(self):
params = {
"date" : 20250625,
"uuid": uuid
}
response = requests.get(url=self.cloudFiles_url,headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<<<APP获取云存储文件信息接口正常>>>>>>>>","<<<<<<APP获取云存储文件信息接口异常>>>>>>")
def cloudputToken(self):
response = requests.get(url=self.cloudputToken_url,headers=self.deviceheaders(self.getdevice_sionuuid()))
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<<<设备获取文件上报token接口正常>>>>>>>>","<<<<<<设备获取文件上报token接口异常>>>>>>")
def cloudputFiles(self):
current_time = datetime.now()
formatted_time = current_time.strftime("%Y%m%d")
data = {
"date" : formatted_time,
"suffix" : "h264",
"zone" : "8.00",
"store" : 7,
"event_tag":"p_s",
"files": "0_7:1_-1"
}
response = requests.post(url=self.cloudputFile_url,headers=self.deviceheaders(self.postdevice_sionuuid(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<<<<获取设备上云存信息接口正常>>>>>>>>","<<<<<<获取设备上云存信息接口异常>>>>>>")
#-----------------------------------------------------------------消息部分-------------------------------------------
def messageread(self):
data ={
"message_id" : ""
}
response =requests.post(url=self.messageread_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<<<<修改消息读取状态接口正常>>>>>>>>","<<<<<<修改消息读取状态接口异常>>>>>>")
def messageunreaNum(self):
response = requests.get(url=self.messageunreaNum_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts,1000,"<<<<<<<<获取消息未读数量接口正常>>>>>>>>","<<<<<<修改消息读取状态接口异常>>>>>>")
def messagedelete(self):
msg_id = self.messagelists()
print(msg_id)
params ={
"message_id" : msg_id,
}
response = requests.delete(url=self.messagedelete_url, headers=self.DELTEThttpheaders(self.delete_sign(params)),params=params)
asserts = response.json()
self.asserts(asserts,1000,"<<<<<删除消息接口正常>>>>>","<<<<<删除消息接口异常>>>>>")
# -----------------------------------------------------------------设备分享-------------------------------------------
def deviceshare(self,value):
time.sleep(1)
self.uesrlog()
data = {
"Username" : value,
"uuid" :uuid
}
response =requests.post(url=self.deviceshare_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<设备分享接口正常>>>>>", "<<<<<设备分享接口异常>>>>>")
def deviceshareUser(self,value):
# self.uesrlog()
data = {
"Username" : value,
"uuid" :'f3d7ad96ed424b15a5c27e7cdb1015fd'
}
response =requests.post(url=self.deviceshare_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
try:
assert response["code"] == 1103
assert response["msg"] == 'username does not exist'
print("设备分享(不存在的用户)分享失败-接口正常",response)
except:
print("设备分享(不存在的用户)分享成功-接口异常",response)
def deviceshareDevice(self, value):
# self.uesrlog()
data = {
"Username": '15814087116',
"uuid": value
}
response = requests.post(url=self.deviceshare_url, headers=self.gethttpheaders(self.post_sign(data)),
data=json.dumps(data)).json()
asserts = response
try:
assert response["code"] == 1302
assert response["msg"] == 'invalid uuid'
print("设备分享(不存在的设备)分享失败-接口正常", response)
except:
print("设备分享(不存在的设备)分享成功-接口异常", response)
# asserts = response
# self.asserts(asserts, 1000, "<<<<<设备分享(不存在的用户)接口正常>>>>>", "<<<<<设备分享(不存在的用户)接口异常>>>>>")
def deviceshareRecords(self):
params = {
"uuid" : uuid
}
response =requests.get(url=self.deviceshareRecords_url,headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<获取分享列表正常>>>>>", "<<<<<获取分享列表异常>>>>>")
def devicesshareFeedback(self):
#登录被分享账号获取消息列表
self.messagelisttype()
msg_id = self.messagelisttype()
print(msg_id,"测试返回id")
data = {
"msg_id" : msg_id,
"status" : 2#拒绝
}
response = requests.post(url=self.deviceshareFeedback_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "用户反馈(拒绝)分享接口正常", "<<<<<用户反馈(拒绝)分享接口异常>>>>>")
print("子账号列表")
def devicesshareFeedbackOK(self):
time.sleep(1)
self.uesrlog()
self.deviceshare("15814087116")#调用设备分享接口
self.messagelisttype()#再次调用获取消息列表
msg_id = self.messagelisttype()
data = {
"msg_id" : msg_id,
"status" : 1#同意
}
response = requests.post(url=self.deviceshareFeedback_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "用户反馈(同意)接受分享接口正常", "<<<<<用户反馈(同意)接受分享接口异常>>>>>")
def deviceshareDelete(self):
time.sleep(1)
self.uesrlog()
params = {
"uuid" : uuid,
"uid" : "f032bda4b2fbcced"
}
response = requests.delete(url=self.deviceshareDelete_url, headers=self.DELTEThttpheaders(self.delete_sign(params)),params=params)
asserts = response.json()
self.asserts(asserts, 1000, "设备主人移除分享者接口正常", "<<<<<设备主人移除分享者接口异常>>>>>")
# -----------------------------------------------------------------反馈-------------------------------------------
def create(self):
data = {
"reason" : 'app',
"explain" :'创建用户反馈接口测试'
}
response = requests.post(url=self.feedbackcreate_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<<创建用户反馈接口正常>>>>>>", "<<<<<<创建用户反馈接口异常>>>>>>")
def feedbacklist(self):
response = requests.get(url=self.feedbacklist_url, headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<获取反馈列表接口正常>>>>>>", "<<<<<<获取反馈列表接口异常>>>>>>")
# 提取第一个反馈ID
if asserts.get('code') == 1000 and asserts.get('data') and asserts['data'].get('list'):
return asserts['data']['list'][0].get('id')
return None
def feedbackinfo(self):
# 先调用列表接口获取ID
feedback_id = self.feedbacklist()
parmas = {
"feedback_id": feedback_id
}
response = requests.get(url=self.feedbackinfo_url, headers=self.gethttpheaders(self.get_signs(parmas)),
params=parmas)
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<获取反馈详情接口正常>>>>>>", "<<<<<<获取反馈详情接口异常>>>>>>")
def feedbacksend(self):
feedback_id = self.feedbacklist()
data = {
"feedback_id": feedback_id,
"message" : "发送反馈消息测试",
}
response = requests.post(url=self.feedbacksend_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts, 1000, "<<<<<<发送反馈消息接口正常>>>>>>", "<<<<<<发送反馈消息接口异常>>>>>>")
#------------------------------------------------------------------留言---------------------------------------------
def leavewordlist(self):
params = {
"uuid":uuid,
"rows" : "30" #获取最大条数 默认10
}
response = requests.get(url=self.leavewordlist_url,headers=self.gethttpheaders(self.get_signs(params)),params=params)
asserts = response.json()
self.asserts(asserts, 1000, "<<<<<<<APP获取留言列表接口正常>>>>>>>", "<<<<<<<APP获取留言列表接口异常>>>>>>>")
def leavewordunreadNumber(self):
response = requests.get(url=self.leavewordunreadNumber_url,headers=self.gethttpheaders(self.get_sign()))
asserts = response.json()
self.asserts(asserts,1000,"<<<<<<<APP获取留言未读数量接口正常>>>>>>>", "<<<<<<<APP获取留言未读数量接口异常>>>>>>>")
def leavewordread(self):
data = {
"id" :""
}
response = requests.post(url=self.leavewordread_url,headers=self.gethttpheaders(self.post_sign(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"APP设置全部留言已读接口正常","APP设置全部留言已读接口异常")
def leaveworddeviceList(self):
"设备获取留言列表"
params = {
"rows" : "20"
}
response = requests.get(url=self.leaveworddeviceList_url,headers=self.getdeviceheaders(self.getdevice_sion(params)),params=params)
asserts = response.json()
self.asserts(asserts,1000,"设备获取留言列表接口正常","设备获取留言列表接口异常")
def leaveworddeviceUnreadNumber(self):
response =requests.get(url=self.leaveworddeviceUnreadNumber_url,headers=self.getdeviceheaders(self.getdevice_sionNOdata()))
asserts = response.json()
self.asserts(asserts,1000,"设备获取留言未读数量接口正常","设备获取留言未读数量接口正常异常")
def leaveworddeviceRead(self):
data = {
"id" : ""
}
response =requests.post(url=self.leaveworddeviceRead_url,headers=self.getdeviceheaders(self.postdevice_sion(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"设备设置留言已读接口正常","设备设置留言已读接口异常")
def devicegetAllUser(self):
response = requests.get(url=self.devicegetAllUser_url,headers=self.deviceheaders(self.getdevice_sionuuid()))
asserts = response.json()
self.asserts(asserts,1000,"设备获取所有门锁用户正常","设备获取所有门锁用户异常")
# print("测试",response.json())
def deviceputAllUser(self):
data = {
"users": []
}
response = requests.post(url=self.deviceputAllUser_url,headers=self.deviceheaders(self.postdevice_sionsuuid(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"设备上报所有门锁用户正常","设备上报所有门锁用户异常")
def devicelogin(self):
data = {
"zone" : "8.00"
}
response = requests.post(url=self.devicelogin_url,headers=self.deviceheaders(self.postdevice_sionsuuid(data)),data=json.dumps(data)).json()
asserts = response
self.asserts(asserts,1000,"设备登录成功","设备登录失败")
return response
# 连接串口 发送指令
# def CDM(self):
# time.sleep(2)
# value = "has devband HiChS-Guest *12345678# 7e1558dff183cd08\n"
# # value = "reboot\n"
# app = cks('COM10', 115200, 0, value)
# print(time.strftime('%Y.%m.%d %H:%M:%S ', time.localtime(time.time())), "下发配网指令...")
def mac(self):
# 调试:确认正则表达式模块是否可以导入
try:
import re
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 成功导入正则表达式模块")
except ImportError as e:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 导入正则表达式模块失败: {e}")
# 如果无法导入正则模块,提供替代方案
re = None
time.sleep(2)
com_port = 'COM10'
baud_rate = 115200
timeout = 10
command = "has print env\n"
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 下发配网指令: {command.strip()}")
# 只关注这三个参数
target_info = {'mac': None, 'sn': None, 'uuid': None}
max_retries = 3
try:
with serial.Serial(com_port, baud_rate, timeout=timeout) as ser:
for attempt in range(max_retries):
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 尝试 {attempt + 1}/{max_retries}")
ser.reset_input_buffer()
ser.reset_output_buffer()
bytes_sent = ser.write(command.encode('gbk'))
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 已发送 {bytes_sent} 字节数据")
time.sleep(1)
# 接收数据
response = b''
start_time = time.time()
while time.time() - start_time < timeout:
if ser.in_waiting > 0:
chunk = ser.read(ser.in_waiting)
response += chunk
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 读取到数据片段,长度: {len(chunk)}")
if b'===========' in response and len(response) > 500:
break
else:
time.sleep(0.1)
print(
f"{time.strftime('%Y.%m.%d %H:%M:%S')} 尝试 {attempt + 1} 接收结束,总数据长度: {len(response)}")
if len(response) > 0:
# 解码响应
try:
response_text = response.decode('gbk', errors='replace')
except UnicodeDecodeError:
response_text = response.decode('utf-8', errors='replace')
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 收到设备回复,准备提取信息")
# 调试:确认正则模块是否可用
if re:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 正则表达式模块状态: 可用")
else:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 正则表达式模块状态: 不可用,将使用替代方法")
# 只提取需要的三个参数
patterns = {
'sn': r'sn\s*:\s*(\S+)',
'mac': r'mac\s*:\s*(\S+)',
'uuid': r'uuid\s*:\s*(\S+)'
}
for key, pattern in patterns.items():
if re:
match = re.search(pattern, response_text)
if match:
target_info[key] = match.group(1).strip()
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 提取{key.upper()}: {target_info[key]}")
else:
# 替代方法:使用简单字符串查找
for line in response_text.split('\n'):
if key + ' :' in line.lower():
value = line.split(':', 1)[1].strip()
target_info[key] = value
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 提取{key.upper()}: {value}")
break
# 三个参数都获取到则跳出循环
if all(target_info.values()):
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 成功获取所有目标信息")
break
else:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 未收到数据,将重试")
if attempt < max_retries - 1:
time.sleep(1)
# 最终输出结果(只显示目标参数)
print("\n===== 提取结果 =====")
print(f"MAC: {target_info['mac'] or '未找到'}")
print(f"SN: {target_info['sn'] or '未找到'}")
print(f"UUID: {target_info['uuid'] or '未找到'}")
target_info_MAC = target_info['mac']
target_info_SN = target_info['sn']
target_info_UUID = target_info['uuid']
self.relations['MAC'] = target_info_MAC
# self.relations['SN'] = target_info_SN
# self.relations['UUID'] = target_info_UUID
# print(self.relations['MAC'], self.relations['SN'],self.relations['UUID'])
print("====================")
except serial.SerialException as e:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 串口错误: {e}")
except Exception as e:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 错误: {e}")
# 调试:打印完整的错误堆栈
import traceback
print(traceback.format_exc())
return target_info
def bindmac(self):
# self.mac()
params = {
"label":"TEST_SL100_20240801",
"model":"sl100",
"batch":"1",
# "mac": self.relations['MAC']
"mac":"6c:20:1e:1d:93:7c"
}
# print("串口传回来的mac",self.relations['MAC'])
response = requests.get(url=self.bindmac_url,headers=self.bandmacheaders(self.bind_mac_sign(params,"GET")),params=params)
print(f"接口返回结果{response.json()}")
# asserts = response
#get请求需要将返回数据转回json再提取
response_data = response.json()#转字典
if response_data['code'] == 1000 and response_data['msg'] == 'ok':
access_sn = response_data["data"]["sn"]#转换完成后提取
access_uuid = response_data["data"]["uuid"]
self.relations['SN'] = access_sn
self.relations['UUID'] = access_uuid
print(self.relations['SN'],self.relations['UUID'])
else:
self.relations['msg'] = response_data["msg"]
print(self.relations['msg'])
"传入mac地址和uuid"
def activate(self):
data = {
"mac": self.relations['MAC'],
"uuid": self.relations['UUID'],
}
print(f'传入mac和uuid{data}')
response =requests.post(url=self.activate_url,headers=self.bandmacheaders(self.bind_mac_sign(data,"POST")),data=json.dumps(data)).json()
print(f"接口返回结果:{response}")
# def releas(self):
# # self.relations['UUID'] = self.relations['UUID']
# print("<UNK>",self.relations['UUID'])
# return self.relations['UUID']
def CMD(self):
# 等待2秒
time.sleep(2)
# 配置串口参数[
com_port = 'COM10'
baud_rate = 115200
timeout = 5 # 设置超时时间为5秒
# 下发配网指令
command = "has devband HiChS-Guest *12345678# 7e1558dff183cd08\n"
# command = "reboot\n"
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 下发配网指令: {command.strip()}")
try:
# 初始化串口并发送指令
with serial.Serial(com_port, baud_rate, timeout=timeout) as ser:
# 发送指令
bytes_sent = ser.write(command.encode('gbk'))
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 已发送 {bytes_sent} 字节数据")
# 清空输入缓冲区(可选)
# ser.reset_input_buffer()
# 接收设备回复
response = ser.read_until(b'\n') # 读取直到遇到换行符
response = response.decode('gbk', errors='replace').strip()
if response:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 收到设备回复: {response}")
else:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 在超时时间内未收到回复")
except serial.SerialException as e:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 串口通信错误: {e}")
except UnicodeDecodeError as e:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 解码错误: {e}")
except Exception as e:
print(f"{time.strftime('%Y.%m.%d %H:%M:%S')} 发生未知错误: {e}")
#保活设备
def testmodeon(self):
# for i in range(1):
time.sleep(2)
value = "has testmode on\n"
# value = "reboot\n"
app = cks('COM10', 115200, 0, value)
print(time.strftime('%Y.%m.%d %H:%M:%S ', time.localtime(time.time())), "保活...")
# app.close() # 关闭串口
#关于设备的sing get 带参数和不带参数的
# def getdevice_sion(self, data=None):
# """生成设备接口签名data参数可选"""
# # 基础签名部分(固定字段)
# base_sign = (
# "GET" + "&" +
# "SL100" + "&" +
# "bbf91e0d-d397-4775-8296-25c99e5f7403" + "&" +
# str(timestamp) + "&" +
# "576ad09e31e148f68180c985f5eea989"
# )
#
# # 如果有参数则添加参数部分
# if data:
# param_str = "&" + urllib.parse.urlencode(sorted(data.items())).replace("+", " ").replace("%3A", ":")
# return base_sign + param_str
# return base_sign
#
#
# def leaveworddeviceUnreadNumber(self):
# """获取留言未读数量(无参数接口)"""
# # 生成签名(不传参数)
# sign_str = self.getdevice_sion() # 注意这里不传data
# headers = self.getdeviceheaders(sign_str)
# response = requests.get(
# url=self.leaveworddeviceUnreadNumber_url,
# headers=headers
# )
# return response.json()
#
#
# def leaveworddeviceList(self):
# """获取留言列表(带参数接口)"""
# params = {"rows": "20"}
# # 生成签名传入params
# sign_str = self.getdevice_sion(params)
# headers = self.getdeviceheaders(sign_str)
# response = requests.get(
# url=self.leaveworddeviceList_url,
# headers=headers,
# params=params
# )
# return response.json()