API Tutorials

CaptchaAI API 的代理验证方法

代理配好了,token 却还是被拒绝?问题通常不在代理本身,而是参数格式或白名单漏配了。CaptchaAI 支持提交任务时附带你自己的代理,让 token 和加载页面的出口 IP 保持一致——Turnstile 这类验证码尤其依赖这一点。


什么时候必须为 CaptchaAI 配置代理

不是每次提交任务都要带代理——多套一层代理只会增加延迟。先看你要解决的验证码类型是否会校验来源 IP:

  • 标准 reCAPTCHA v2:通常不需要,token 在任何 IP 下都可用
  • reCAPTCHA v3:可选,分数可能与 IP 相关
  • Cloudflare Turnstile:推荐,token 与 IP 绑定
  • Cloudflare 验证挑战:必需,挑战与来源 IP 绑定
  • IP 绑定会话:必需,token 会校验来源 IP

常见报错与排查

先知道会踩哪些坑,再往下配置:

报错/现象 原因 处理方式
ERROR_PROXY_NOT_AUTHORIZED 凭据错误,或 IP 未加入白名单 核对代理账号密码;把 CaptchaAI 的 IP 加入白名单
ERROR_PROXY_CONNECTION_FAILED CaptchaAI 连不上这个代理 确认代理能被外部 IP 访问
token 被目标站点拒绝 代理出口 IP 和加载页面的 IP 不一致 两边用同一个粘性会话
带代理后识别明显变慢 代理本身增加了链路延迟 接受这个延迟,或换更快的代理
ERROR_BAD_PARAMETERS proxy 字符串格式不对 host:port:user:pass

常见问题

CaptchaAI 支持哪些代理协议?

HTTP、HTTPS、SOCKS4、SOCKS5;IP 白名单只留 host:port

为什么 IP 白名单代理还会报 ERROR_PROXY_NOT_AUTHORIZED?

多半是漏了 CaptchaAI 的服务器 IP——白名单要两边都加,不只加自己的出口 IP。

出海团队测试海外站点,代理和页面 IP 不一致会怎样?

token 大概率被拒绝,两端用同一个粘性会话即可修复。

配置代理会不会让识别变慢?

会有一点延迟,在正常耗时基础上大约增加 2–5 秒,属于可接受范围。

国内代理服务商的代理能给 CaptchaAI 用吗?

能,只要协议是 HTTP/HTTPS/SOCKS4/SOCKS5 之一,按上面格式拼好 proxy 字段即可。


代理参数格式速查

proxy 参数配 proxytype

代理类型 代理格式 例子
HTTP host:port:user:pass proxy.com:8080:user:pass
HTTPS host:port:user:pass proxy.com:8443:user:pass
SOCKS4 host:port:user:pass proxy.com:1080:user:pass
SOCKS5 host:port:user:pass proxy.com:1080:user:pass
IP 白名单 host:port proxy.com:8080

IP 白名单只留 host:port,其余三种要拼上 user:pass


四种认证方式怎么配置

核心逻辑一样:提交任务 → 轮询 res.php → 拿到 token,区别只在 proxy 怎么拼。

1. 用户名/密码认证(HTTP)

import requests
import time

CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"


def solve_with_http_proxy(site_url, sitekey, proxy_host, proxy_port,
                           proxy_user, proxy_pass):
    """Pass HTTP proxy to CaptchaAI for IP-matched solving."""
    proxy_param = f"{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}"

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "proxy": proxy_param,
        "proxytype": "HTTP",
        "json": 1,
    })

    data = resp.json()
    if data["status"] != 1:
        raise Exception(f"Submit: {data['request']}")

    task_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        })
        data = resp.json()
        if data["request"] == "CAPCHA_NOT_READY":
            continue
        if data["status"] == 1:
            return data["request"]
        raise Exception(f"Solve: {data['request']}")

    raise TimeoutError("Timeout")


