拦截指定数据、修改JS -- mitmproxy
mitmproxy 配置
mitmproxy源码:https://github.com/mitmproxy/mitmproxy
mitmdump
- -q:屏蔽mitmdump默认的控制台日志,只显示自己脚本中的
- -s:入口脚本文件
- -p:更改端口,默认为8080
- 修改脚本文件时,不用重启也会生效
针对 HTTP 生命周期的事件
- 请求:def request(self, flow: mitmproxy.http.HTTPFlow):
- 响应:def response(self, flow: mitmproxy.http.HTTPFlow):
- 其它:
- def http_connect(self, flow: mitmproxy.http.HTTPFlow):
- def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
- def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
- def error(self, flow: mitmproxy.http.HTTPFlow):
请求:def request(flow:flow)
- flow.request.headers
- 获取所有头信息,包含Host、User-Agent、Content-type等字段
- flow.request.url
- 完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数
- flow.request.host
- 域名
- flow.request.method
- 请求方式:POST、GET等
- flow.request.scheme
- 请求类型:http、https
- flow.request.path
- 请求的路径,URL除域名之外的内容
- flow.request.get_text()
- 请求中body的内容,有一些http会把请求参数放在body里面,可通过此方法获取,返回字典类型
- flow.request.get_content()
- 结果如flow.request.get_text(),返回bytes类型
- flow.request.raw_content
- 结果如flow.request.get_content(),返回bytes类型
- flow.request.urlencoded_form
- MultiDictView,content-type:application/x-www-form-urlencoded的请求参数,不包含url直接带的键值参数
- flow.request.multipart_form
- MultiDictView,content-type:multipart/form-data
- flow.request.query
- 返回MultiDictView类型的数据,URL的键值参数
- flow.request.query.get('wd')
- 取得请求参数wd的值
- flow.request.query.keys()
- 取得所有请求参数
- flow.request.query.set_all(key,[value])
- 修改请求参数
from mitmproxy.http import flow
def request(flow:flow):
# 获取所有头信息,包含Host、User-Agent、Content-type等字段
# print(flow.request.headers)
# 域名
# print(flow.request.host)
# 请求方式:POST、GET等
# print(flow.request.method)
# 请求类型:http、https
# print(flow.request.scheme)
# 请求的路径,URL除域名之外的内容
# print(flow.request.path)
# 请求中body的内容,有一些http会把请求参数放在body里面,可通过此方法获取,返回字典类型
# print(flow.request.get_text())
# 返回MultiDictView类型的数据,URL的键值参数
# print(flow.request.query)
# 完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数
if 'https://www.baidu.com' in flow.request.url:
# 取得请求参数wd的值
# print(flow.request.query.get('wd'))
# 取得所有请求参数
print(list(flow.request.query.keys()))
# 修改请求参数
flow.request.query.set_all('wd',['python'])
# 打印修改过后的参数
print(flow.request.query.get('wd'))
响应:def response(flow: flow)
- flow.response.status_code
- 状态码
- flow.response.text
- 返回内容,已解码
- flow.response.content
- 返回内容,Bytes类型
- flow.response.get_text()
- 取得响应的文本
- flow.response.set_text()
- 修改响应的文本
- flow.response = flow.response.make(404)
- 返回404
from mitmproxy.http import flow
import json
import re
def response(flow: flow):
# 状态码
# print(flow.response.status_code)
# 返回内容,已解码
# print(flow.response.text)
# 返回内容,Bytes类型
# print(flow.response.content)
# 取得响应的文本
# print(flow.response.get_text())
# 修改响应的文本
# flow.response.set_text('123')
# 返回404
# flow.response = flow.response.make(404)
# 修改淘宝对selenium的js检测文件
targetUrl = 'https://g.alicdn.com/AWSC/uab/122.js'
if targetUrl in flow.request.url:
taobao_js =flow.response.get_text()
taobao_js = taobao_js.replace('!function(){function','!function (){Object.defineProperties(navigator,{webdriver: {get: () => false}})function')
flow.response.set_text(taobao_js)
print('已修改')
# 淘宝搜索商品时,自动打印商品信息
if 'https://s.taobao.com/search' in flow.request.url:
start = flow.response.text.strip().index('{')
end = -2
print(json.loads(flow.response.text.strip()[start: end])['mods']['itemlist']['data']['auctions'])
# 空气质量网,修改检测F12的JS
# https://www.aqistudy.cn/historydata
if 'https://www.aqistudy.cn/historydata/monthdata.php' in flow.request.url:
js = flow.response.text
js = re.sub(r'endebug.*?}\);','',js,flags=re.S)
flow.response.set_text(js)
print('已正常')
拦截指定数据、修改JS -- mitmproxy的更多相关文章
- Fiddler拦截http请求修改数据
1.拦截http请求 使用Fiddler进行HTTP断点调试是fiddler一强大和实用的工具之一.通过设置断点,Fiddler可以做到: ①修改HTTP请求头信息.例如修改请求头的UA,Cookie ...
- Fiddler -工具使用介绍(附:拦截请求并修改返回数据)(转)
一.Fiddler 介绍 Fiddler 是一个使用 C# 编写的 http 抓包工具.它使用灵活,功能强大,支持众多的 http 调试任务,是 web.移动应用的开发调试利器. 1,功能特点 同 H ...
- 用Java代码实现拦截区域网数据包
起因: 吃饭的时间在想如果区域网内都是通过路由器上网,那如何实现拦截整个区域网的数据包,从而实现某种窥探欲. 思路: 正常是通过电脑网卡预先设置或分配的IP+网关对路由器进行通讯,比如访问百 ...
- 你真的会玩SQL吗?简单的数据修改
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 利用Chrome插件向指定页面植入js,劫持 XSS
资源来自:http://www.2cto.com/Article/201307/225986.html 首页 > 安全 > 网站安全 > 正文 利用Chrome插件向指定页面植入js ...
- Django:之传递数据给JS、Ajax和Ajax CSRF认证
Django传递数据给JS 有时候我们想把一个list或者dict传递给javascript,处理后显示到网页上,比如要用js进行可视化到数据. 请注意:如果是不处理,直接显示在网页上,用Django ...
- 本地修改js代码并时时生效的解决办法
js作为客户端语言(当然它也可以作服务端语言),非常强悍,一般情况下,我们都是在开发阶段不停的改,然后上线之后就作为稳定运行的代码. 然而有时候可能因为js写得有问题,导致上线后,某些功能无法使用,这 ...
- DataTable数据修改,换列
增加列 DataTable table= new DataTable(); table.Columns.Add("ID", type ...
- Oracle中使用游标获取指定数据表的所有字段名对应的字符串
操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR( ...
随机推荐
- Python数据分析之Pandas操作大全
从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...
- Python读取MNIST数据集
MNIST数据集获取 MNIST数据集是入门机器学习/模式识别的最经典数据集之一.最早于1998年Yan Lecun在论文: Gradient-based learning applied to do ...
- video标签 在微信浏览器打开,不弹出大的独立窗口 而是直接播放。
1.在 video 标签中添加 属性 x5-playsinline playsinline webkit-playsinline="true" 2.ckplayer的 ...
- echarts做飞线图
先上图,要不感觉没有说服力: 飞线图应该是大屏中很常见的一种了,通常你可以很轻易的用datav做一个飞线图,而且datav做的大屏逼格真的很高,本身也是开源免费的项目,开箱即用,上手简单……行了回归正 ...
- Linux--如何通过图形界面选项快速更改ubuntu的窗口、图标、分辨率大小,超详细超实用~(适合所有人群)
这是默认ubuntu给出的分辨率大小:800*600,说实话有点小不适合操作. (分辨率800*600) 这是调整后的分辨率大小. (分辨率1400*900) 操作方法: 首先点击选项框中的设置图标- ...
- 「AHOI2014/JSOI2014」宅男计划
「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...
- CSS各种小技巧
/* *背景的透明度设置 */ -moz-opacity: 0.8; opacity:.80; filter: alpha(opacity=80); 待续...
- Python 基础之面向对象之异常处理
一.认识异常 1.常用异常报错的错误类型 IndexError 索引超出序列的范围 KeyError 字典中查找一个不存在的关键字 Na ...
- iOS中常用的手势
--前言 智能手机问世后的很长一段时间,各大手机厂商都在思考着智能手机应该怎么玩?也都在尝试着制定自己的一套操作方式.直到2007年乔布斯发布了iPhone手机,人们才认识到智能手机就应该这样玩. 真 ...
- Topcoder SRM 590 Fox And City
Link 注意到原图给的是一个无向连通图. 如果在原图中两点之间有一条无向边,那么这两点到\(1\)的距离之差不大于\(1\). 这个命题的正确性是显然的,我们考虑它的逆命题: 给定每个点到\(1\) ...