前言

在上一篇文章中,我们介绍了 如何通过 mitmproxy 的本地捕获代理模式,获取 OpenCode 发起的 AI API 请求的详细信息

本文将介绍另一种方式——通过 常规(HTTP)代理模式 来实现相同的目标。

一.启动 mitmproxy 常规(HTTP)代理

1.1 配置文件方式(推荐)

为了便于维护和管理,建议创建配置文件 ~/.mitmproxy/config.yaml ,将代理服务器的配置项持久化保存。这样可以避免每次启动时输入大量命令行参数。

# ==========代理模式配置==========
# 要生成的代理服务器类型。可以多次传递。Mitmproxy 支持 "regular"(HTTP)、"local"、"transparent"、"socks5"、"reverse:SPEC"、"upstream:SPEC "和 "wireguard[:PATH]"代理服务器。默认值:['regular']
mode:
  - regular
# 绑定代理服务器的端口(可根据具体模式重设,参见 `mode`)。默认情况下,端口与模式有关。默认的常规 HTTP 代理服务器端口为 8080。默认值:None
listen_port: 8080
# 网络用户界面端口。默认值:8081
web_port: 8081

# ==========安全与连接配置==========
# 使用主机头来构建要显示的 URL。
# 此选项默认已禁用,因为恶意应用程序可能会发送误导性的主机头来规避您的分析。如果不担心此问题,请启用此选项以获得更好的流量显示。
showhost: true
# 不验证上游服务器的 SSL/TLS 证书。如果启用此选项,将跳过证书验证,而 mitmproxy 本身将容易受到 TLS 拦截的攻击
ssl_insecure: true
# 上游证书。连接到上游服务器以查询证书详细信息。默认值:True
upstream_cert: false
# 连接策略。设置为懒惰时,mitmproxy 会尽量推迟建立上游连接。这样就可以在离线时使用服务器重放。选项:eager, lazy。默认值:eager
connection_strategy: lazy
# 忽略主机列表,转发所有流量而不进行处理。
ignore_hosts: []

# ==========TLS 版本配置(放宽限制以提高兼容性)==========
# 设置客户端连接的最小 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。选项值:UNBOUNDED, SSL3, TLS1, TLS1_1, TLS1_2, TLS1_3。默认值:TLS1_2
tls_version_client_min: UNBOUNDED
# 设置客户端连接的最大 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。默认值:UNBOUNDED
tls_version_client_max: UNBOUNDED
# 设置服务器连接的最小 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。默认值:TLS1_2
tls_version_server_min: UNBOUNDED
# 设置服务器连接的最大 TLS 版本。UNBOUNDED、SSL3、TLS1 和 TLS1_1 是不安全的。默认值:UNBOUNDED
tls_version_server_max: UNBOUNDED

# ==========日志配置==========
# 日志详细程度。选项:error, warn, info, alert, debug。默认值:info
termlog_verbosity: debug
# 事件日志详细程度。选项:error, warn, info, alert, debug。默认值:info
console_eventlog_verbosity: debug
# 在流程列表中显示的列。
web_columns:
  - timestamp
  - tls
  - icon
  - path
  - method
  - status
  - size
  - time

配置完成后,只需在命令行运行以下命令即可启动 mitmproxy

mitmweb

启动后,系统会自动打开 Web 管理界面,访问地址为:http://127.0.0.1:8081
在这里插入图片描述

二.下载并安装 mitmproxy 的 CA 证书

由于 mitmproxy 需要解密 HTTPS 流量,因此必须安装其 CA 证书才能正常工作。以下是详细步骤:

2.1 配置浏览器代理

首先,设置浏览器的 HTTP 代理:

  • 代理地址127.0.0.1
  • 代理端口8080(即前面配置文件中 listen_port 的值)
    在这里插入图片描述

2.2 下载并安装证书

  1. 重启浏览器(确保代理设置生效)
  2. 访问证书下载页面:https://mitm.it/
  3. 根据你的操作系统下载对应的证书
  4. 安装证书时,务必选择"受信任的根证书颁发机构"存储位置
    在这里插入图片描述

重要提示:证书安装完成后,建议再次重启浏览器,确保证书生效。

三、以代理方式启动并使用 OpenCode

