当前位置: 首页 > news >正文

在PyCharm中直接启动mitmproxy并自动打开关闭系统代理

在这里插入图片描述

前言

在前面的文章中,有几篇是介绍mitmproxy 的。
这个mitmproxy 的确是个捕获数据的好工具,但在运行时候需要在命令行启动,这是很令人苦恼的。

之前也尝试过脱离命令行去启动mitmproxy在Python中启动mitmproxy,脱离命令行启动mitmproxy监听
但它是借助Python 中的 ossubprocess模块去执行Windows系统的cmd命令;
总觉得这不是个好方法,遂有此文。

在这篇文章中,我将介绍如何在PyCharm中直接启动mitmproxy,让你可以更加方便地使用这个强大的工具。

知识点

模块作用
mitmproxy免费和开源的交互式HTTPS代理
atexit程序在退出时的处理器
winprox通过Python模块函数和命令行编程来实现修改系统代理

如何在PyCharm中直接启动mitmproxy

  • 通过将命令行参数以逗号分隔,依次填写到mitmdump([]) 里面,可以在PyCharm中直接启动mitmproxy。

如何自动启动和关闭系统代理:

  • 通过使用winproxy库的ProxySetting类,可以方便地在Windows系统中启动和关闭系统代理。

如何使用atexit模块注册程序退出时的处理函数:

  • 通过atexit.register()函数,可以在程序退出时自动执行特定的清理操作,如关闭系统代理。

如何编写mitmproxy的数据捕获脚本:

  • 文章中提供了一个具体的脚本示例,展示了如何捕获和处理特定URL的HTTP响应。

实现

常规情况

现在项目只有一个script.py文件,它的内容为mitmproxy数据捕获的脚本。
代码来自于这篇文章,爬虫?不是,mitmproxy帮你采集微信公众号留言

script.py

from mitmproxy import http# 定义一个函数,用于处理每一个响应
def response(flow: http.HTTPFlow) -> None:# 判断响应的URL是否是公众号留言的URLif "https://mp.weixin.qq.com/mp/appmsg_comment?action=getcomment&scene=0" in flow.request.url:# 获取响应的数据包response = flow.response# 打印出响应的状态码和内容print(f"Status: {response.status_code}")print(f"Content: {response.content}")print(parse(data=response.text))def parse(data: str):"""解析留言流量包"""_data = defaultdict(list)try:for item in json.loads(data)['elected_comment']:_data['nick_name'].append(item['nick_name'])_data['content'].append(item['content'])_data['like_num'].append(item['like_num'])_data['province_name'].append(item['ip_wording']['province_name'])except (KeyError, json.decoder.JSONDecodeError):...finally:return _dataaddons = [response]

在这份代码中,一般的运行步骤是去命令行,输入

  • -p 9527 -q 这些参数可选~
mitmdump -s demo.py -p 9527 -q

这样一来一回,就不够便捷了。


在PyCharm运行

在这里,只需要将命令行参数以逗号分隔,依次填写到mitmdump([]) 里面即可。

就是这么简单!!!

from mitmproxy import http
from mitmproxy.tools.main import mitmdumpif __name__ == "__main__":# 运行 Mitmproxy,并传递命令行参数mitmdump(['-s', __file__, '-p', '9527', '-q'])

这里,需要注意一下的是,作为mitmproxy脚本,如果写的是类,则需要添加一行代码,

有class

顺序也很重要,必须要在if __name__ == '__main__':之前。

from mitmproxy.tools.main import mitmdumpclass ListenComment:def __init__(self):...def response(self, flow: mitmproxy.http.HTTPFlow):...addons = [ListenComment()]if __name__ == '__main__':mitmdump(['-s', __file__, '-q'])

实际案例

这里结合这一篇文章,【Python】Windows跟随程序启动和关闭系统代理

完成一个自动启动与关闭系统代理,且在PyCharm 执行的 mitmproxy 程序,极简到家了!!!

