Tutorials

使用 Charles 代理调试 CAPTCHA API 调用

验证码 API 报错时,日志通常只告诉你哪一步失败,却看不到实际发出的 HTTP 请求。更快的办法是用 Charles Proxy 抓一次包——请求头、请求体、响应内容和每一跳耗时一目了然,几秒就能看出到底是参数传错、sitekey 提取失败,还是网络问题。


一个国内常见场景:reCAPTCHA 请求为什么总是超时

国内开发者最常遇到的不是 CaptchaAI 报错,而是轮询迟迟拿不到结果。打开 Charles 看一眼:ocr.captchaai.com 耗时正常(几十到几百毫秒)就说明 CaptchaAI 没问题,真正卡住的多半是浏览器加载 reCAPTCHA 资源那一步——资源托管在 Google,国内访问本身不稳定。国内常见的 GeeTest(极验)不用连 Google,两条链路的排查思路并不一样。

提示:先看 ocr.captchaai.com 耗时,能省掉大半排查时间。


环境准备:让 Charles 接管你的请求

步骤一:安装 Charles Proxy

Charles 官网 下载,支持 Win/Mac/Linux。

步骤二:开启 SSL 抓包

CaptchaAI 走 HTTPS,需要两步。

添加代理规则

  • ProxySSL Proxying SettingsAdd
  • Host 填 ocr.captchaai.com,Port 填 443

安装并信任证书

  • HelpSSL ProxyingInstall Charles Root Certificate
  • 在系统证书库里信任该证书

步骤三:让代码走 Charles 代理

Charles 默认监听 localhost:8888

Python:

import requests

proxies = {
    "http": "http://localhost:8888",
    "https": "http://localhost:8888",
}

# Disable SSL verification for Charles (development only)
resp = requests.post(
    "https://ocr.captchaai.com/in.php",
    data={"key": "YOUR_API_KEY", "method": "userrecaptcha", "json": "1"},
    proxies=proxies,
    verify=False,
)

Node.js:

const axios = require('axios');
const HttpsProxyAgent = require('https-proxy-agent');

const agent = new HttpsProxyAgent('http://localhost:8888');

const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: { key: 'YOUR_API_KEY', method: 'userrecaptcha', json: 1 },
  httpsAgent: agent,
});

提交请求怎么核对(POST /in.php)

点开 /in.php 这条请求,核对以下几项:

  • Request → Headers:Content-Type 是否正确
  • Request → Body:必需参数是否齐全
  • Response → Body:成功时应返回 {"status":1,"request":"TASK_ID"}
  • Timing:请求耗时,正常应 < 1s

最容易漏掉的一项:请求体写成了 JSON 而不是表单数据——/in.php 只接受表单编码。

常见问题:

  • 缺少 method 参数 → 返回 ERROR_BAD_PARAMETERS
  • Content-Type 不对 → 参数没有被正确解析
  • googlekey 为空 → 返回 ERROR_WRONG_GOOGLEKEY

轮询请求怎么核对(GET /res.php)

  • 参数keyaction=getid=TASK_ID 是否都在
  • 响应:未完成时返回 CAPCHA_NOT_READY(继续轮询),完成后返回 {"status":1,"request":"TOKEN"}
  • 耗时:每次轮询的间隔应等于你在代码里设置的 sleep 时间,如果间隔忽长忽短,多半是重试逻辑有问题

常见故障速查

  • 代码里报 SSL 错误 → 证书不受信任 → 安装 Charles 根证书,开发阶段可先用 verify=False
  • Charles 里看不到请求 → 代码没走代理 → 在 requests / axios 配置里显式设置 proxy
  • HTTPS 响应乱码 → 没开 SSL 抓包 → 把 ocr.captchaai.com 加到 SSL Proxying Settings
  • 请求变慢了 → 断点还开着 → 不需要时记得关掉

调试常见问题

问题一:ERROR_WRONG_GOOGLEKEY

在 Charles 里打开提交请求的请求体,找到 googlekey 字段:

# What Charles shows:
key=YOUR_API_KEY&method=userrecaptcha&googlekey=&pageurl=https://example.com&json=1
                                      ^^^^^^^^ empty!

修复:上游 sitekey 提取逻辑有问题,检查提取代码。

问题二:token 被目标站点拒绝

先确认 token 本身没问题

  • 在 Charles 里找到 status: 1/res.php 响应
  • request 字段完整复制 token

再确认 token 用对了地方

  • 找到发往目标站点的后续请求
  • 确认表单字段名是 g-recaptcha-response,值和上一步一致

多数是变量没及时更新,用的还是旧 token。

问题三:请求一直超时

用 Charles 的 Sequence 视图看时间线:

POST /in.php     → 234ms ✓
GET  /res.php    → 189ms (CAPCHA_NOT_READY)
GET  /res.php    → 201ms (CAPCHA_NOT_READY)
GET  /res.php    → 195ms (CAPCHA_NOT_READY)
... 23 more ...
GET  /res.php    → 188ms (CAPCHA_NOT_READY)  ← never resolves

一直卡在 CAPCHA_NOT_READY:先确认 sitekey 和 pageurl 正确,再参考前文排查网络可达性。


Charles 进阶调试技巧

重复请求(Repeat)

右键请求 → Repeat 重新发送,测试轮询不用重跑整个脚本。

断点(Breakpoints)

  • ProxyBreakpoint SettingsAdd
  • Host 填 ocr.captchaai.com,Path 填 /in.php
  • 勾选 Request,代码发请求时会先暂停,可直接改参数再放行

调试完记得关掉断点——忘记关闭是"Charles 让请求变慢了"的常见原因。

Map Local(本地映射)

把 API 响应换成本地文件测试:

{"status": 1, "request": "mock_token_for_testing"}
  • ToolsMap LocalAdd
  • https://ocr.captchaai.com/res.php 映射到本地的 mock_response.json
  • 不消耗 API 额度即可测试提交代码

限速(Throttle)

  • ProxyThrottle Settings → 启用
  • 预设选 3GEDGE 速度,验证慢响应和超时处理

Charles 之外还能用什么抓包工具

工具 平台 HTTPS 费用
Charles Proxy Win/Mac/Linux 需要安装证书 付费(有免费试用)
mitmproxy Win/Mac/Linux 需要安装证书 免费
Fiddler Windows 内置 HTTPS 解密 免费
Proxyman macOS 一键完成 HTTPS 配置 免费增值

mitmproxy 快速上手

# Install
pip install mitmproxy

# Run
mitmproxy --listen-port 8080

# Configure Python
proxies = {"https": "http://localhost:8080"}

国内安装慢的话换清华 TUNA 镜像:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mitmproxy


常见问题

reCAPTCHA 相关请求经常超时,是网络问题还是 CaptchaAI 的问题?

先看 Charles 里的耗时。/in.php/res.php 都很快的话,卡点在浏览器加载 reCAPTCHA 资源,是网络问题,不是 CaptchaAI。

生产环境要不要一直开着 Charles?

不需要。它是开发调试工具,长期挂着会拖慢请求,生产环境用结构化日志和监控即可。

抓包看到的 token 和实际提交的不一样,怎么排查?

对比 /res.php 返回的完整 token 与表单请求里 g-recaptcha-response 字段,多数是变量没及时更新。


调试完,直接用 CaptchaAI 验证结果

CaptchaAI 官网 拿到 API Key,把这套抓包方法用到自己的集成里。


相关指南

该文章已禁用评论。