一个接口快速测试小技巧(Python)

一个接口快速测试小技巧(Python)

前两天志成兄和我讨论了一下携程机票的爬虫。虽然我并没有实质上的帮到他什么,不过在讨论一个抓取一个接口的时候,他出现了一些问题,所有参数都是对的,但是就是不能正常返回(后来发现是格式问题)。我用他发给我的各种参数,post过去也是一样的结果,但是思考了一会后有了新的发现,也算是总结出的一个小技巧吧,很实用!

因为平时在写脚本的时候通常都是直接通过浏览器开发者工具或抓包拿到参数然后新建一个py文件开始写。这种方式时间长了,我发现自己总是在做无用功,重复造轮子。而且效率低不说还容易出错了。

大概就像这样吧,请求头还得重新写(不停复制粘贴)。大量重复劳动,之后还这样。。

payload中的格式不正确,关键是自己也不容易看出来哪里有问题。所以我又发现了一些新奇的方式。

在chrome开发者工具中有这样一个功能。同样以携程的接口为例。

点了这个之后,会生成一个curl格式的请求记住是bash的。此时我们放到linux的终端里去执行它。补充一下

curl命令是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以祝一臂之力。

因为这个curl是根据浏览器的请求一模一样生成的,而且格式上肯定不会有错,header和cookie都是有的拿到想要的数据自然不会有问题。

这个功能非常棒,但是我想了想,我们是要用Python来抓取,那能不能直接把curl抓成Python的代码呢?

因为这个curl格式和参数本身就是固定的。所以我就直接开干了。自己写一个脚本来转换不就行了吗?

首先分析一下curl命令的常见参数。http://man.linuxde.net/curl

而从chrome中复制出来的大概有以下几个参数。

-H/--header <line> 自定义头信息传递给服务器

 

--data-binary <data> 以二进制的方式post数据

 

 --compressed 要求返回是压缩的形势 (using deflate or gzip)

那么我就直接放我写好的代码。代码并不难,我就不多做解释了。就是根据其中的关键字来提取的。

import re
import json
print('\t接口测试小工具 --curl转Python代码')
print('\t\t\tAuthor by: Zgao')
while True:
    headers = {}
    curl=input('请输入从Chrome中复制的curl(bash):')
    try:
        info = curl.split('--data-binary')
        url = re.search('[a-zA-z]+://[^\s]*', info[0]).group()[:-1]
        for i in info[0].split('-H')[1:]:
            a = i.split(':', 1)
            headers[a[0][2:]] = a[1][1:-2]
        data = json.loads(info[1][2:-14])
        method = 'get'
    except:
        info = curl.split('--compressed')
        url = re.search('[a-zA-z]+://[^\s]*', info[0]).group()[:-1]
        for i in info[0].split('-H')[1:]:
            a = i.split(':', 1)
            headers[a[0][2:]] = a[1][1:-2]
        method = 'get'
        data = {}
 
    print('''
import requests
 
url = '{}'
headers ={}
data = {}
 
r = requests.{}(url,headers=headers,data=data)
print(r.text)
    '''.format(url,headers,data,method))

大家可以直接复制这段代码使用,我也打包成功了一个exe。大概就像这样的。链接:https://pan.baidu.com/s/1w_QnvIXuFKBSdd7-xkP36A
提取码:d4ft

所以那天也就顺利地帮志成兄解决了接口抓取的问题,同样也方便自己以后使用,提高了测试的效率,免得重复造轮子,算是一举两得吧。

但是后来我Google之后才发现有前辈已经想到过这个问题了。

也就是这个网站,https://curl.trillworks.com/

而且还支持多种编程语言转换(大佬tql),  我酸了  。还跑去github点了个赞,哈哈哈。

那么我写的这个脚本就当练练手吧。

zgao

如果有什么技术上的问题,可以加我的qq 1761321396 一起交流。