Integrations

cURL + CaptchaAI:CLI 验证码解决

在 CI 流水线或终端里验证 sitekey 能不能被识别,往往用不上整套 SDK——一行 curl 命令就够了。CaptchaAI 的 REST API 是纯 HTTP 接口,配合 jq,就能在 shell 脚本、GitHub Actions、GitLab CI 里走完“提交 → 轮询 → 拿 token”整条链路。

下面这些 curl 命令都可以直接复制运行,本文覆盖:

  • 查询余额、提交并轮询 reCAPTCHA v2
  • 识别 Cloudflare Turnstile 与图片验证码
  • 封装成可复用的 bash 求解脚本
  • 批量处理一批 URL
  • Windows 下的 PowerShell 等价实现

准备工作

  • curl:任意较新版本,Linux/macOS 自带,Windows 10+ 也自带
  • jq(可选):用来解析 JSON 响应,省去肉眼读字符串
  • CaptchaAI API Key在这里获取

基础 API 调用

CaptchaAI 的核心接口只有两个:in.php 提交任务,res.php 查询结果。整体流程只有三步:

  1. 调用 in.php 提交任务,拿到任务 id
  2. 轮询 res.php,直到返回 OK| 开头的结果
  3. 把拿到的 token 用进你的表单或请求里

查询余额

curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=getbalance"

输出:1.234

提交 reCAPTCHA v2 任务

curl -s "https://ocr.captchaai.com/in.php?key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkS...&pageurl=https://example.com"

输出:OK|73548291

轮询识别结果

curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=73548291"

输出:OK|03AGdBq24PBCbw...(识别成功)或 CAPCHA_NOT_READY(还没出结果)。

轮询间隔建议 5 秒左右,太频繁请求容易被限流。

封装成可复用的 Bash 脚本

把提交和轮询封装成函数,比手敲两条 curl 省事。新建 solve_captcha.sh

#!/bin/bash
set -euo pipefail

API_KEY="${CAPTCHAAI_API_KEY:?Set CAPTCHAAI_API_KEY environment variable}"
BASE_URL="https://ocr.captchaai.com"

solve_recaptcha() {
    local site_key="$1"
    local page_url="$2"
    local timeout="${3:-300}"

    # Submit
    local response
    response=$(curl -s "${BASE_URL}/in.php?key=${API_KEY}&method=userrecaptcha&googlekey=${site_key}&pageurl=${page_url}")

    if [[ ! "$response" == OK|* ]]; then
        echo "ERROR: Submit failed: $response" >&2
        return 1
    fi

    local task_id="${response#OK|}"
    echo "Submitted task: $task_id" >&2

    # Poll
    local deadline=$((SECONDS + timeout))
    while (( SECONDS < deadline )); do
        sleep 5
        local result
        result=$(curl -s "${BASE_URL}/res.php?key=${API_KEY}&action=get&id=${task_id}")

        if [[ "$result" == "CAPCHA_NOT_READY" ]]; then
            echo "Waiting..." >&2
            continue
        fi

        if [[ "$result" == OK|* ]]; then
            echo "${result#OK|}"
            return 0
        fi

        echo "ERROR: Solve failed: $result" >&2
        return 1
    done

    echo "ERROR: Timeout after ${timeout}s" >&2
    return 1
}

