任务目标:
- 实现一套seetaaiot鉴权
- 对request简单封装
- 封装seetaaiot调用方法
- pytest简单使用
*分析一下鉴权规则规则
![](https://img.haomeiwen.com/i22662951/432c6e0d96b51476.png)
- 首先进行排序,
- 然后按照顺序拼接用,
- 再用拼接字符串使用app_key进行hmac-sha1签名,
- 然后把参数放在一起
Authentica.py
import time as t
import hmac
from hashlib import sha1
import json
import configparser
config = configparser.ConfigParser()
config.read("config.ini", encoding="utf-8")
config.sections()
class auth:
def __init__(self, props):
self.props = props
self.props['timestamp'] = str(int(t.time()))
self.props['app_key'] = config.get("seeta_device_conf", "app_key")
self.props['nonce_str'] = config.get("seeta_device_conf", "nonce_str")
self.seckey = config.get("seeta_device_conf", "seckey")
def hash_hmac(key, code, sha1):
hmac_code = hmac.new(key.encode(), code.encode(), sha1)
return hmac_code.hexdigest()
def param(self):
List = []
#排序
Sort = sorted(self.props.items())
Dict = (dict((x, y) for x, y in Sort))
for k, v in Dict.items():
if isinstance(v, list):
#如果参数为list需要先转成str
v = json.dumps(v)
List.append(str(k) + '=' + str(v))
else:
List.append(str(k) + '=' + str(v))
item = "&".join(List)
print(item)
value = auth.hash_hmac(self.seckey, item, sha1)
self.props['signature'] = value
templ = self.props
# templ = json.dumps(templ)
return templ
if __name__ == '__main__':
pass
*requests封装
分析:seetaaiot使用了四种方法,我们简单封装一下
Requests_Send.py
import requests
import json
from Authentica import auth
class Runmain:
'''
请求地址示例: url = ""
请求方法使用 run = Runmain(url=url, params=None, data=need_data, method='POST')
只支持四种方法delete patch post get
method必须用大写,为get请求时参数化后的参数传入Runmain的params,其他的方法使用data,无参数时需要传入空{}即可
返回结果可以这样看 print(run.response)
'''
def __init__(self, url, data, params, method):
self.response = self.run_main(url, data, params, method)
def send_post(self, url, params, data):
response = requests.post(url=url, data=json.dumps(data))
return response.json()
def send_delete(self, url, params, data):
response = requests.delete(url=url, data=json.dumps(data))
return response.json()
def send_patch(self, url, params, data):
response = requests.patch(url=url, data=json.dumps(data))
return response.json()
def send_get(self, url, params, data):
response = requests.get(url=url, params=params)
return response.json()
def run_main(self, url, data, params, method):
respose = None
if method == 'GET':
respose = self.send_get(url, params, data)
elif method == 'POST':
respose = self.send_post(url, params, data)
elif method == 'PATCH':
respose = self.send_patch(url, params, data)
elif method == 'DELETE':
respose = self.send_delete(url, params, data)
else:
print("method错误")
return respose
if __name__ == '__main__':
pass
*我们封装一下seetaaiot的使用方法
from Authentica import auth
from Requests_Send import Runmain
'''
传入地址及data并根据请求的方法选择,如果是get请求需要传入空字典{}即可
'''
# POST方法
class seeta_aiot:
def __init__(self, url, data):
self.url = url
self.data = data
def aiot_post(self):
props = auth(self.data)
data = props.param()
run = Runmain(url=self.url, params=None, data=data, method='POST')
return run.response
# GET方法
def aiot_get(self):
props = auth(self.data)
data = props.param()
run = Runmain(url=self.url, params=data, data=None, method='GET')
return run.response
# DELETE
def aiot_delete(self):
props = auth(self.data)
data = props.param()
run = Runmain(url=self.url, params=None, data=data, method='DELETE')
return run.response
# PATCH
def aiot_patch(self):
props = auth(self.data)
data = props.param()
run = Runmain(url=self.url, params=None, data=data, method='PATCH')
return run.response
if __name__ == '__main__':
#调用的方法
#url= xxx
#data={}
seeta_aiot(url, data).aiot_get())
下期我们使用一下pytest 做个小练习
网友评论