Солвер капчі на PHP з cURL: робочий приклад (2026)
Для розв'язання капчі на PHP потрібне лише розширення cURL, яке є в більшості інсталяцій. Ви надсилаєте один JSON POST до API Scarnox, читаєте solution.token з відповіді і відправляєте цей токен у форму сайту. Посібник проходить увесь потік PHP для PopularCaptcha, яку Scarnox сьогодні розв'язує в режимі proxyless.
Почніть з безкоштовного пробного кредиту, картка не потрібна і спробуйте скрипт на сторінці, якою володієте, перш ніж використовувати його деінде.
Вимоги
- PHP 8.0 або новіший з увімкненими розширеннями
curlіjson. Перевірте командоюphp -m. - Ключ API Scarnox.
- Sitekey віджета PopularCaptcha на сторінці. Як його знайти, дивіться в посібнику зі пошуку sitekey капчі.
Функція солвера
Ця функція надсилає запит до API, перевіряє errorId і повертає токен. При будь-якому збої вона кидає виняток, щоб викликач міг вирішити, чи повторювати:
<?php
declare(strict_types=1);
const SCARNOX_API_KEY = 'scarnox_YOURAPIKEY';
const SCARNOX_API_URL = 'https://api.scarnox.com/api/tasks/create';
function solveCaptcha(string $sitekey, string $pageUrl, bool $invisible = false): string
{
$body = [
'captcha_type' => 'PopularCaptchaTaskProxyless',
'site_key' => $sitekey,
'site_url' => $pageUrl,
];
if ($invisible) {
$body['is_invisible'] = true;
}
$ch = curl_init(SCARNOX_API_URL);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($body, JSON_THROW_ON_ERROR),
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . SCARNOX_API_KEY,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 185, // виклик повертається, коли токен готовий
]);
$raw = curl_exec($ch);
if ($raw === false) {
$error = curl_error($ch);
throw new RuntimeException('cURL error: ' . $error);
}
$data = json_decode((string) $raw, true);
if (!is_array($data)) {
throw new RuntimeException('Response was not JSON');
}
if (($data['errorId'] ?? 1) !== 0) {
throw new RuntimeException(
($data['errorCode'] ?? 'ERROR') . ': ' . ($data['errorDescription'] ?? 'unknown')
);
}
return (string) $data['solution']['token'];
}
Заголовок Authorization використовує префікс Bearer. Таймаут — 185 секунд, бо API блокується, доки токен не буде готовий, і кроку опитування немає.
Повтори для тимчасових збоїв
Невдале розв'язання не тарифікується, тож кілька повторів коштують недорого. Обгорніть виклик циклом і чекайте трохи довше після кожного збою:
function solveWithRetry(string $sitekey, string $pageUrl, int $attempts = 3): string
{
$lastError = null;
for ($i = 1; $i <= $attempts; $i++) {
try {
return solveCaptcha($sitekey, $pageUrl);
} catch (RuntimeException $e) {
$lastError = $e;
fwrite(STDERR, "Attempt $i failed: " . $e->getMessage() . PHP_EOL);
sleep($i);
}
}
throw $lastError;
}
Повну політику обробки помилок, включно з тим, на яких збоях зупинятися, дивіться в обробці помилок солвера капчі.
Відправка токена з cookie-файлом
Багато сайтів прив'язують капчу до сесії, яка завантажила форму. Файл cookie дозволяє cURL надсилати ті самі cookie при GET і POST. Функція нижче відправляє токен у форму сторінки:
function submitToken(string $pageUrl, string $token): string
{
$cookieFile = sys_get_temp_dir() . '/scarnox-cookies.txt';
// Спочатку GET, щоб сайт встановив cookie сесії.
$ch = curl_init($pageUrl);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIEFILE => $cookieFile,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_TIMEOUT => 60,
]);
curl_exec($ch);
// Потім POST з формою і токеном в обох полях капчі.
$fields = http_build_query([
'email' => 'you@example.com',
'h-captcha-response' => $token,
'g-recaptcha-response' => $token,
]);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $fields,
CURLOPT_TIMEOUT => 60,
]);
$body = curl_exec($ch);
if ($body === false) {
throw new RuntimeException('Form submit failed: ' . curl_error($ch));
}
return (string) $body;
}
Важливі два моменти. GET виконується до розв'язання, щоб cookie вже були на місці. А токен іде одразу після розв'язання, бо спливає приблизно за дві хвилини. Розташуйте виклик розв'язання безпосередньо перед цією функцією, а не на початку довгої пакетної обробки.
Файл cookie спільний для всіх викликів в одному процесі, тож дайте кожному обліковому запису або сесії свій файл, якщо ви запускаєте кілька реєстрацій паралельно. Інакше одна сесія перезапише cookie іншої, і другий POST провалиться з причин, які схожі на проблему з капчею, але нею не є.
Все разом
$pageUrl = 'https://example.com/signup';
$token = solveWithRetry('YOUR-SITEKEY-UUID', $pageUrl);
$html = submitToken($pageUrl, $token);
echo strlen($html) . " bytes returned\n";
Запуск із командного рядка:
php signup.php
Невидимі віджети
Якщо віджет невидимий, викличте solveCaptcha($sitekey, $pageUrl, true). Тоді поле is_invisible надсилається разом із запитом. Деякі сторінки також потребують JavaScript-колбеку з токеном, який серверний скрипт не може запустити. У такому разі використовуйте інструмент браузера. Посібник про невидиму капчу розглядає ці випадки.
Час і термін дії
Токен дійсний приблизно дві хвилини. Тримайте розв'язання і відправку близько одне до одного. Посібник про термін дії токена капчі пояснює, як відрізнити прострочений токен від відхиленого.
Скрапінг відповідально
Якщо ваш PHP-скрипт скрапить публічні сторінки, спершу перевірте robots.txt і умови сайту. Додайте затримку між запитами і не зберігайте персональних даних, які вам не потрібні. Розв'язання капчі не змінює того, що ви маєте право збирати. Щодо правового боку дивіться чи законний веб-скрапінг.
Ціни
Ви платите за кожне успішне розв'язання. Невдалі розв'язання не тарифікуються. Актуальні тарифи — на сторінці цін, а безкоштовний пробний кредит не потребує картки.