Tích Hợp

cURL + CaptchaAI: Giải quyết CLI CAPTCHA

Bạn không cần cài SDK để giải CAPTCHA — chỉ một lệnh cURL gọi thẳng API REST của CaptchaAI là đủ. Cách này gọn cho thử nghiệm nhanh, pipeline CI/CD, hay script Bash automation, không kéo theo runtime Python hay Node.js. Toàn bộ luồng xử lý chỉ có bốn bước, lặp lại giống nhau cho mọi loại CAPTCHA:

  1. Gửi task tới in.php kèm thông tin CAPTCHA cần giải
  2. Nhận task_id từ phản hồi OK|<id>
  3. Polling res.php bằng task_id đó cho đến khi có kết quả
  4. Dùng token trả về để submit form hoặc vượt qua thử thách CAPTCHA

Ví dụ thực tế: một team QA outsourcing tại TP.HCM dùng đúng bốn bước trên trong bước kiểm thử staging mỗi sáng — chạy solve_captcha.sh cho hàng chục tài khoản test trước khi bộ test đăng nhập tự động chạy tiếp, không cần cài thêm SDK nào ngoài cURL sẵn có trên máy CI.

Công cụ cần chuẩn bị

  • cURL — phiên bản hiện đại nào cũng được
  • jq (tùy chọn) — ghi log kết quả dạng JSON
  • API key CaptchaAIlấy tại đây

Ba lệnh cURL cơ bản để giải CAPTCHA với CaptchaAI

Ba lệnh dưới đây là tất cả những gì bạn cần để thử API CaptchaAI ngay từ terminal, trước khi ghép chúng thành script hoàn chỉnh ở phần sau.

Kiểm tra số dư trước khi chạy batch

Kiểm tra trước khi chạy batch để tránh hết credit:

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

Đầu ra: 1.234

Gửi task reCAPTCHA v2 tới in.php

Gọi in.php với method=userrecaptcha, googlekey (sitekey) và pageurl:

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

Đầu ra: OK|73548291

Polling kết quả từ res.php

Dùng action=get cùng id để hỏi kết quả — cách CaptchaAI trả token khi không dùng callback:

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

Đầu ra: OK|03AGdBq24PBCbw... hoặc CAPCHA_NOT_READY

Viết script Bash tự động giải CAPTCHA

Gộp ba lệnh trên thành một script: submit, polling, trả token. Tạo file 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

Cấp quyền thực thi:

chmod +x solve_captcha.sh

Chạy thử:

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

Giải Cloudflare Turnstile bằng một dòng lệnh

Turnstile dùng sitekey thay vì googlekey, logic còn lại y hệt reCAPTCHA v2:

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

Giải CAPTCHA hình ảnh: base64 hoặc upload file

Encode file thành base64 rồi gửi qua tham số body:

# 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}"

Ảnh lớn nên gửi bằng POST multipart thay vì nhồi base64 vào query string:

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

Giải CAPTCHA và dùng token trong một pipeline

Kết hợp solve với submit form ngay sau đó — điển hình cho kiểm thử staging tự động:

#!/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}"

Giải CAPTCHA hàng loạt từ file danh sách URL

Đọc URL từ file, ghi kết quả ra CSV — hữu ích khi test hàng loạt tài khoản staging:

#!/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

Giải song song bằng nhiều thread cho nhanh hơn

Vòng lặp tuần tự ở trên gọi từng CAPTCHA một, nhưng CaptchaAI tính phí theo thread chứ không theo số lần giải — nghĩa là bạn được phép chạy nhiều task cùng lúc trong giới hạn gói của mình. Dùng xargs -P để chạy solve_captcha.sh song song thay vì vòng lặp tuần tự:

  • Pipe urls.txt qua xargs -P 5 -I{} ./solve_captcha.sh SITE_KEY {}, với -P 5 khớp số thread của gói BASIC (5 thread)
  • Số -P không nên vượt số thread trong gói — vượt quá không giải nhanh hơn, chỉ khiến các task xếp hàng chờ phía CaptchaAI
  • Với gói lớn hơn như STANDARD (15 thread) hay ADVANCE (50 thread), tăng -P tương ứng để tận dụng hết thread đã trả tiền
  • Ghi log riêng cho từng tiến trình con nếu cần debug, vì output các lệnh chạy song song sẽ xen kẽ nhau trên terminal

PowerShell (Windows)

Trên Windows, Invoke-RestMethod thay cURL, logic submit và polling giữ nguyên:

$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"
}

Khắc phục sự cố

  • curl: (6) Could not resolve host — sự cố DNS. Kiểm tra kết nối mạng.
  • ERROR_WRONG_USER_KEY — API key sai hoặc dính ký tự thừa. Copy lại key, bỏ khoảng trắng/xuống dòng thừa.
  • Phản hồi trống — timeout mạng. Thêm --connect-timeout 30 vào lệnh cURL.
  • base64: invalid input — lỗi encode file nhị phân. Dùng base64 -w 0 để không xuống dòng.

Câu hỏi thường gặp

Các câu hỏi dưới đây là những gì dev Việt Nam thường vướng khi mới ghép cURL với CaptchaAI vào script hoặc pipeline.

cURL có dùng được trong pipeline CI/CD không?

Có. Đặt CAPTCHAAI_API_KEY làm secret trong CI rồi gọi solve_captcha.sh như một bước — chạy tốt trên GitHub Actions, GitLab CI, Jenkins.

Có cần cài jq nếu chỉ dùng script mẫu ở trên không?

Không. solve_captcha.sh chỉ dùng string parsing (${result#OK|}); jq chỉ cần khi ghi log JSON.

Giải CAPTCHA hàng loạt bằng cURL có cần nhiều API key không?

Không. Một key chạy nhiều task song song, giới hạn bởi số thread trong gói (BASIC có 5 thread).

Ký tự đặc biệt trong pageurl thì xử lý thế nào?

Dùng --data-urlencode: curl -G --data-urlencode "pageurl=..." cho GET, hoặc bỏ -G khi gửi POST.

Hướng dẫn liên quan

Đọc thêm nếu bạn muốn chuyển từ cURL sang SDK đầy đủ hoặc cần hiểu sâu hơn về API:

Os comentários estão desativados para este artigo.