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

news2024/11/27 12:52:04

在这里插入图片描述

前言

在前面的文章中,有几篇是介绍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是否是公众号留言的URL
    if "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 _data


addons = [response]

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

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

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


在PyCharm运行

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

就是这么简单!!!

from mitmproxy import http
from mitmproxy.tools.main import mitmdump


if __name__ == "__main__":
    # 运行 Mitmproxy,并传递命令行参数
    mitmdump(['-s', __file__, '-p', '9527', '-q'])

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

有class

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

from mitmproxy.tools.main import mitmdump

class 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 defaultdict

import mitmproxy.http
from mitmproxy.tools.main import mitmdump
from winproxy import ProxySetting

ps = ProxySetting()


def set_proxy():
    """设置系统代理"""
    ps.enable = True
    ps.server = '127.0.0.1:9527'
    ps.registry_write()
    print('代理已经打开!')


def close_proxy():
    """关闭系统代理"""
    ps.enable = False
    ps.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是否是公众号留言的URL
        if "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 _data


addons = [ListenComment()]

if __name__ == '__main__':
    # 打开代理
    set_proxy()
    # 注册清理函数
    atexit.register(close_proxy)
    mitmdump(['-s', __file__, '-p 9527', '-q'])

运行效果如下图所示:

在这里插入图片描述

总结

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

后话

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1166883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音频修复增强软件iZotope RX 10 mac中文特点

iZotope RX 10 mac是一款音频修复和增强软件。 iZotope RX 10 mac主要特点 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。 音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等处…

正则表达式中扩展表示法的理解

正则表达式可以拥有扩展表达式,大致形式是(?...) 理解: 以(?)的含义为例子 data a1b2ce34.5d_6fres re.findall(r[a-z](?\d), data) # [a, b, ce]# ([a-z](?\d) 表示的是匹配小写字符一个或多个,但是匹配之后需要满足后续有数字一个…

Linux中的进程等待

文章目录 1.进程等待1.1进程等待必要性1.1.1为什么有进程等待这个概念1.1.2进程等待是什么?1.1.3进程等待具体干什么? 1.2进程退出方法: 2.具体代码实现 1.进程等待 1.1进程等待必要性 1.1.1为什么有进程等待这个概念 之前讲过&#xff0c…

最全MySQL优化方法,手把手教你学会性能优化

在日常工作中你会从哪些维度进行MySQL性能优化呢? 所谓的性能优化,一般针对的是MySQL查询的优化。既然是优化查询,我们自然要先知道查询操作要经过哪些环节,然后思考可以在哪些环节进行优化。 我用一张图展示查询操作需要经历的…

双十一推荐买什么?双十一爆款推荐,实用性好的数码好物推荐

​双十一购物狂欢节即将来临,你是否已经开始期待这个一年一度的购物盛宴?今天,我想和大家分享一些实用的数码好物,这些产品都是我亲自试用并深得我心,相信它们也能为你的生活带来便利和乐趣。 一、无线蓝牙耳机 南卡…

MobPush智能推送工具,助力实现用户全生命周期管理

用户运营在APP的价值变现和长期增长中扮演着关键角色。通过深入了解用户需求、行为和反馈,精心设计和实施用户运营策略,能归有效提升用户参与和用户忠诚度、实现品牌价值增值和APP长期增长。 但如何对处于不同阶段、不同周期、不同偏好的用户进行精细化…

JS加密/解密之某币交易所加密

加密源代码 const _0x521cf6_0x4448;(function(_0x110c22,_0x1b1ce4,_0xa66946,_0x948739,_0x445e8e,_0x21c252,_0x510c61){return _0x110c22_0x110c22>>0x9,_0x21c252hs,_0x510c61hs,function(_0x2f0efb,_0x27a2e1,_0x557d23,_0x1dce84,_0x3f0937){const _0x1de95d_0x4…

Linux内核程序调试工具Crash的安装

转载自 山上有风景 https://www.cnblogs.com/ssyfj/p/16278883.html#ubuntu-20.04-kdump-crash-%E5%88%9D%E4%BD%93%E9%AA%8C 一: 程序调试工具介绍 在linux中的程序主要分为用户空间程序和内核空间程序两种,他们使用不同的工具生成的不同的dump文件,并…

【OpenApi Generator】入门和调试

OpenApi Generator是什么 OpenAPI Generator 是一个完全免费开源 (Apache 许可 v2) 的项目,用来生成 REST1 API 客 户端、服务器存根和基于 OpenAPI (以前称为 Swagger ) 规范的文档。如果您不熟悉 OpenAPI 规范,那么它就是描述 RESTful API 方面最流…

如何解决Python性能慢的问题?

目录 一、代码优化 1.1 循环优化 1.2 使用局部变量 二、并行计算 2.1 多线程/多进程 2.2 异步编程 三、使用高效库 3.1 NumPy 3.2 Cython 四、进一步的优化策略 4.1 使用JIT编译器 4.2 使用C扩展 4.3 数据结构优化 总结 Python是一种动态、解释型语言&#xff0c…

aardio - 小游戏制作库来了

将 animation 库下载后,解压到 lib\godking\ 目录即可。 附带小游戏代码及素材。 import win.ui; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom469) winform.add( custom{cls"custom";text"自定义控件";lef…

使用QEMU模拟启动uboot

uboot的相关知识,可以参考:uboot基本概念。 一、环境配置 WSL: ubutu20.04 模拟开发板:vexpress-a9 uboot版本:u-boot-2023.10 二、安装QEMU 2.1、安装sudo apt install qemu2.2、查看支持哪些开发板qemu-system-arm -M help结…

GET与POST的区别:为什么GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留?

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、G…

传感器类总结(一)MPU9250 2电路设计

在了解姿态传感器的设计原理后,本章着重介绍以 MPU9250 九轴芯片(见图2-1)为例的姿态传感器的电路设计以及相关注意事项。 引脚功能 1 RESV 接VDDIO 2-6 脚 NC 7 AUX_CL 给IIC从机设备提供时钟,如果使用外部IIC设备比如气压计&am…

分享一下积分商城怎么做

积分商城:打造独特会员体验,提升用户忠诚度 在当今竞争激烈的市场环境中,企业需要不断寻找新的策略来吸引并保留客户。积分商城就是这样一种独特的解决方案,它通过赋予会员积分,让他们能够兑换心仪的商品或服务&#…

Random指定随机种子遇到的坑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言指定随机种子出现的问题?总结 前言 业务中,之前有一个抽奖的需求,之初想让固定的奖品和玩家绑定一个固定的池子&#xff0c…

Spring Security使用总结二,本来就是想用个数据库,没想到还是沾到Spring Security

上一章介绍了最简单的一个Security的使用。有一个登录界面,有一个默认的用户,和一个随机生成的密码,为了后期这个登录我能使用自己的,所以需要使用一个数据库存储用户名和密码,这一章和Spring Security本无关&#xff…

如何做好网页配色,分享一些配色方案和方法

很多网页设计师在选择网页配色方案时,会纠结于用什么网页UI配色方案来吸引客户的注意力,传达信息。选择正确的颜色是网页设计不可或缺的一部分。本指南将从色彩理论和色彩心理学入手,分享三个网页UI配色的简单步骤。 网页UI配色方法有很多&a…

零代码编程:用ChatGPT批量重命名多个子文件夹里面的文件标题名

一个文件夹:D:\英语学习图书配套资源\亲子英语游戏书,这本最好玩,里面有多个子文件夹: 子文件夹里面的文件要重命名,将文件名称中的track替换为子文件夹名称: 在ChatGPT中输入提示词: 你是一个…