PHP ile reCAPTCHA Enterprise çözün

solvethree tarafından2 dk okuma

solvethree'yi doğrudan PHP'den çağırabilirsiniz. Aşağıdaki örnek bir reCAPTCHA v3 Enterprise tokenı ister, görevi tamamlanana kadar izler ve çözüm başarısız olursa durur.

Bu sayfada

Çalıştırmadan önce

cURL uzantısıyla PHP 8+ kullanın. Sunucunuzda, cURL uzantısı etkin olarak çalıştırın.

  • Konsolda hedef ana makine adınız için etkin bir site profili oluşturun. Site profili kurulumuna bakın.
  • SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına, SOLVETHREE_PROXY değerini ise HTTP(S) proxy URL'nize ayarlayın.
  • accounts.example.com ve login değerlerini ana makine adınız ve sayfanın kullandığı eylemle değiştirin. site için şema veya yol içermeyen bir ana makine adı kullanın.

Görevi oluşturun ve sonucu bekleyin

Kodu solve.php olarak kaydedin ve php solve.php komutunu çalıştırın.

PHP 8 · 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, görevi hemen döndürmek için waitMs=0 kullanır. Ardından her GET, bir güncelleme için en fazla 15 saniye bekler. Döngü pending veya solving durumunda devam eder, ready veya failed durumunda durur.

İstek varsayılan olarak Enterprise v3 kullanır. Standart v3 için recaptchaType: v3 ekleyin. reCAPTCHA görev gövdesine type ve url eklemeyin.

Tokenı uygulamanızda kullanın

Token, $solution['token'] değeridir. Programın yazdırdığı görev kimliği, görevi almak içindir; uygulamanızın CAPTCHA alanında token değerini kullanın.

Hedef istekte $solution['userAgent'] değerini User-Agent, $solution['secChUa'] değerini ise sec-ch-ua olarak kullanın.

Bu isteği çözüm için kullanılan proxy üzerinden gönderin. Ardından uygulama yanıtını kontrol edin: token üretilmiş olması, hedefin isteği kabul ettiğini göstermez.

İstek başarısız olursa

Başarısız bir görev errorCode ve error içerir; örnek durur ve bunları bildirir. Başarısız çözümlerin ücreti iade edilir. 401 veya 402 gibi bir HTTP hatası, ayrı bir istek sorunudur; yeniden denemeden önce API hata referansını kontrol edin.

Zaman aşımından veya sürecin yeniden başlatılmasından sonra kurtarma yapmanız gerekiyorsa requestId değerini ve görev girdilerini eksiksiz saklayın. Görev kimliğiniz varsa durumunu sorgulayın. Yoksa özgün girdileri aynı requestId ile yeniden gönderin. Programı yalnızca yeniden başlatmak başka bir kimlik üretir ve ücretlendirilen başka bir çözüm oluşturabilir.

Çağıran taraf, süre sınırı dolduğunda beklemeyi bırakır; bu, önceden oluşturulmuş bir görevi iptal etmez. Tüm adımlar için durum sorgulama ve zaman aşımı sonrası kurtarma kılavuzuna bakın.

İlk görevinizi çalıştırın.

$5 çalışma alanı kredisiyle başlayın.

Çalışma alanı oluşturun
PHP ile reCAPTCHA Enterprise çözün · solvethree