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操作日期和时间的方法
Mar 11 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
浅谈五大Python Web框架
Mar 20 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
django中静态文件配置static的方法
May 20 Python
Python 中导入csv数据的三种方法
Nov 01 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python框架flask表单实现详解
Nov 04 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
pycharm中import呈现灰色原因的解决方法
Mar 04 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
Jun 02 Python
keras K.function获取某层的输出操作
Jun 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
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
JS网页播放声音实现代码兼容各种浏览器
2013/09/22 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
python中的随机函数random的用法示例
2018/01/27 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
Python二进制文件读取并转换为浮点数详解
2019/06/25 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
阿波罗盒子:Apollo Box
2017/08/14 全球购物
总裁岗位职责
2013/12/04 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
新年爱情寄语
2014/04/08 职场文书
镇创先争优活动总结
2014/08/28 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
撤诉书怎么写
2015/05/19 职场文书
2015年度绩效考核工作总结
2015/05/27 职场文书
python tkinter模块的简单使用
2021/04/07 Python
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis