פתרון reCAPTCHA Enterprise באמצעות PHP
אפשר לפנות ל־solvethree ישירות מתוך PHP. הדוגמה הבאה מבקשת אסימון reCAPTCHA v3 Enterprise, עוקבת אחר המשימה עד לסיומה ועוצרת אם הפתרון נכשל.
בדף הזה
לפני ההרצה
השתמשו ב־PHP 8+ עם הרחבת cURL. הריצו בשרת שלכם, כשהרחבת cURL מופעלת.
- צרו במסוף פרופיל אתר פעיל עבור שם המארח של היעד. ראו הגדרת פרופיל אתר.
- הגדירו את
SOLVETHREE_API_KEYלמפתח ה־API של סביבת העבודה שלכם ואתSOLVETHREE_PROXYלכתובת ה־URL של פרוקסי ה־HTTP(S) שלכם. - החליפו את
accounts.example.comואתloginבשם המארח שלכם ובפעולה שבה הדף משתמש. עבורsite, השתמשו בשם מארח ללא סכמה או נתיב.
יצירת המשימה והמתנה לתוצאה
שמרו את הקוד בשם solve.php והריצו php solve.php.
<?php
// Requires PHP 8+ with the cURL extension.
$apiKey = getenv('SOLVETHREE_API_KEY');
$proxy = getenv('SOLVETHREE_PROXY');
if (!$apiKey || !$proxy) throw new RuntimeException('Set the API key and proxy');
function api(string $path, ?array $body = null): array {
global $apiKey, $deadline;
$remaining = $deadline - microtime(true);
if ($remaining <= 0) throw new RuntimeException("Keep the task ID and resume polling");
$curl = curl_init('https://api.solvethree.com/v1' . $path);
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => min(30000, max(1, (int) ceil($remaining * 1000))),
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $apiKey, 'Content-Type: application/json'],
]);
if ($body !== null) {
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($body, JSON_THROW_ON_ERROR));
}
$raw = curl_exec($curl);
$error = curl_error($curl);
$status = curl_getinfo($curl, CURLINFO_RESPONSE_CODE);
curl_close($curl);
if ($raw === false) throw new RuntimeException('Connection failed: ' . $error);
if ($status < 200 || $status >= 300) throw new RuntimeException('API HTTP ' . $status);
return json_decode($raw, true, 512, JSON_THROW_ON_ERROR);
}
$requestId = bin2hex(random_bytes(16)); // Save this with the task inputs for recovery.
$deadline = microtime(true) + 180;
$task = api('/tasks?waitMs=0', [
'site' => 'accounts.example.com', 'action' => 'login',
'proxy' => $proxy, 'requestId' => $requestId,
]);
while (in_array($task['status'], ['pending', 'solving'], true)) {
if (microtime(true) >= $deadline) throw new RuntimeException('Keep the task ID and resume polling');
$task = api('/tasks/' . rawurlencode($task['id']) . '?waitMs=15000');
if (in_array($task['status'], ['pending', 'solving'], true)) usleep(1000000);
}
if ($task['status'] !== 'ready') throw new RuntimeException(
($task['errorCode'] ?? 'Unexpected task state') . ': ' . ($task['error'] ?? '')
);
$solution = $task['solution'];
// Use $solution['token'], ['userAgent'] and ['secChUa'] with the same proxy.
echo 'Ready task: ' . $task['id'] . PHP_EOL;בקשת ה־POST משתמשת ב־waitMs=0 כדי להחזיר משימה מיד. לאחר מכן כל בקשת GET ממתינה עד 15 שניות לעדכון. הלולאה נמשכת במצב pending או solving, ועוצרת במצב ready או failed.
ברירת המחדל של הבקשה היא Enterprise v3. עבור v3 רגיל, הוסיפו recaptchaType: v3. אל תכללו type ו־url בגוף משימת reCAPTCHA.
שימוש באסימון ביישום שלכם
האסימון הוא $solution['token']. מזהה המשימה שהתוכנית מדפיסה משמש לאחזור המשימה; השתמשו בערך האסימון בשדה ה־CAPTCHA של היישום שלכם.
השתמשו ב־$solution['userAgent'] בתור User-Agent וב־$solution['secChUa'] בתור sec-ch-ua בבקשה ליעד.
שלחו את הבקשה דרך אותו פרוקסי ששימש לפתרון. לאחר מכן בדקו את תגובת היישום: יצירת אסימון אינה מעידה שהיעד קיבל את הבקשה.
אם הבקשה נכשלת
משימה שנכשלה כוללת errorCode ו־error; הדוגמה עוצרת ומדווחת עליהם. על פתרונות שנכשלו ניתן החזר. שגיאת HTTP כגון 401 או 402 היא בעיה נפרדת בבקשה — עיינו במדריך שגיאות ה־API לפני ניסיון חוזר.
שמרו את requestId ואת הקלט המדויק של המשימה אם תזדקקו לשחזור לאחר חריגה ממגבלת הזמן או הפעלה מחדש של התהליך. אם יש לכם מזהה משימה, תשאלו אותה. אחרת, שלחו שוב את הקלט המקורי עם אותו requestId. הפעלה מחדש של התוכנית ללא צעדים נוספים יוצרת מזהה אחר ועלולה ליצור פתרון נוסף בתשלום.
הקוד הקורא מפסיק להמתין לאחר המועד האחרון שהוגדר לו; פעולה זו אינה מבטלת משימה שכבר נוצרה. לרצף הפעולות המלא, ראו תשאול ושחזור לאחר חריגה ממגבלת הזמן.
מקורות ותיעוד API
הפעלת המשימה הראשונה שלך.
התחילו עם $5 בקרדיט לסביבת העבודה.