任務(wù)目標(biāo):
- 實(shí)現(xiàn)一套seetaaiot鑒權(quán)
- 對(duì)request簡(jiǎn)單封裝
- 封裝seetaaiot調(diào)用方法
- pytest簡(jiǎn)單使用
*分析一下鑒權(quán)規(guī)則規(guī)則
- 首先進(jìn)行排序,
- 然后按照順序拼接用疤苹,
- 再用拼接字符串使用app_key進(jìn)行hmac-sha1簽名,
- 然后把參數(shù)放在一起
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):
#如果參數(shù)為list需要先轉(zhuǎn)成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使用了四種方法哑姚,我們簡(jiǎn)單封裝一下
Requests_Send.py
import requests
import json
from Authentica import auth
class Runmain:
'''
請(qǐng)求地址示例: url = ""
請(qǐng)求方法使用 run = Runmain(url=url, params=None, data=need_data, method='POST')
只支持四種方法delete patch post get
method必須用大寫,為get請(qǐng)求時(shí)參數(shù)化后的參數(shù)傳入Runmain的params芜茵,其他的方法使用data叙量,無參數(shù)時(shí)需要傳入空{(diào)}即可
返回結(jié)果可以這樣看 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錯(cuò)誤")
return respose
if __name__ == '__main__':
pass
*我們封裝一下seetaaiot的使用方法
from Authentica import auth
from Requests_Send import Runmain
'''
傳入地址及data并根據(jù)請(qǐng)求的方法選擇,如果是get請(qǐng)求需要傳入空字典{}即可
'''
# 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__':
#調(diào)用的方法
#url= xxx
#data={}
seeta_aiot(url, data).aiot_get())
下期我們使用一下pytest 做個(gè)小練習(xí)