前言
fiddler 工具有个打断点功能非常实用,可以实现拦截请求,篡改请求和返回的数据。
mitmproxy 可以用python代码写插件的方式实现拦截请求,篡改请求和返回数据。
fiddler 打断点
before response:这个是打在request请求的时候,未到达服务器之前
after response:也就是服务器响应之后,在Fiddler将响应传回给客户端之前。
拦截到请求就可以在工具上修改请求和返回的数据了
拦截请求
request(flow) 方法可以拦截请求,并且能获取请求参数,修改请求参数
from mitmproxy import http
# 作者:上海-悠悠 微信号:283340479
def request(flow: http.HTTPFlow):
# 拦截请求地址
if "http://httpbin.org/get" in flow.request.url:
print('请求方法', flow.request.method)
print('请求类型', flow.request.scheme)
print('请求url', flow.request.url)
# 获取url 键值对请求参数
print(flow.request.query)
# 取得所有请求参数
print(list(flow.request.query.keys()))
# 修改请求参数
flow.request.query.set_all('yoyo', ['python'])
# 打印修改过后的参数
print(flow.request.query.get('yoyo'))
在浏览器上访问http://httpbin.org/get?yoyo=123&key=hello
地址
打印结果
请求方法 GET
请求类型 http
请求url http://httpbin.org/get?yoyo=123&key=hello
MultiDictView[('yoyo', '123'), ('key', 'hello')]
['yoyo', 'key']
python
会发现请求参数yoyo的值已经改成了python
mock 返回内容
response(flow) 方法可以拦截到返回的数据,对返回的数据修改后返回
from mitmproxy import http
# 作者:上海-悠悠 微信号:283340479
def response(flow: http.HTTPFlow):
if "http://httpbin.org/get" in flow.request.url:
# 状态码
print(f'状态码: {flow.response.status_code}')
# 返回内容,已解码
print(f'返回内容: {flow.response.text}')
# 返回内容, bytes类型
print(f'返回内容bytes类型: {flow.response.content}')
# 取得响应的文本
print(f'应的文本: {flow.response.get_text}')
# 修改响应 的文本
flow.response.set_text('{"code": 0, "message": "success"}')
浏览器上访问http://httpbin.org/get?yoyo=123&key=hello
时,返回内容已经是set_text() 指定的内容了