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的urllib模块显示下载进度示例
Jan 17 Python
Python3 正在毁灭 Python的原因分析
Nov 28 Python
python实现给数组按片赋值的方法
Jul 28 Python
python字符串的常用操作方法小结
May 21 Python
python查看微信好友是否删除自己
Dec 19 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
对python的输出和输出格式详解
Dec 08 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
Python3 A*寻路算法实现方式
Dec 24 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
python计算auc的方法
Sep 09 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
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
json 实例详细说明教程
2009/10/31 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
asp.net网站开发中用jquery实现滚动浏览器滚动条加载数据(类似于腾讯微博)
2012/03/14 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
Python中用于计算对数的log()方法
2015/05/15 Python
基于python的多进程共享变量正确打开方式
2018/04/28 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
耐克美国官网:Nike.com
2016/08/01 全球购物
医学生求职自荐信
2013/10/25 职场文书
青年教师培训方案
2014/02/06 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
个人债务授权委托书
2014/10/17 职场文书
汽车销售员工作总结
2015/08/12 职场文书
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js