# -*- coding: utf-8 -*-
# Name:         mitm.py
# Author:       小菜
# Date:         2023/11/03 11:30
# Description:import atexit
import json
from collections import defaultdictimport mitmproxy.http
from mitmproxy.tools.main import mitmdump
from winproxy import ProxySettingps = ProxySetting()def set_proxy():"""设置系统代理"""ps.enable = Trueps.server = '127.0.0.1:9527'ps.registry_write()print('代理已经打开!')def close_proxy():"""关闭系统代理"""ps.enable = Falseps.registry_write()print('代理已经关闭!')class ListenComment:def __init__(self):self.map = {'liveObjectId': str(),'jsons': dict()}self.set = set()# 定义一个函数,用于处理每一个响应def response(self, flow: mitmproxy.http.HTTPFlow) -> None:# 判断响应的URL是否是公众号留言的URLif "https://mp.weixin.qq.com/mp/appmsg_comment?action=getcomment&scene=0" in flow.request.url:# 获取响应的数据包response = flow.response# 打印出响应的状态码和内容print(f"Status: {response.status_code}")print(f"Content: {response.content}")print(self.parse(data=response.text))def parse(self, data: str):"""解析留言流量包"""_data = defaultdict(list)try:for item in json.loads(data)['elected_comment']:_data['nick_name'].append(item['nick_name'])_data['content'].append(item['content'])_data['like_num'].append(item['like_num'])_data['province_name'].append(item['ip_wording']['province_name'])except (KeyError, json.decoder.JSONDecodeError):...finally:return _dataaddons = [ListenComment()]if __name__ == '__main__':# 打开代理set_proxy()# 注册清理函数atexit.register(close_proxy)mitmdump(['-s', __file__, '-p 9527', '-q'])

运行效果如下图所示:

在这里插入图片描述

总结

在本文中,我详细介绍了如何在PyCharm中直接启动mitmproxy,以及如何自动启动和关闭系统代理,无需再通过命令行。
这种方法不仅避免了频繁在命令行中输入命令的麻烦,而且通过自动管理系统代理,使得整个过程更加便捷和高效。
我还提供了具体的代码示例,以帮助读者朋友们更好地理解和实践。
希望这篇文章能对大家使用mitmproxy进行数据捕获的工作带来帮助,提高工作效率。

后话

本次分享到此结束,
see you~🎉🎉

相关文章:

  • 采用XML作为GUI描述语言
  • 本地idea远程调试服务器程序
  • 隐私安全|隐私安全已从国家法律法规转向商业企业应用,如何理解以及落地建设,相信大家正在经历隐私安全的困扰
  • 性能优于BERT的FLAIR:一篇文章入门Flair模型
  • MapReduce WordCount程序实践(IDEA版)
  • 使用vscode开发uniapp项目常用的辅助插件,提升开发效率
  • github使用教程
  • 【Redis】Redis实现分布式锁
  • COCOS2DX3.17.2 Android升级targetSDK30问题解决方案
  • 【技术干货】开源库 Com.Gitusme.Net.Extensiones.Core 的使用
  • c++类和对象
  • 算法与数据结构之链表
  • Web前端—网页制作(以“学成在线”为例)
  • python- 学生信息管理系统
  • Go Gin中间件
  • SegmentFault for Android 3.0 发布
  • 11111111
  • exports和module.exports
  • JavaScript类型识别
  • JavaScript实现分页效果
  • jquery cookie
  • mysql常用命令汇总
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 猴子数据域名防封接口降低小说被封的风险
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 手机端车牌号码键盘的vue组件
  • 我的面试准备过程--容器(更新中)
  • 详解NodeJs流之一
  • 写代码的正确姿势
  • 由插件封装引出的一丢丢思考
  • postgresql行列转换函数
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​你们这样子,耽误我的工作进度怎么办?
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (1)STL算法之遍历容器
  • (4)STL算法之比较
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (六)激光线扫描-三维重建
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • **CI中自动类加载的用法总结
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .Net面试题4
  • /var/log/cvslog 太大
  • @requestBody写与不写的情况