在软件开发和网络调试过程中,抓包工具是不可或缺的。传统的抓包工具如Fiddler或Charles Proxy通常需要设置系统代理,这会抓到其他应用程序的网络连接,需要设置繁琐的过滤,导致不必要的干扰。为了解决这个问题,我们可以利用Qt的QWebView内嵌浏览器配合mitmproxy进行网络调试,从而实现更加灵活和高效的抓包体验。
什么是mitmproxy?
mitmproxy
是一个开源的交互式中间人代理工具,它允许用户拦截、查看和修改网络流量。它主要用于开发、测试和调试网络应用,以及进行安全研究。mitmproxy
提供了丰富的Python API,用户可以编写自定义脚本来处理网络流量。
为什么选择Qt的QWebView?
Qt是一个跨平台的C++应用程序开发框架,广泛用于桌面和移动应用开发。QWebView是Qt提供的一个组件,可以方便地嵌入到应用程序中,实现内嵌浏览器功能。使用QWebView的好处在于:
- 灵活性:QWebView可以轻松嵌入到任何Qt应用程序中,无需额外配置系统代理。
- 隔离性:内嵌浏览器不会影响其他应用程序的网络连接,避免了不必要的干扰。
- 可定制性:Qt提供了丰富的API,可以对QWebView进行深度定制,满足各种需求。
准备工作
1.安装python3.8及以上版本。
2.安装mitmproxy ,使用pip安装mitmproxy:
pip install mitmproxy
#如果速度慢,可用镜像源方式
pip install --index-url https://mirrors.aliyun.com/pypi/simple/ mitmproxy
3.pip镜像源的更改。
默认pip安装软件包比较慢,修改其为国内镜像源。方式有几种。上述的方式仅pip install 命令有效,且需要输入那么长一串。还用个办法是写入配置文件。
你可以编辑pip的配置文件。在Windows系统中,pip的配置文件位于用户的主目录下,路径通常是C:\Users\<username>\pip\pip.ini。如果文件不存在,你可以手动创建。
在Linux或macOS系统中,配置文件通常位于~/.config/pip/pip.conf。同样,如果文件不存在,你可以手动创建。
配置文件的内容可以如下所示:
[global]
index-url = http://mirrors.tencentyun.com/pypi/simple
trusted-host = mirrors.tencentyun.com
这样设置后,每次使用pip安装包时都会默认使用配置的镜像源。
工具实现原理
1.配置QWebView:在Qt应用程序中,配置QWebView使用mitmproxy作为代理。可以通过设置网络请求的代理来实现:
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtCore import QUrl
from PyQt5.QtNetwork import QNetworkProxy
app = QApplication([])
view = QWebEngineView()
# 设置代理
proxy = QNetworkProxy()
proxy.setType(QNetworkProxy.HttpProxy)
proxy.setHostName("127.0.0.1")
proxy.setPort(8080) # mitmproxy默认端口
QNetworkProxy.setApplicationProxy(proxy)
view.load(QUrl("http://example.com"))
view.show()
app.exec_()
2.编写mitmproxy脚本:编写一个mitmproxy脚本,用于拦截和处理网络流量。例如,以下脚本可以拦截包含“video”关键字的请求和响应,并将视频URL发送到Qt应用程序:
from mitmproxy import http
import socket
def request(flow: http.HTTPFlow) -> None:
if "video" in flow.request.pretty_url:
print(f"Detected video request: {flow.request.pretty_url}")
def response(flow: http.HTTPFlow) -> None:
if "video" in flow.response.headers.get("Content-Type", ""):
video_url = flow.request.pretty_url
print(f"Detected video response: {flow.response.headers.get('Content-Type')}")
print(f"Found video URL: {video_url}")
send_to_qt(video_url)
def send_to_qt(video_url):
host = '127.0.0.1'
port = 12345
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(video_url.encode())
3.运行Qt应用程序:
启动Qt应用程序,确保QWebView已经配置好代理,并加载目标网页。程序内部自动调用并打开mitmproxy。此时,mitmproxy会拦截并处理网络流量,根据脚本逻辑进行相应的操作。
优点总结
- 灵活性:使用QWebView内嵌浏览器,无需修改系统代理,避免了其他应用的干扰。
- 隔离性:内嵌浏览器不会影响其他应用程序的网络连接,确保调试环境的纯净。
- 可定制性:Qt提供了丰富的API,可以对QWebView进行深度定制,满足各种需求。
- 高效性:mitmproxy提供了强大的脚本支持,可以自动化处理网络流量,提高调试效率。
通过结合Qt的QWebView和mitmproxy,成功地创建了一个基于Qt的网络调试工具,它能够精确地抓取和分析Qt应用的网络请求,而不会受到其他应用的干扰。这种方法不仅提高了调试效率,还降低了系统代理设置带来的潜在风险,为软件开发人员提供了一种更为灵活和可控的网络调试手段。
http接口调试
使用该工具调试http接口也是相当的简单。不但可以调试,还可以抓包监控接口通信的每一个细节。是不是该工具有强大的接口调试页面?没必要,采用开源免费的http在线调试工具hoppscotch就行了。
hoppscotch介绍
Hoppscotch 是一个开源的、轻量级的 API 开发工具,它允许开发者通过直观的用户界面来创建和测试 HTTP 请求。Hoppscotch 的前身是 Postwoman,后来改名为 Hoppscotch。它可以直接在浏览器中使用,无需安装任何软件,因此非常方便。
Hoppscotch 的主要特点包括:
- 开源: 代码托管在 GitHub 上,任何人都可以查看、使用和贡献代码。
- 免费: 使用 Hoppscotch 是完全免费的,没有任何隐藏费用。
- 轻量级: 界面简洁,加载速度快,不会占用太多系统资源。
- 跨平台: 可以在任何支持现代浏览器的设备上使用。
- 支持多种请求方法: 包括 GET、POST、PUT、DELETE 等。
- 支持多种认证方式: 如 Basic Auth、Bearer Token、OAuth 等。
- 环境变量: 可以设置和管理不同的环境变量,方便在不同环境中切换。
- 历史记录: 保存请求历史,方便重复使用。
总之,Hoppscotch 是一个功能强大且免费的 API 调试工具,适合开发者进行快速、高效的 API 测试。只需要在地址栏中输入 :
https://hoppscotch.io/
http接口调试界面就有了。
Hoppscotch • Open source API development ecosystem
HTTPie介绍
类似好用的在线api调试工具还有HTTPie,但它也提供了一个网页界面(HTTPie for Web),可以让你在浏览器中发送 HTTP 请求。它支持多种请求方法,并且有一个简洁的用户界面。我喜欢这个,因为界面更好看😄。
网址: https://httpie.io/
HTTPie 还有强大的命令行的使用方式,在各个平台都能下载使用,比如python环境下
pip install httpie
它比curl的命令行好用和简单多了。用法:
http [方法] URL [请求项…]
http GET http://localhost:8083/getdemo username==admin password==123456
post:
http --form POST localhost:8083/postdemo2 username='admin' password='123456'
#post json
http POST localhost:8083/header Content-Type:application/json username=admin password=123456
其他资源
Index of /qt/archive/online_installers/4.6/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror