嗨,你們好,我是小白,很久沒寫博客了,最近公司搞什麼python的接口測試,內心一陣狂喜,在公司上百個接口裏拿出一個主要接口一頓亂搞,好在搞通了html
可是在這過程當中也碰到了好多的問題,決定將問題分享出來可以對大家提供一絲絲的幫助!python
工具:pycharm+requests+python3+fiddlerweb
我暫時將我使用的接口稱爲A接口json
第一步:cookie
首先咱們手工發起一筆成功的A接口,app
返回的json字符串:{"requestId":"20190220095236495","result":"00000","signature":"******","sum":"0.03"}dom
從字符串中的result咱們知道返回成功了,signature爲對返回結果進行了簽名,使用到的是MD5簽名工具
第二步:post
查看fiddler,在Inspectors-Raw下邊提煉出咱們想要的一些信息測試
從圖中咱們知道這個請求爲POST請求,content-Type:application/x-www-form-urlencoded,encoding:GBK 保存這些信息
第三步:
打開pycharm,在裏邊經過字典設置A接口的各個參數,因爲輸入參數signature是對全部參數進行MD5簽名,因此咱們設置爲空值,
對字典的value值進行for循環拼接,並調用MD5簽名方法進行簽名,方法以下:
而後咱們再將返回的enc_res回傳到字典的鍵signature所對應的值
1) 設置A接口發起請求的url
2) 設置字典headers(直接從fiddler抓包的raw數據裏copy過來),以下:
3) 從抓包咱們知道content-Type:application/x-www-form-urlencoded,因此發起post請求的參數爲data而不是json
requests.post(url=url,data=payload,headers=headers)
經過返回結果的status爲200咱們知道請求成功了,可是返回的result是一個錯誤碼,經過日誌咱們找到了緣由以下:
能夠看出accountName參數傳到後臺爲亂碼,由於pycharm裏邊傳過去的中文,編碼都是UTF-8的,然後臺編碼從抓包咱們能夠看到是GBK的形式,
因此咱們須要改變一下這個參數編碼格式如圖:
由於A接口輸入參數有一個MD5的簽名參數,因此中文參數的這段編碼要放在輸入參數簽名以後,而後回傳進行覆蓋,進行post請求
再試一遍,咱們發現返回結果成功了,而且咱們對返回的參數再次進行調用MD5簽名校驗
沒有看懂的小夥伴能夠留言,咱們能夠一塊兒交流討論,哈哈,我是小白,歡迎閱讀!
源碼分享一下,寫的沒什麼層次,還請多多批評:
# -*- coding:utf-8 -*-
#autor :xiaobai
import requests
from requests.cookies import RequestsCookieJar
import json
import hmac
import hashlib
import time
import random
####################設置Key值##############
def hashstring(to_enc,ekey):
enc_res = hmac.new(ekey.encode(), to_enc.encode(), hashlib.md5).hexdigest()
# print(enc_res)
return enc_res
if __name__=='__main__':
print("開始進行**測試: ")
url='http://**********'
#設置隨機值做爲入參id
id = []
id = ''.join(str(i) for i in random.sample(range(0, 9), 2)) # sample(seq, n) 從序列seq中選擇n個隨機且獨立的元素;
CurrentTime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
requestid=CurrentTime+id
#請求參數
payload={'requestId':'',
'merchantCode':'',
'transferType':'',
'transToMerCode':'',
'transToMerName':'',
'unionBankNum':'',
'openBankName':'',
'openBankProvince':'',
'openBankCity':'',
'sum':'0.03',
'accountType':'1',
'accountName':'***',
'bankCode':'***',
'bankAccount':'*******',
'reason':'1555',
'noticeUrl':'**********',
'refundNoticeUrl':'*************',
'transferPayType':'*',
'signature':''
}
payload['requestId']=requestid
#初始化字符串並進行加密拼接
to_enc=''
ekey='CSSH_KEY'
for i in payload:
to_enc=to_enc+payload[i]
# print(to_enc)
payload['signature'] = hashstring(to_enc, ekey)
'''將中文進行GBK轉化'''
str='***' #這個字符串與字典裏accountName對應value一致
strGBK=str.encode('GBK') '''轉化完的中文回傳到字典中''' payload['accountName']=strGBK headers={ 'Connection':'keep-alive', 'Content-Length':'543', 'Cache-Control':'max-age=0', 'Origin':'http://**********', 'Upgrade-Insecure-Requests':'1', 'Content-Type':'application/x-www-form-urlencoded', 'User-Agent':'**************************************************', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Referer':'******************', 'Accept-Encoding':'gzip, deflate, br', 'Accept-Language':'zh-CN,zh;q=0.9', } s=requests.post(url=url,data=payload,headers=headers) print(s.text) print("status:",s.status_code) print("****************************************************") print("開始進行返回結果驗證簽名: ") '''返回結果進行驗籤''' ResultDict=s.json() synchronizationStr=ResultDict['requestId'] + ResultDict['result'] + ResultDict['sum'] signature11=hashstring(synchronizationStr, ekey) try: if(ResultDict['result']=='00000' and signature11==ResultDict['signature']): print(" 恭喜你,同步返回驗籤成功") else: print(" result錯誤碼:", ResultDict['result']) except BaseException as msg: print(msg) finally: print(" **處理完畢") print("****************************************************")