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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
探索Python3.4中新引入的asyncio模块
Apr 08 Python
Python中的高级函数map/reduce使用实例
Apr 13 Python
在Python 3中实现类型检查器的简单方法
Jul 03 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
Python的垃圾回收机制详解
Aug 28 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
python英语单词测试小程序代码实例
2019/09/09 Python
CSS Grid布局教程之网格单元格布局
2014/12/30 HTML / CSS
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
技术总监管理岗位职责
2014/03/09 职场文书
cf战队收人口号
2014/06/21 职场文书
小学师德师风演讲稿
2014/09/02 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
想要创业,那么你做好准备了吗?
2019/07/01 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
Python中使用ipython的详细教程
2021/06/22 Python