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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
Python中的自定义函数学习笔记
Sep 23 Python
python获取标准北京时间的方法
Mar 24 Python
使用Python操作excel文件的实例代码
Oct 15 Python
深入理解Python中的 __new__ 和 __init__及区别介绍
Sep 17 Python
Python 线程池用法简单示例
Oct 02 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
Nov 07 Python
python matplotlib包图像配色方案分享
Mar 14 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
Sep 04 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
python用Configobj模块读取配置文件
Sep 26 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
Dec 03 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
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
浅析return false的正确使用
2013/11/04 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
如何判断微信内置浏览器(通过User Agent实现)
2014/09/01 Javascript
jQuery中:reset选择器用法实例
2015/01/04 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
jQuery设计思想
2017/03/07 Javascript
js数字滑动时钟的简单实现(示例讲解)
2017/08/14 Javascript
Angular实现图片裁剪工具ngImgCrop实践
2017/08/17 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
python自动化报告的输出用例详解
2018/05/30 Python
python使用matplotlib绘制热图
2018/11/07 Python
python梯度下降算法的实现
2020/02/24 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
美术师范毕业生自荐信
2013/11/16 职场文书
退伍老兵事迹材料
2014/01/31 职场文书
《石榴》教学反思
2014/03/02 职场文书
教师节宣传方案
2014/05/23 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
信用卡工作证明范本
2015/06/19 职场文书
三八节祝酒词
2015/08/11 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers