CAPTCHA görev API'siyle Guzzle kullanın

solvethree tarafından3 dk okuma

Guzzle 7 ile bir görev oluşturun, ardından görev ready veya failed durumuna gelene kadar kimliğini sorgulayın. Bir sorun çıkarsa requestId değerini saklayın: bağlantı zaman aşımı, görev oluşturmanın başarısız olduğunu kanıtlamaz.

Bu bir REST entegrasyonudur, resmi bir PHP SDK'sı değildir.

Bu sayfada

reCAPTCHA isteğini hazırlayın

  • Guzzle 7'yi Composer ile yükleyin. Kurulum komutu örneğin başında yer alır.
  • SOLVETHREE_API_KEY değerini çalışma alanınızın API anahtarına, SOLVETHREE_PROXY değerini ise proxy URL'sine ayarlayın. Anahtarı sunucuda tutun.
  • Çözüm istemeden önce konsolda hedef siteniz için etkin bir profil oluşturun. Site profili kurulumuna bakın.
  • accounts.example.com ve login değerlerini hedef ana makine adı ve eylemle değiştirin. site alanı tam URL değil, ana makine adı alır.

Örnek, varsayılan recaptchaType değeri olan reCAPTCHA Enterprise v3'ü ister. type veya url alanları eklemeyin. Tek bir proxy sağlar; bunun yerine proxyCandidates kullanıyorsanız proxy alanını tamamen çıkarın.

Bir kez oluşturun, ardından sabit süre bütçesi içinde sorgulayın

Guzzle · tek bir POST ve sınırlı durum sorgulama
<?php
// composer require guzzlehttp/guzzle:^7
require __DIR__.'/vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.solvethree.com/v1/',
    'headers' => ['Authorization' => 'Bearer '.getenv('SOLVETHREE_API_KEY'), 'Accept' => 'application/json'],
    'allow_redirects' => false,
    'http_errors' => false,
]);
$input = ['site' => 'accounts.example.com', 'action' => 'login',
    'proxy' => getenv('SOLVETHREE_PROXY'), 'requestId' => bin2hex(random_bytes(16))];
$deadline = microtime(true) + 180;
$call = function (string $method, string $path, array $options = []) use ($client, $deadline): array {
    $remaining = $deadline - microtime(true);
    if ($remaining <= 0) throw new RuntimeException('Local deadline reached');
    $response = $client->request($method, $path, $options + ['timeout' => min(25, $remaining), 'connect_timeout' => min(10, $remaining)]);
    if ($response->getStatusCode() < 200 || $response->getStatusCode() >= 300) {
        throw new RuntimeException('API HTTP '.$response->getStatusCode());
    }
    return json_decode((string)$response->getBody(), true, 512, JSON_THROW_ON_ERROR);
};
$id = null;
try {
    $result = $call('POST', 'tasks?waitMs=0', ['json' => $input]);
    $id = $result['id'];
    while (in_array($result['status'], ['pending', 'solving'], true)) {
        $result = $call('GET', 'tasks/'.rawurlencode($id).'?waitMs=15000');
        if (in_array($result['status'], ['pending', 'solving'], true)) usleep(1000000);
    }
    if ($result['status'] !== 'ready') {
        throw new RuntimeException('Task failed: '.($result['errorCode'] ?? 'unknown'));
    }
    echo 'Ready task: '.$id.PHP_EOL;
    // Submit $result['solution']['token'] with userAgent/secChUa and the same proxy.
} catch (Throwable $error) {
    fwrite(STDERR, 'Recovery requestId='.$input['requestId'].' taskId='.($id ?? 'unknown').PHP_EOL);
    throw $error;
}

İstemci, Bearer anahtarıyla kimlik doğrular. base_uri değeri /v1/ ile biter ve istek yolları göreli olduğundan bu API önekini korur. Guzzle'ın json seçeneği görev girdisini JSON olarak gönderir.

