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 中__name__ = '__main__' 的作用
Jul 05 Python
Python中操作MySQL入门实例
Feb 08 Python
python检查指定文件是否存在的方法
Jul 06 Python
Python实现Youku视频批量下载功能
Mar 14 Python
python中format()函数的简单使用教程
Mar 14 Python
Python实现修改IE注册表功能示例
May 10 Python
python计算日期之间的放假日期
Jun 05 Python
深入理解Django自定义信号(signals)
Oct 15 Python
Python变量访问权限控制详解
Jun 29 Python
python selenium实现发送带附件的邮件代码实例
Dec 10 Python
python实现简易自习室座位预约系统
Jun 30 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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中的CMS的涵义
2007/03/11 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
使用jquery实现select添加实现后台权限添加的效果
2011/05/28 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[01:16:01]VGJ.S vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python切换hosts文件代码示例
2013/12/31 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python中matplotlib中文乱码解决办法
2017/05/12 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
python中的二维列表实例详解
2018/06/19 Python
python使用udp实现聊天器功能
2018/12/10 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
Python3实现将一维数组按标准长度分隔为二维数组
2019/11/29 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
2014年两会学习心得范例
2014/03/17 职场文书
《去年的树》教学反思
2014/04/11 职场文书
文秘个人求职信范文
2014/04/22 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL
利用Apache Common将java对象池化的问题
2022/06/16 Servers