目录
1.背景
2.Mitmproxy
1)Windows安装
2)定制开发
3)启动
3.使用
4.问题
5.参考资料
1.背景
简单来说,背景就两个字“偷懒”,一个字“懒”。在API自动化脚本的开发中,一般都需要封装一下接口。如果没有swagger等接口文档,常见做法就是人工操作页面,然后通过F12去查看这些API,再copy到脚本里面做处理。这个过程挺繁琐的,费时费力,还容易出错,尤其有特殊headers时,经常只有在调试才发现。当然,也可以通过工具录制这些API,jmeter/ badboy/ fiddler/ charles等等都行。可现实是,要么因为环境特殊录制不了,就算能录制也是一通复杂的配置;要么就是没有办法直接得到脚本,需要人工做导出操作。实在不符合“懒”的气质~~~于是,一直在思考有没有更“懒”的方法呢?
找了不少方法,中间过程就不赘述了,最后选择了mitmproxy,能用还能定制,就它了。
2.Mitmproxy
MITM(Man-in-the-middle,中间人)简而言之就是个代理,可以拦截诸如HTTP/ SMTP/ SSL/ SOCK4/5协议类型的信息。区别于fiddler/ charles这样的工具,可以命令行或者脚本对数据做一些定制处理。
1)Windows安装
第一步:pip install mitproxy(这里安装的是v5.3.0)
第二步(可能有):配置环境变量。这里自己没有配置好像也能用,不明所以。。。
第三步(可能有):安装证书。下载对应版本的证书,导入到浏览器。证书下载地址:
Downloads (mitmproxy.org)。因为不是管理员身份另外也因为是自己测试环境,所以没有安装证书,而是在启动时做了一点小改动也能使用。
第四步:校验是否安装成功。在windows上无法使用mitmproxy,只能用mitmweb
如果上面步骤有不对,请看官移步度娘问问,然后不吝赐教~~
2)定制开发
这里是为了将被测环境上操作时的请求都保留下来,所以需要在这里做一些修改,直接上代码:
import json
from mitmproxy import http
class CaptureProxy:
def request(self, flow: http.HTTPFlow) -> None:
request_info = {
"method": flow.request.method,
"url": flow.request.pretty_url,
"headers": dict(flow.request.headers),
"content": flow.request.content.decode()
}
with open("requests.json", "a") as f:
json.dump(request_info, f)
f.write("\n")
addons = [
CaptureProxy()
]
还可以在这里过滤指定的host或者api。前置条件:
fixed_host = "www.baidu.com" # 只抓取baidu的请求
fixed_url = "/api/" # 只抓取API请求,那些css/ html/ json/ js等等都不考虑
class CaptureProxy:
def request(self, flow: http.HTTPFlow) -> None:
global fixed_host, fixed_url
if flow.request.host != fixed_host:
return
if fixed_url not in flow.request.pretty_url:
return
3)启动
mitmweb -s my_proxy.py --ssl-insecure
启动后,在默认浏览器会启动这样的页面。mitmproxy默认的监听端口是8080,如果需要修改端口,可以使用 -p <新端口>。--ssl-insecure是因为被测环境是HTTPS,这里不想认证。这种方式有风险,如果是公共环境或者生产环境,慎用!!!
3.使用
第一步:在浏览器的设置中,将代理设置为http://localhost,端口:8080。这是因为mitmproxy是启动在本地的,端口号与mitmproxy一致。
第二步:打开被测环境,一通操作之后,在该脚本的工程目录下会生成“requsts.json”文件,里面记录了所有http请求,注意,是包含.css/ .js/ .json/ api等的所有请求。
4.问题
1)502 Bad Gateway。TlsProtocolException("Cannot establish TLS with xxx.xxx.xxx.xxx:443"(sni: None): TlsException('Cannot validate certificate hostname without SNI')")
启动代理并配置浏览器,由于mitmproxy默认只监听http请求,对被测环境这种https的请求,要么安装证书,要么就如同前面步骤里面那样,启动的时候增加参数--ssl-secure
5.参考资料
mitmproxy · GitHub
mitmproxy - an interactive HTTPS proxy
mitmproxy抓包原理_怪兽N的博客-CSDN博客
MitmProxy介绍以及使用_Cjingger_mounce的博客-CSDN博客
mitmproxy的安装与使用_mitmproxy安装_默默前行的虫虫的博客-CSDN博客
mitmproxy 的安装使用 与 模拟器上的证书配置_mitmproxy证书_Yy_Rose的博客-CSDN博客
使用mitmweb抓包教程_feiyu361的博客-CSDN博客