python mitmproxy代理抓包工具¶
0 背景¶
mitmproxy 是一个开源的中间人代理工具,用于拦截、检查、修改和重放 HTTP 和 HTTPS 通信。它主要用于网络调试、安全测试、和爬虫的目的。
mitmproxy 提供了几种运行模式,包括命令行代理(mitmproxy)、交互式控制台界面(mitmweb)和图形界面(mitmweb)。
在爬虫中,mitmproxy 可以作为一个强大的工具来辅助开发和调试。它可以帮助我们理解和模拟客户端(如浏览器或移动应用)与服务器之间的交互,特别是在处理复杂的动态网站或应用程序接口(API)时。
下面是一些 mitmproxy 在爬虫开发中的几种应用:
- 抓取和分析 HTTP/HTTPS 请求:
mitmproxy可以捕获和显示网站或API发送的所有请求和响应。这对于理解网站的数据加载机制(如通过 AJAX 加载的内容)和API的工作原理非常有用。 - 分析和绕过防爬机制:一些网站采用了复杂的防爬策略,如动态生成的请求参数或令牌。通过使用
mitmproxy,我们可以分析这些机制并找到绕过它们的方法。 - 模拟客户端请求:了解客户端如何与服务器交互后,我们可以通过写python脚本,使用
mitmproxy修改请求参数,模拟不同的客户端行为。
1 使用¶
1 安装和配置¶
mitmproxy是一个第三包, 所以通过pip来安装
安装好后, 我们启动在命令中启动mitmproxy就可以进行抓包了, 但是由于很多时候我们还需要抓https的包,因为由于证书的原因。
因此,我们还需要安装证书,笔者这里使用的是火狐浏览器,因为火狐的浏览器设置里面可以直接设置代理。
启动mitmproxy后,我们手动配置代理为mitmproxy的ip和端口,默认端口是8080。

然后访问在火狐中访问http://mitm.it 进行证书的安装,可以下载相关火狐的证书,也可以导入到系统的根证书里面去。
2 拦截 & 修改代理¶
我们直接编写python脚本,来达到请求和响应修改的效果。
mitimproxy的python脚本中支持函数和类两种方式,由于类相对更具有一些优势,所以我准备直接使用类进行操作。
from mitmproxy import http
class Proxy1(object):
def __init__(self):
self.records = []
def request(self, flow: http.HTTPFlow) -> None:
# 监听所有的请求
print(f'{flow.request.pretty_url=}')
# 当请求链接有一些特征出现时, 我们可以对请求进行一些操作, 比如修改它的请求链接, 请求体, 或者做个计数器什么的
if 'orange.com/simple' in flow.request.pretty_url:
flow.request.url = 'https://cp.orange.cc'
self.records += 1
def response(self, flow: http.HTTPFlow) -> None:
if '粘贴' in (text := flow.response.text):
text = text.replace('粘贴', '哈哈哈哈哈橘子')
flow.response.text = text
addons = [
Proxy1()
]
其中,
我们需要定义一个类,在类的内部实现request和response方法,
http.HTTPFlow 在 mitmproxy 中是一个非常核心的类,它代表了一个完整的 HTTP 流量流。HTTPFlow 对象提供了对流经代理的 HTTP 流量进行分析和修改的能力。我们可以通过编写处理这些 HTTPFlow 对象的脚本来定制 mitmproxy 的行为,实现对流量的监控、修改或重定向等功能。
然后在addons中加入我们类的实例。
在上面的例子中,我们修改了请求的url,以及修改响应中的源代码,比如在混淆的js脚本还原是非常有用的,这让我们可以替换脚本。
最后,我们可以通过运行命令:
如果需要修改端口,默认是8080:
2 关于¶
欢迎关注我的微信公众号¶