# Usage: ./solve_captcha.sh SITE_KEY PAGE_URL
if [[ $# -ge 2 ]]; then
    solve_recaptcha "$1" "$2"
fi

赋予执行权限:

chmod +x solve_captcha.sh

运行:

export CAPTCHAAI_API_KEY="your_key_here"
./solve_captcha.sh "6Le-wvkS..." "https://example.com"

脚本打印到标准输出的就是最终 token,用变量接住即可拼进下一步请求。

识别 Cloudflare Turnstile

Turnstile 复用同一套 in.php / res.php 流程,只是 method 换成 turnstilegooglekey 换成 sitekey

curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=turnstile&sitekey=0x4AAAAA...&pageurl=https://example.com"

不同验证码类型对应的参数不一样,速查:

验证码类型 method 关键参数
reCAPTCHA v2 userrecaptcha googlekey, pageurl
Turnstile turnstile sitekey, pageurl
图片验证码 base64 / post body 或 file

识别图片验证码

图片类验证码(OCR、九宫格)把图片传给 CaptchaAI:可以 base64 内联,也可以直接上传文件。

小图片走 base64:

# Encode image to base64
IMAGE_B64=$(base64 -w 0 captcha.png)

# Submit
curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=base64&body=${IMAGE_B64}"

图片较大时改用 POST 上传,省去 base64 编码:

curl -s -X POST "https://ocr.captchaai.com/in.php" \
  -F "key=${CAPTCHAAI_API_KEY}" \
  -F "method=post" \
  -F "[email protected]"

一次搞定:识别 + 提交表单

一个脚本串起识别、轮询、提交表单,调用前面的 solve_captcha.sh

#!/bin/bash
# Solve CAPTCHA and submit form in one pipeline

API_KEY="${CAPTCHAAI_API_KEY}"
SITE_KEY="6Le-wvkS..."
TARGET_URL="https://staging.example.com/qa-login"

# Solve
TOKEN=$(./solve_captcha.sh "$SITE_KEY" "$TARGET_URL")

if [[ -z "$TOKEN" ]]; then
    echo "Failed to solve CAPTCHA"
    exit 1
fi

# Submit form with token
curl -s -X POST "$TARGET_URL" \
  -d "username=user" \
  -d "password=pass" \
  -d "g-recaptcha-response=${TOKEN}"

提醒: staging.example.com 只是占位示例,这类脚本只应指向你自己有权限访问的测试或 staging 环境,不要对未经授权的第三方登录页运行。

批量识别多个 URL

批量做 QA 回归测试时不需要额外的调度工具,一个 while 循环就能搞定:

  1. 逐行读取 urls.txt
  2. 依次调用 solve_captcha.sh
  3. url,token 追加写进 results.csv
#!/bin/bash
# Input file: urls.txt (one URL per line)

while IFS= read -r url; do
    echo "Processing: $url"
    TOKEN=$(./solve_captcha.sh "6Le-wvkS..." "$url")
    if [[ -n "$TOKEN" ]]; then
        echo "$url,$TOKEN" >> results.csv
        echo "  Solved ✓"
    else
        echo "  Failed ✗"
    fi
done < urls.txt

Windows 环境:PowerShell 版本

没有 bash 也没关系:Windows 上用 Invoke-RestMethod 实现同样的提交 + 轮询逻辑,跟 bash 版本一一对应。

$ApiKey = $env:CAPTCHAAI_API_KEY
$BaseUrl = "https://ocr.captchaai.com"

# Submit
$response = Invoke-RestMethod "${BaseUrl}/in.php?key=${ApiKey}&method=userrecaptcha&googlekey=6Le-wvkS...&pageurl=https://example.com"

if ($response -match '^OK\|(.+)$') {
    $taskId = $Matches[1]
    Write-Host "Task: $taskId"
} else {
    Write-Error "Submit failed: $response"
    exit 1
}

# Poll
do {
    Start-Sleep -Seconds 5
    $result = Invoke-RestMethod "${BaseUrl}/res.php?key=${ApiKey}&action=get&id=${taskId}"
} while ($result -eq 'CAPCHA_NOT_READY')

if ($result -match '^OK\|(.+)$') {
    $token = $Matches[1]
    Write-Host "Token: $token"
} else {
    Write-Error "Solve failed: $result"
}

常见错误排查

错误 原因 处理方式
curl: (6) Could not resolve host DNS 解析失败 检查网络连通性
ERROR_WRONG_USER_KEY API Key 不对 确认 Key 里没有多余空格或换行符
响应为空 网络超时 加上 --connect-timeout 30
base64: invalid input 二进制内容有问题 base64 -w 0(不换行)

常见问题

CaptchaAI 支持哪些验证码类型用 curl 直接提交?

method 参数决定,curl 只是传输层:reCAPTCHA v2/v3、Turnstile、Cloudflare Challenge、GeeTest v3、图片/九宫格 OCR、BLS 等 12 种正式支持;CaptchaFox、Friendly Captcha、Lemin 是测试版(beta)。hCaptcha 和 FunCaptcha 不支持,GeeTest v4 仍是”即将支持”。

轮询时一直显示 CAPCHA_NOT_READY,是哪里出问题了?

正常几秒到几十秒出结果。超过一两分钟没变化,先确认 id 是提交响应里原样返回的,再检查 pageurlgooglekey 有没有写错——参数错了通常会一直卡住,不会直接报错。

在 GitHub Actions、GitLab CI 里怎么安全存放 API Key?

存成 CI 的 secret(GitHub Actions 的 Repository secrets、GitLab CI 的 masked variable),运行时以环境变量注入,不要写进脚本文件或提交历史。本文的 bash 脚本正是从环境变量读取 Key,可直接搬进流水线。

Windows 下没有 bash,只能用 PowerShell 吗?

Windows 10/11 自带的 curl.exe 能直接跑本文的命令,只是没有 set -euo pipefail 那套语法糖。写完整轮询脚本,用 Invoke-RestMethod 更省事(见上一节);装了 WSL 或 Git Bash,bash 脚本也能原样运行。

curl 请求一直卡住或返回空是什么原因?

多数是网络超时,加 --connect-timeout 30 --max-time 60 能让失败更快暴露。长期无响应就用 curl -v 看日志,确认请求真的到了 ocr.captchaai.com

相关阅读

该文章已禁用评论。