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 调用DLL操作抄表机
Jan 12 Python
Python实现3行代码解简单的一元一次方程
Aug 18 Python
详解Python装饰器由浅入深
Dec 09 Python
微信跳一跳自动运行python脚本
Jan 08 Python
对pandas中apply函数的用法详解
Apr 10 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
Dec 05 Python
python根据多个文件名批量查找文件
Aug 13 Python
python实现扫雷小游戏
Apr 24 Python
基于python实现检索标记敏感词并输出
May 07 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 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中$_SERVER的详细参数与说明
2008/07/29 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
php解析mht文件转换成html的实例
2017/03/13 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
nodejs之get/post请求的几种方式小结
2017/07/26 NodeJs
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
JS实现合并json对象的方法
2017/10/10 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
python中的yield使用方法
2014/02/11 Python
Python 的内置字符串方法小结
2016/03/15 Python
Python连接DB2数据库
2016/08/27 Python
教你学会使用Python正则表达式
2017/09/07 Python
python用户管理系统的实例讲解
2017/12/23 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
广告设计应届生求职信
2014/03/01 职场文书
预备党员期盼十八届四中全会召开思想汇报
2014/10/17 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android