Python3自定义http/https请求拦截mitmproxy脚本实例


Posted in Python onMay 11, 2020

脚本内容

代码如下:

from mitmproxy import http, ctx
from multiprocessing import Lock


class Filter:
  def __init__(self, filter_info):
    self.log_info = ""
    self.mutex = Lock()
    self.filter_info = filter_info
    self.response_file = None
    self.switch_on = False
    self.log_file = "log.txt"

  def log(self, info) -> None:
    self.log_info += f"{info}\n\n"

  def write_log(self, mode="w+") -> None:
    self.mutex.acquire()
    with open(self.log_file, mode) as f:
      f.write(self.log_info)
    self.mutex.release()

  def is_target_flow(self, flow: http.HTTPFlow) -> bool:
    for info in self.filter_info:
      if info["str_in_url"] in flow.request.url:
        self.log_file = info["log_file"]
        self.switch_on = info["switch_on"]
        if info["response_file"] != None:
          self.response_file = info["response_file"]
        return True
    else:
      return False

  def modify_response(self, flow: http.HTTPFlow) -> http.HTTPFlow:
    if self.switch_on and self.response_file:
      with open(self.response_file, "r") as f:
        flow.response.content = f.read().encode()
    return flow

  def request(self, flow: http.HTTPFlow) -> None:
    if self.is_target_flow(flow):
      self.log_info = ""
      self.log(f"——METHOD——\n{flow.request.method}")
      self.log(f"——HOST——\n{flow.request.pretty_host}")
      self.log(f"——URL——\n{flow.request.pretty_url}")
      query = [i + ":" + flow.request.query[i] + "\n" for i in flow.request.query]
      self.log(f"——QUERY STRING——\n{''.join(query)}")
      if flow.request.urlencoded_form:
        form = [i + ":" + flow.request.urlencoded_form[i] + "\n" for i in flow.request.urlencoded_form]
        self.log(f"——FORM——\n{''.join(form)}")
      self.write_log()

  def response(self, flow: http.HTTPFlow) -> None:
    if self.is_target_flow(flow):
      self.log_info = ""
      self.log(f"——RESPONSE before modified——\n{flow.response.content.decode()}")
      flow = self.modify_response(flow)
      self.log(f"——RESPONSE after modified——\n{flow.response.content.decode()}")
      self.write_log(mode="a")


filter_info = [
  {
    "str_in_url": "getSimpleNews",
    "log_file": "getSimpleNews_log.txt",
    "switch_on": True,
    "response_file": "getSimpleNews_response.txt",
  },
  {
    "str_in_url": "getQQNewsComment",
    "log_file": "getQQNewsComment_log.txt",
    "switch_on": True,
    "response_file": None,
  }
]
addons = [
  Filter(filter_info)
]

使用方法

运行mitmproxy指定使用该脚本和端口号即可:

mitmproxy -p 6666 -s xxx.py

在mitmproxy运行时:

1. 会拦截url中包含str_in_url字符串的请求

2. 会把response.content修改为当前mitm运行所在目录下的response_file文件中的内容

3. 打印信息在当前mitm运行所在目录下的log_file文件中

4. 如果无需修改response设置switch_on为False即为开关关闭

5. 如果不修改response的话response_file需要写None

补充知识:mitmproxy 监听指定端口

安装

使用python3的安装方式

https://mitmproxy.org/

监听指定端口

例子:Presto SQL请求的监听

Presto地址:http://datacenter4:18080

mitmproxy命令(端口8484)
mitmproxy \
--mode reverse:http://datacenter4:18080 \
--listen-host datacenter4 \
--listen-port 8484 \
--replacements :~s:\/\/datacenter4/:\/\/datacenter4:18080/

然后JDBC访问Presto使用:jdbc:presto://datacenter4:8484

效果

Python3自定义http/https请求拦截mitmproxy脚本实例

以上这篇Python3自定义http/https请求拦截mitmproxy脚本实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python端口扫描系统实现方法
Nov 19 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
numpy中矩阵合并的实例
Jun 15 Python
python 计算数据偏差和峰度的方法
Jun 29 Python
python3字符串操作总结
Jul 24 Python
python实现WebSocket服务端过程解析
Oct 18 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
在pycharm中创建django项目的示例代码
May 28 Python
使用Python实现音频双通道分离
Dec 25 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 #Python
Pycharm如何导入python文件及解决报错问题
May 10 #Python
python3.6环境下安装freetype库和基本使用方法(推荐)
May 10 #Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 #Python
python对接ihuyi实现短信验证码发送
May 10 #Python
python调用API接口实现登陆短信验证
May 10 #Python
aws 通过boto3 python脚本打pach的实现方法
May 10 #Python
You might like
星际争霸任务指南——虫族
2020/03/04 星际争霸
php set_time_limit()函数的使用详解
2013/06/05 PHP
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
Google 地图获取API Key详细教程
2016/08/06 Javascript
javascript操作cookie
2017/01/17 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
python操作excel的包(openpyxl、xlsxwriter)
2018/06/11 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
python分割一个文本为多个文本的方法
2019/07/22 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
美国在线纱线商店:Darn Good Yarn
2019/03/20 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
小学课外活动总结
2014/07/09 职场文书
文艺演出主持词
2015/07/01 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
浅谈Python数学建模之数据导入
2021/06/23 Python
一文搞懂Python Sklearn库使用
2021/08/23 Python