python实现基于签名的接口测试
生成签名规则:
签名生成的通用步骤如下:
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1value1key2value2…)拼接成字符串stringA。
特别注意以下重要规则:
参数名ASCII码从小到大排序(字典序);
如果参数的值为空不参与签名;
参数名区分大小写;
第二步,按照第一步说的,把headers参数组合成keyvalue格式,表单参数也组合成keyvalue格式,把这两个生成的keyvalue格式拼接,并按照ASCII码进行从小到大排序;得到字符串stringA;
第三步,把appkey放在stringA前面,得到stringB;
第四步,用sha256对stringB进行加密,此时就生成签名。
import hashlib
import time
import requests
import random
#测试环境
testurl=‘127.0.0.1’
#文件路径
filepath='/employee/124.docx'
#接口Api
wordmergeapi='/platform/office/word/merge'
#生成时间戳
millis = int(round(time.time() * 1000))
#生成六位随机数
str1= ""
for i in range(6):
ch = chr(random.randrange(ord('0'), ord('9') + 1))
str1 += ch
#header参数
headers= {'appId':str(11000),'deviceType':'IOS','version':'1.0.6','deviceId':'ddb0b2a6-b3de-4495-acb9-46118c108ce0','timestamp':str(millis),'nonce':str1}
#表单参数
bo={'signature':'','fileNames':filepath,'id':'1'}
# 列表生成式,生成key=value格式
a = ["".join(i) for i in headers.items() if i[1] and i[0] != "signature"] # headers参数组合成keyValue格式
b= ["".join(i) for i in bo.items() if i[1] and i[0] != "signature"] # 表单参数组合成keyValue格式
c=a+b
print(c)
# 参数名ASCII码从小到大排序
strA = "".join(sorted(c))
print(strA)
strB='ad50b2ared4rr53ea4r94gt68c1rf18x'+strA # 将appKey加入到字符串的最前端,得到stringB
print(strB)
#用sha256加密,得到签名signature
Sign= hashlib.sha256(strB.encode('utf-8')).hexdigest()
print(Sign)
#接口请求参数
body={'signature':Sign,'fileNames':filepath,'id':1}
#发起接口请求
se=requests.session()
res=se.post(testurl+wordmergeapi,data=body,headers=headers)
resc=res.content.decode('utf-8')
print(resc)