# Usage
token = solve_with_http_proxy(
    site_url="https://example.com/form",
    sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    proxy_host="proxy.example.com",
    proxy_port=8080,
    proxy_user="myuser",
    proxy_pass="mypass",
)

2. 用户名/密码认证(SOCKS5)

proxytype 换成 SOCKS5

def solve_with_socks5_proxy(site_url, sitekey, proxy_host, proxy_port,
                             proxy_user, proxy_pass):
    """Pass SOCKS5 proxy to CaptchaAI."""
    proxy_param = f"{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}"

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "proxy": proxy_param,
        "proxytype": "SOCKS5",
        "json": 1,
    })

    data = resp.json()
    task_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = resp.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("Timeout")

3. IP 白名单认证(无需用户名/密码)

部分代理商只认 IP 白名单:

def solve_with_whitelisted_proxy(site_url, sitekey, proxy_host, proxy_port):
    """Proxy with IP whitelist — no username/password."""
    proxy_param = f"{proxy_host}:{proxy_port}"

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "proxy": proxy_param,
        "proxytype": "HTTP",
        "json": 1,
    })

    data = resp.json()
    task_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        resp = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
            "key": CAPTCHAAI_KEY, "action": "get",
            "id": task_id, "json": 1,
        })
        data = resp.json()
        if data["request"] != "CAPCHA_NOT_READY":
            return data["request"]

    raise TimeoutError("Timeout")

重要提示: 记得把 CaptchaAI 服务器 IP 也加入白名单——是它主动连你的代理,两边都要配置。

4. HTTPS(CONNECT)代理

proxytype 设为 HTTPS,其余一样:

def solve_with_https_proxy(site_url, sitekey, proxy_host, proxy_port,
                            proxy_user, proxy_pass):
    proxy_param = f"{proxy_host}:{proxy_port}:{proxy_user}:{proxy_pass}"

    resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data={
        "key": CAPTCHAAI_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": site_url,
        "proxy": proxy_param,
        "proxytype": "HTTPS",
        "json": 1,
    })

    # ... same polling logic ...

Node.js 版本示例

const axios = require("axios");

const CAPTCHAAI_KEY = "YOUR_API_KEY";
const API = "https://ocr.captchaai.com";

async function solveWithProxy(siteUrl, sitekey, proxyConfig) {
  const params = {
    key: CAPTCHAAI_KEY,
    method: "userrecaptcha",
    googlekey: sitekey,
    pageurl: siteUrl,
    proxy: `${proxyConfig.host}:${proxyConfig.port}:${proxyConfig.user}:${proxyConfig.pass}`,
    proxytype: proxyConfig.type || "HTTP",
    json: 1,
  };

  const submit = await axios.post(`${API}/in.php`, null, { params });
  const taskId = submit.data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));

    const result = await axios.get(`${API}/res.php`, {
      params: { key: CAPTCHAAI_KEY, action: "get", id: taskId, json: 1 },
    });

    if (result.data.request === "CAPCHA_NOT_READY") continue;
    if (result.data.status === 1) return result.data.request;
  }

  throw new Error("Timeout");
}

// Usage
const token = await solveWithProxy(
  "https://example.com/form",
  "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
  {
    host: "proxy.example.com",
    port: 8080,
    user: "myuser",
    pass: "mypass",
    type: "HTTP", // HTTP, HTTPS, SOCKS4, or SOCKS5
  }
);

主流代理服务商的格式示例

# Bright Data
proxy = "brd.superproxy.io:22225:brd-customer-ID-zone-residential:PASSWORD"
proxytype = "HTTP"

# Smartproxy
proxy = "gate.smartproxy.com:10001:spuser:sppassword"
proxytype = "HTTP"

# Oxylabs
proxy = "pr.oxylabs.io:7777:customer-USERNAME:PASSWORD"
proxytype = "HTTP"

相关指南


把你自己的代理传给 CaptchaAI,就能拿到和目标页面 IP 匹配的验证码 token —— 获取你的 API Key

该文章已禁用评论。