Yardımcı, oluşturma için tek bir POST isteği yapar. Ardından durum pending veya solving olduğu sürece döndürülen görev kimliğini sorgular. Oluşturma ve sorgulama işlemleri 180 saniyelik ortak bir bütçe kullanır; her HTTP çağrısı kalan süreyle sınırlıdır ve azami istek ve bağlantı zaman aşımları sırasıyla 25 ve 10 saniyedir. Yeni bir sorgulama genel bütçeyi baştan başlatmaz.

Yönlendirmeler devre dışıdır. http_errors değerini false olarak ayarlamak, yardımcının başarılı yanıt içeriğini çözümlemeden önce 2xx dışındaki yanıtları açıkça kontrol etmesini sağlar; bağlantı hatalarını veya zaman aşımlarını bastırmaz.

  • 2xx dışındaki bir HTTP yanıtı, API HTTP hatası fırlatır. Bunu başarısız bir çözüm olarak değerlendirmek yerine yanıt durumunu ve gövdesini inceleyerek nedeni belirleyin.
  • Son durum olan failed durumuna ulaşan görev, sorgulamayı durdurur. Örnek, görevin errorCode değerini hata olarak fırlatır; tanılama mesajı için görevin error alanını da inceleyin. Başarısız çözümlerin ücretleri iade edilir.
  • Yalnızca ready durumu kullanılabilir bir çözüm içerir. Yazdırılan “Ready task” satırı, hedef web sitesinin kabulünü değil, görevin hazır olduğunu bildirir.

Başka bir görev için ödeme yapmadan zaman aşımına uğrayan isteği kurtarın

POST isteğini göndermeden önce üretilen requestId değerini ve görev girdisinin birebir kopyasını saklayın. catch bloğu requestId değerini ve oluşturma işlemi döndürdüyse taskId değerini yazdırır. Bu çıktı kurtarmaya yardımcı olur, ancak isteği göndermeden önce kaydetmenin yerini tutmaz.

  1. 1.

    Görev kimliğiniz varsa o görevi alın

    Durumunu kontrol etmek için GET /v1/tasks/:id kullanın. Yardımcının yerel son süresine ulaşılması, uzaktaki görevin başarısız olduğunu göstermez.

  2. 2.

    Oluşturma işlemi kimlik döndürmeden zaman aşımına uğradıysa requestId ile kurtarın

    Kaydedilen requestId ile aynı görev isteğini gönderin. Eşleşen girdiler mevcut görevi döndürür; aynı kimlikle farklı girdiler kullanmak çakışmaya yol açar.

  3. 3.

    Kurtarma için kestirme yol olarak betiği yeniden çalıştırmayın

    Her çalıştırma yeni bir requestId üretir. Başka bir kimlik üreten otomatik POST yeniden denemesi eklemeyin ve geçersiz girdileri değiştirmeden körü körüne yeniden denemeyin.

Token'ı aynı proxy üzerinden gönderin

Örnek, hedefle iletişim kurmadan durur. Görev kimliğini değil, solution.token değerini gönderin ve döndürülen solution.userAgent ile solution.secChUa değerlerini hedef isteğinin User-Agent ve Sec-CH-UA başlıkları olarak kullanın.

Görevin JSON içeriğindeki proxy, solvethree'ye çözüm için hangi proxy'yi kullanacağını söyler. Guzzle'ın API bağlantısını veya daha sonra hedefe yapacağınız isteği yapılandırmaz. Hedef isteğini aynı proxy'yi kullanacak şekilde ayrıca yapılandırın.

API istemcisinin varsayılan Authorization başlığının web sitesine gönderilmemesi için hedef isteğinde ayrı bir istemci kullanın. Token'ı, döndürülen tarayıcı kimliğini, proxy'yi ve amaçlanan hedefi bir arada tutun. Sonraki istek bunlarla eşleşmezse hazır bir token yine de reddedilebilir.

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

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

Çalışma alanı oluşturun
CAPTCHA görev API'siyle Guzzle kullanın · solvethree