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基础练习之几个简单的游戏
Nov 10 Python
Python3.6安装及引入Requests库的实现方法
Jan 24 Python
Python扩展内置类型详解
Mar 26 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
python实现按关键字筛选日志文件
Dec 24 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
Python常用数字处理基本操作汇总
Sep 10 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
python+selenium实现12306模拟登录的步骤
Jan 21 Python
Python趣味挑战之教你用pygame画进度条
May 31 Python
python数字转对应中文的方法总结
Aug 02 Python
python读取mat文件生成h5文件的实现
Jul 15 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获取文件名后缀常用方法小结
2015/02/24 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
2017/08/04 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
基于jquery的图片的切换(以数字的形式)
2011/02/14 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
javascript 实现map集合
2015/04/03 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
微信小程序中实现一对多发消息详解及实例代码
2017/02/14 Javascript
浅谈react.js 之 批量添加与删除功能
2017/04/17 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
js操作二进制数据方法
2018/03/03 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
一个超级简单的python web程序
2014/09/11 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python实现日常记账本小程序
2018/03/10 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
小学运动会口号
2014/06/07 职场文书
农业项目建议书
2014/08/25 职场文书
基层党组织整改方案
2014/10/25 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js