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之字典,你还记得吗?
Sep 20 Python
Python正则表达式匹配ip地址实例
Oct 09 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
python装饰器实例大详解
Oct 25 Python
PyQt编程之如何在屏幕中央显示窗体的实例
Jun 18 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
Python&Matlab实现灰狼优化算法的示例代码
Mar 21 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
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
利用js判断手机是否安装某个app的多种方案
2017/02/13 Javascript
JavaScript数据结构之二叉树的删除算法示例
2017/04/13 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python解惑之整数比较详解
2017/04/24 Python
Python 中字符串拼接的多种方法
2018/07/30 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
Python的缺点和劣势分析
2019/11/19 Python
python 实现list或string按指定分段
2019/12/25 Python
python实现简单学生信息管理系统
2020/04/09 Python
python三引号如何输入
2020/07/06 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
自荐信格式范文
2013/10/07 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
益达广告词
2014/03/14 职场文书
党员民主评议个人总结
2014/10/20 职场文书
优秀志愿者感言
2015/08/01 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