在启动 OpenCode 之前,需要配置环境变量,使其流量通过 mitmproxy 代理。请按照以下步骤操作:

3.1 配置环境变量

打开命令提示符(CMD)或 PowerShell,依次执行以下命令:

Windows CMD:

set NODE_TLS_REJECT_UNAUTHORIZED=0
set PYTHONHTTPSVERIFY=0
set HTTP_PROXY=http://127.0.0.1:8080
set HTTPS_PROXY=http://127.0.0.1:8080

Windows PowerShell:

$env:NODE_TLS_REJECT_UNAUTHORIZED="0"
$env:PYTHONHTTPSVERIFY="0"
$env:HTTP_PROXY="http://127.0.0.1:8080"
$env:HTTPS_PROXY="http://127.0.0.1:8080"

说明

  • NODE_TLS_REJECT_UNAUTHORIZED=0:禁用 Node.js 的 TLS 证书验证
  • PYTHONHTTPSVERIFY=0:禁用 Python 的 HTTPS 证书验证
  • HTTP_PROXYHTTPS_PROXY:设置代理服务器地址

3.2 启动 OpenCode

在同一个命令行窗口中,运行 OpenCode

opencode

启动后,选择大语言模型,输入提示词,按回车键发送请求。
在这里插入图片描述

四、查看捕获的流量

OpenCode 发起 API 请求后,可以在 mitmproxyWeb 界面中查看捕获的所有流量。以下是关键信息的查看方法:

4.1 关键信息位置

  • URL:在请求详情中查看完整的 API 端点路径
  • 请求头(Headers):检查 Headers 部分,重点关注 AuthorizationContent-Type 等关键字段
  • 请求体(Request Body):对于 POST 请求,在 Request Body 中查看 JSON 或表单数据
  • 响应(Response):在 Response 标签页中查看状态码、响应头和返回的 JSON 数据

4.2 示例:生成会话标题的请求

以下是生成会话标题的请求和响应示例:
在这里插入图片描述
在这里插入图片描述

4.3 示例:会话请求

以下是实际会话的请求和响应示例:
在这里插入图片描述
在这里插入图片描述

五、进阶技巧与注意事项

5.1 处理 HTTPS 流量解密问题

如果遇到 HTTPS 请求显示为乱码或无法解密的情况,请检查以下几点:

  1. 证书安装:确保已正确安装 mitmproxyCA 证书,并设置为"受信任的根证书颁发机构"
  2. 证书信任:确保系统或应用程序( OpenCode )信任该证书,否则可能出现 TLS 拦截失败
  3. 证书下载:访问 https://mitm.it/ 下载对应平台的证书(支持 Windows、macOS、Android、iOS

5.2 保存与分析捕获的数据

mitmproxy 提供了多种方式保存捕获的流量数据:

方法一:命令行参数

mitmweb --save-flows flows.json

方法二:Web 界面导出

Web 管理界面中,使用导出功能将会话保存为文件(如 flows.json)。

方法三:Python 脚本解析

导出后,可以使用 Python 脚本解析文件,提取结构化数据供进一步分析:

import json

with open('flows.json', 'r') as f:
    flows = json.load(f)
    for flow in flows:
        print(f"URL: {flow['request']['url']}")
        print(f"Method: {flow['request']['method']}")

5.3 自动化与高级过滤

可以通过编写 mitmproxy 脚本(Python)实现自动过滤和捕获目标请求:

def request(flow):
    """
    自动捕获 OpenCode API 请求
    """
    if "api.opencode.ai" in flow.request.url:
        print(f"捕获到请求: {flow.request.url}")
        print(f"请求头: {flow.request.headers}")
        print(f"请求体: {flow.request.content}")

使用方法:

mitmweb -s filter_script.py

通过正则表达式或域名匹配,可以精准捕获特定的 API 路径。

5.4 注意事项与合规性

在使用 mitmproxy 捕获流量时,请注意以下事项:

  1. 遵守服务条款:确保操作符合 OpenCode 的服务条款,仅用于合法调试或学习目的
  2. 数据安全:避免拦截敏感或个人数据,建议在测试环境中进行
  3. 双向 TLS:如果 API 使用双向 TLS 或其他加密机制,需要额外配置客户端证书
  4. 隐私保护:不要分享或公开包含敏感信息的流量数据
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