Python3如何使用Requests测试带签名的接口

使用Requests测试带签名的接口

部分业务为了安全需要,需要对接口请求数据做签名校验,

一般制定一下规则

1、业务方接入系统,需申请业务ID以及加密秘钥,二者成对出现,并且为面向服务端的,不能在前端或者客户端传递。

2、所有值非空的参数必须参与签名

3、签名算法:

a. 对所有参数按参数名的字典升序排序

b. 将所有排好序的参数按照key1=value1&key2=value2&key3=value......的格式拼接成一个字符串,记为signStr

c. 在signStr后,继续添加 &key=加密密钥

d. 对signStr进行MD5签名

针对某一get接口做实例说明

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

#!/usr/bin/env python#coding:utf-8

import hashlib

import json

import requests

  

#测试的域名

domain= "http://******/***/vip2.ldo?"

#get 传递的非sign参数

url_params = {

    'type':'orderList',

    'userId':'198049148',

    'country':86,

    'typeGroup':'',

    'status':'',

    'rows':'20',

    'page':'1',

    'businessId':'2',

}

sign ="sign=###################"

#删除空值的参数,以用来签名

for key in list(url_params.keys()):

    if not url_params.get(key):

        del url_params[key]

 #按照升序排列,得到的是一个列表,列表的元素为元组      

url_params1 = sorted(url_params.items(),key=lambda d:d[0], reverse=False)

  

values =[]

for li in url_params1:

    newsmbol =('=',)

    #元组中增加一个新元素

    li = li[:1]+newsmbol+li[1:]

    #元组转化为字符串,整型不能转化,list包含数字,不能直接转化成字符串

    value = "".join('%s' %id for id in li)

    values.append(value)

#列表复制不能用= 需要用copy 或者list[:]

values1 = values[:]

values1.append(sign)

sign1 = "&".join(values1)

#md5 调用库函数

sign2 = hashlib.md5(sign1.encode('utf-8')).hexdigest()

sign = 'sign='+sign2

values.append(sign)

para = "&".join(values)

url = domain+ para

print(url)

  

res = requests.get(url)

print('***---***---***')

print(res.content)

print('***---***---***')

print(res.headers)

print('***---***---***')

print(res.status_code)

if res.status_code == 200:

    print('请求成功')

print('***---***---***')

#json 格式打印

print(json.dumps(res.json(),indent=4))

print('***---***---***')

#两种方法

if json.loads(res.text)['msg']=='success':

    print('True')

else:

    print('error')

if res.json()['msg']=='success':

    print('True')

else:

    print('error')

在for循环中,相当于对链表的操作,它会自动调用next方法! 字典的迭代器会遍历它的键,在这个过程中,

不能改变这个字典!不能删除、添加数据 要先记录要删除的元素的索引,遍历完后再删除,url_params.keys()在python2中

是一个独立的列表,python3中是迭代器,需要我们list转换生成一个独立的列表。

1

2

3

for key in list(url_params.keys()):

    if not url_params.get(key):

        del url_params[key]

使用内置的sorted()函数可以将字典按照键或者值来进行升序或者降序的排列,其排序结果,将字典转化为一个列表,其中字典的元素变为了一个元组。

按照键 升序

1

url_params1 = sorted(url_params.items(),key=lambda d:d[0], reverse=False)

按照值 倒叙

1

url_params1 = sorted(url_params.items(),key=lambda d:d[1], reverse=True)

Python 签名接口测试

在之前的随笔中,我们已经学过了如何使用使用JMeter和Postman实现sign签名接口校验的接口测试,今天我们来学习一下如何写Python脚本实现签名接口的接口测试。

签名接口

地址:http://localhost:8080/pinter/com/userInfo

参数为:

{"phoneNum":"123434","optCode":"testfan","timestamp":"1211212","sign":"fdsfdsaafsasfas"}

其中,sign字段是按照特定算法进行加密后的数据

本接口的签名算法为 sign=Md5(phoneNum+ optCode+ timestamp)

代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

import time

import random

import hashlib

import requests

import json

#1.生成5位随机数

phone=random.randint(10000,99999)

#2.生成13位数字的时间戳

timeStamp=int(round(time.time()*1000))

print(timeStamp)

optCode="testfan"

#3.随机数和时间戳拼接

t=str(phone+timeStamp)

#4.sign=随机数phoneNum+optCode

sign=t+optCode

#5.实例化一个md5对象

md5=hashlib.md5()

#6.sign字段进行md5加密

md5.update(sign.encode("utf-8"))

print(md5.hexdigest())

  

def md5_sign():

   url ="http://localhost:8080/pinter/com/userInfo"

   header={"Content-Type":"application/json" }

   body={"phoneNum":phone,"optCode":"testfan","timestamp":timeStamp,"sign":md5.hexdigest()}

   respon = requests.post(url=url, headers=header,data=body)

   return respon.json()

  

if __name__ == '__main__':

      print(md5_sign())

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小怡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值