原文链接 https://blog.csdn.net/qianwenjun_19930314/article/details/88227335
1、脚本编写的两个条件
1.1 编写一个 py 文件供 mitmproxy 加载,文件中定义了若干函数,这些函数实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的函数
1.2 编写一个 py 文件供 mitmproxy 加载,文件定义了【变量 addons】,addons 是个数组,每个元素是一个类实例,这些类有若干方法,这些方法实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发生时调用对应的方法。这些类,称为一个个 addon。
基本模板为
from mitmproxy import http, ctx
import json
class xxx:
def xxx:
def xxx
addons = [
xxx() //类名的加载,也可以定义多个类,然后以数组的形式添加,进行加载
]
2 、脚本函数编写
2.1 替换请求
from mitmproxy import ctx, http
import json
class Modify:
def request(self, flow):
#替换请求链接
if flow.request.url.startswith("http://spay1.shuqireader.com/api/ios/info?method=priceList"):
#有分享
flow.request.url = "http://activity.x.xxx.xx.cn/share?id=2653&useShare=1"
ctx.log.info("修改链接")
addons = [
Modify()
]
2.2 修改cookies
from mitmproxy import ctx, http
import json
class Modify:
def request(self, flow):
#替换cookie,两种匹配请求链接的方式
# if flow.request.host == "xxx.x.xxx.com.cn":
if flow.request.url.startswith("https://xxx.x.xxx.com.cn/"):
print(flow.request.url)
print(flow.request.cookies)
flow.request.cookies["_testCookie1"] = "xxx-91"
flow.request.cookies["testCookie2"] = "123"
req = flow.request.cookies["_testCookie1"]
ctx.log.info(req)
addons = [
Modify()
]
2.3 修改请求参数
from mitmproxy import ctx, http
import json
class Modify:
def request(self, flow):
if flow.request.url.startswith("http://xxx.x.xxx.com.cn/customActivity/bookcode/doJoin"):
ctx.log.info("modify request form")
if flow.request.urlencoded_form:
flow.request.urlencoded_form["code"] = "11111"
else:
flow.request.urlencoded_form = [
("actId", "20727"),("nick","name")
]
addons = [
Modify()
]
2.4 修改相应状态
from mitmproxy import ctx, http
import json
class Modify:
def response(self, flow):
if flow.request.url.startswith("http://baidu.com.cn"):
flow.response = http.HTTPResponse.make(404)
ctx.log.info("modify status code")
addons = [
Modify()
]
2.5 修改响应体
from mitmproxy import ctx, http
import json
class Modify:
def response(self, flow):
if flow.request.url.startswith("https://xxx.x.xxx.com.cn/activityInfo/getPrizeInfo=="):
//获取响应的json字符串,转成python对象进行解析和修改
response = json.loads(flow.response.get_text())
response['limitCount'] = 1
//修改完成后,奖python对象转成json字符串,set进请求的响应体重发送给客户端
flow.response.set_text(json.dumps(response))
ctx.log.info('modify limitCount')
addons = [
Modify()
]
2.6 读取json文件中字符串返回客户端
from mitmproxy import ctx, http
import json
class Modify:
def response(self, flow):
if flow.request.url.startswith("https://xxx.x.xxx.com.cn/activityInfo/getPrizeInfo=="):
//读取文件,在当前文件路径下执行脚本,否则需要写文件的绝对路径;不然会找不到该json文件
with open('getStatus.json','rb') as f:
//从json文件中读取数据成python对象
res = json.load(f)
//将读取的python对象转成json字符串发送给客户端
flow.response.set_text(json.dumps(res))
ctx.log.info("modify order status")
addons = [
Modify()
]