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 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
在Python中处理XML的教程
Apr 29 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
python3.5仿微软计算器程序
Mar 30 Python
django站点管理详解
Dec 12 Python
Python中Proxypool库的安装与配置
Oct 19 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python pandas时序处理相关功能详解
Jul 03 Python
python中的函数递归和迭代原理解析
Nov 14 Python
如何卸载python插件
Jul 08 Python
史上最详细的Python打包成exe文件教程
Jan 17 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
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP 输出缓存详解
2009/06/20 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
jquery获取及设置outerhtml的方法
2015/03/09 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
详解Web使用webpack构建前端项目
2017/09/23 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
2019/05/22 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
python中子类继承父类的__init__方法实例
2016/12/15 Python
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
基于wxPython的GUI实现输入对话框(1)
2019/02/27 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
Python对列表的操作知识点详解
2019/08/20 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
Talbots官网:美国成熟女装品牌
2019/11/15 全球购物
企业承诺书格式
2014/05/21 职场文书
新闻编辑求职信
2014/07/13 职场文书
应届大学生求职信
2014/07/20 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
先进个人材料怎么写
2014/12/30 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python