mitmproxy+python做拦截代理,自动生成接口测试用例
1.mitmproxy安装
python版本3.6以上,输入安装命令pip3 install mitmproxy
安装完成后输入命令mitmdump --version验证
应当可以看到类似于这样的输出:
2.编写py代码,定义addons
import mitmproxy.http from mitmproxy import ctx class Counter: def __init__(self): self.num = 0 def request(self, flow: mitmproxy.http.HTTPFlow): self.num = self.num + 1 ctx.log.info("We've seen %d flows" % self.num) addons = [ Counter() ]
3.启动mitmweb
输入命令 mitmweb -s addons.py
request就是在请求阶段拦截,并自定义自己想要输入的信息,其他详情方法见文末
4. 启动谷歌作为代理浏览器进行监听
打开 cmd,执行:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=127.0.0.1:8080 --ignore-certificate-errors
这样在谷歌浏览器进行的接口访问,就会被记录下来
HTTP生命周期介绍
def http_connect(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 收到了来自客户端的 HTTP CONNECT 请求。在 flow 上设置非 2xx 响应将返回该响应并断开连接。CONNECT 不是常用的 HTTP 请求方法,目的是与服务器建立代理连接,仅是 client 与 proxy 的之间的交流,所以 CONNECT 请求不会触发 request、response 等其他常规的 HTTP 事件。
def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自客户端的 HTTP 请求的头部被成功读取。此时 flow 中的 request 的 body 是空的。
def request(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自客户端的 HTTP 请求被成功完整读取。
def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自服务端的 HTTP 响应的头部被成功读取。此时 flow 中的 response 的 body 是空的。
def response(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来自服务端端的 HTTP 响应被成功完整读取。
def error(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 发生了一个 HTTP 错误。比如无效的服务端响应、连接断开等。注意与“有效的 HTTP 错误返回”不是一回事,后者是一个正确的服务端响应,只是 HTTP code 表示错误而已。
mitmproxy
的 HTTPFlow
对象包含了关于 HTTP 请求和响应的详细信息。以下是一些常用的属性:
请求相关(flow.request
):
flow.request.method
: HTTP 请求方法(如 "GET", "POST" 等)。flow.request.url
: 完整的请求 URL。flow.request.scheme
: 请求使用的协议(如 "http" 或 "https")。flow.request.host
: 请求的目标主机名。flow.request.port
: 请求的目标端口。flow.request.path
: 请求的路径。flow.request.http_version
: HTTP 版本。flow.request.headers
: 请求头,一个包含所有 HTTP 请求头的字典。flow.request.cookies
: 请求中的 cookies。flow.request.content
: 请求体的内容。flow.request.query
: 查询参数。flow.request.timestamp_start
: 请求开始的时间戳。flow.request.timestamp_end
: 请求结束的时间戳。
响应相关(flow.response
):
flow.response.status_code
: HTTP 响应状态码(如 200, 404 等)。flow.response.reason
: HTTP 响应的原因短语(如 "OK", "Not Found" 等)。flow.response.headers
: 响应头,一个包含所有 HTTP 响应头的字典。flow.response.cookies
: 响应中的 cookies。flow.response.content
: 响应体的内容。flow.response.timestamp_start
: 响应开始的时间戳。flow.response.timestamp_end
: 响应结束的时间戳