Чтобы решить CAPTCHA, не всегда нужен Python или Node.js — часто хватает cURL, который уже стоит в Linux, macOS и WSL. Ниже — команды и bash-скрипт для CaptchaAI REST API: от проверки баланса до конвейера, который решает reCAPTCHA v2, Turnstile и графические CAPTCHA без единой SDK-зависимости, и годится для CI/CD и staging-тестов. Всё, что нужно, — сам cURL и API-ключ: никаких дополнительных пакетов, виртуальных окружений или сборки образа под конкретный язык.
Такой подход экономит время в трёх типичных сценариях: быстрая проверка, что ключ и эндпоинт вообще работают, до того как писать полноценный клиент; шаги в CI/CD-пайплайне, где ставить SDK ради одного вызова избыточно; и отладка ответов API «в живую», прямо в терминале, без запуска скрипта целиком.
Что понадобится
Минимальный набор — это сам cURL и рабочий API-ключ CaptchaAI; остальное опционально и облегчает жизнь при разборе ответов.
| Требование | Подробности |
|---|---|
| cURL | Любая современная версия |
| jq (необязательно) | Для разбора ответов, если работаете с JSON-эндпоинтами |
| API-ключ CaptchaAI | Получите его здесь |
Базовые команды CaptchaAI API через cURL
Баланс потоков в одну команду
Прежде чем отправлять задачи, проверьте баланс — команда возвращает число оставшихся потоков:
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
Опрос результата по ID задачи
curl -s "https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=73548291"
Вывод: OK|03AGdBq24PBCbw... или CAPCHA_NOT_READY, если решение ещё не готово.
Как читать ответ API
CaptchaAI всегда отвечает одним и тем же паттерном, поэтому парсер получается совсем простым — достаточно проверить первые символы строки:
| Формат ответа | Что означает |
|---|---|
OK|<значение> |
Успех: баланс, ID задачи или готовый токен |
CAPCHA_NOT_READY |
Задача ещё решается, опрашивайте res.php дальше |
ERROR_* |
Код ошибки — сообщение и решение обычно понятны из названия |
Bash-скрипт: решаем CAPTCHA одной командой
Три команды выше можно завернуть в один скрипт с отправкой, опросом и обработкой ошибок. Функция ниже отправляет задачу, сохраняет её ID, а затем опрашивает res.php каждые пять секунд, пока не придёт готовый токен или не истечёт таймаут. Создайте 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"
Решение Cloudflare Turnstile из терминала
Turnstile встречается на формах логина и checkout заметно чаще, чем классическая reCAPTCHA, но вызов почти идентичен: меняется только параметр method и имя ключа сайта — вместо googlekey используется sitekey:
curl -s "https://ocr.captchaai.com/in.php?key=${CAPTCHAAI_API_KEY}&method=turnstile&sitekey=0x4AAAAA...&pageurl=https://example.com"
Решение графической CAPTCHA: base64 и файл
Если у вас есть картинка с CAPTCHA, а не sitekey, кодируйте её в 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 — так вы не упрётесь в ограничение длины URL:
curl -s -X POST "https://ocr.captchaai.com/in.php" \
-F "key=${CAPTCHAAI_API_KEY}" \
-F "method=post" \
-F "[email protected]"
Практический пример: решаем CAPTCHA и сразу отправляем форму
Готовый токен редко нужен сам по себе — обычно его сразу подставляют в форму логина или регистрации на staging-стенде. Вот минимальный пайплайн, который берёт solve_captcha.sh, дожидается токена и передаёт его дальше в curl -X POST:
#!/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}"
Пакетная обработка списка URL
Если нужно прогнать не одну страницу, а список из десятков или сотен URL — например, при регрессионном тестировании нескольких форм подряд — оберните вызов скрипта в цикл и пишите результаты в 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
PowerShell-аналог для Windows
Windows-разработчики нередко предпочитают PowerShell вместо WSL. Логика та же: отправить задачу, опросить результат, извлечь токен регулярным выражением.
$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"
}
Локальный пример: QA-конвейер в CI
Для команд, которые тестируют формы логина в staging и выставляют счета клиентам в разных валютах, предсказуемый тариф CaptchaAI по потокам в USD — плюс: плана STANDARD ($30/мес, 15 потоков) обычно хватает для batch-скрипта выше в GitLab CI на европейском runner'е. Если пайплайн заодно собирает данные за пределами тестового логина, обрабатывайте только то, на что у вас есть законное основание, — это касается и 152-ФЗ, и GDPR.
Типичные ошибки cURL и их устранение
Почти все проблемы с этим API сводятся к четырём причинам ниже — прежде чем копать глубже, стоит проверить именно их:
| Ошибка | Причина | Исправление |
|---|---|---|
curl: (6) Could not resolve host |
Проблема с DNS | Проверьте сеть |
ERROR_WRONG_USER_KEY |
Неверный API-ключ | Проверьте, нет ли пробелов или переносов строк в ключе |
| Пустой ответ | Сетевой тайм-аут | Добавьте --connect-timeout 30 |
base64: invalid input |
Проблема с бинарным файлом | Используйте base64 -w 0 (без переноса строк) |
Часто задаваемые вопросы
Можно ли запускать этот скрипт в CI/CD?
Да. Сохраните CAPTCHAAI_API_KEY как секрет CI, а не как переменную в открытом виде в конфиге, и вызывайте solve_captcha.sh на нужном шаге — подходит для GitHub Actions, GitLab CI, Jenkins и любого раннера, где есть bash.
Нужен ли jq, если ответы CaptchaAI — не JSON?
Нет, не обязательно. Эндпоинты in.php и res.php возвращают простой текст вида OK|значение, поэтому в примерах выше jq не используется — он пригодится, только если вы дополнительно оборачиваете вызовы в свой собственный JSON-сервис поверх этого API.
Как добавить повторные попытки при сетевых сбоях?
Оберните вызов curl в цикл с экспоненциальной задержкой: при ненулевом коде выхода curl увеличивайте паузу перед следующей попыткой (например, 1 с, 2 с, 4 с) и ограничьте общее число повторов, чтобы скрипт не завис навсегда при недоступном API.
cURL медленнее, чем SDK на Python или Node.js?
Нет. Накладные расходы на HTTP у cURL и у HTTP-клиентов этих языков одинаковые — время решения CAPTCHA определяется самой CaptchaAI, а не инструментом, которым вы отправляете запрос.
Что делать при ошибке ERROR_ZERO_BALANCE?
Это означает, что на счёте закончились потоки по текущему плану. Проверьте баланс командой action=getbalance из раздела выше и пополните план на captchaai.com, прежде чем повторять запрос.
Можно ли использовать один и тот же скрипт для нескольких типов CAPTCHA?
Да, если вынести method и связанные параметры в аргументы функции: solve_recaptcha из примера выше легко превращается в универсальный solve_captcha для reCAPTCHA v2, Turnstile и графических CAPTCHA — меняется только набор передаваемых полей.