Cara Memecahkan reCAPTCHA v2 di PHP, Termasuk Invisible

solve recaptcha v2 in php - How to Solve reCAPTCHA v2 in PHP, Including Invisible

reCAPTCHA v2 memiliki tiga varian, dan di PHP semuanya adalah satu metode dengan sebuah array opsi. Checkbox adalah panggilan polosnya, Invisible dan Enterprise adalah flag, dan keduanya dapat diatur bersamaan. PHP juga satu-satunya SDK CapSkip yang sama sekali tidak memiliki dukungan async, yang menyederhanakan kodenya tetapi mengubah cara Anda seharusnya menyusun pekerjaan massal.

Penyiapan

# PHP 8.0 or newer. Needs the curl and json extensions,
# both of which ship with almost every PHP install.
composer require capskip/capskip

CapSkip memecahkan di komputer Anda sendiri, jadi aplikasi desktop harus berjalan. Arahkan client ke port yang tercantum di pengaturannya:

use CapSkip\CapSkip;

$solver = new CapSkip([
    'apiKey' => 'capskip',        // any string when key validation is off
    'host' => '127.0.0.1',
    'port' => 8080,
    'recaptchaTimeout' => 300,    // seconds
]);

Di lingkungan produksi, baca nilai tersebut dari environment:

use CapSkip\CapSkip;

$solver = new CapSkip([
    'apiKey' => getenv('CAPSKIP_API_KEY') ?: 'capskip',
    'host' => getenv('CAPSKIP_HOST') ?: '127.0.0.1',
    'port' => (int) (getenv('CAPSKIP_PORT') ?: 8080),
]);

Tiga varian

VarianOpsi untuk menambahkan
Checkboxtidak ada
Invisible['invisible' => 1]
Enterprise['enterprise' => 1]
Invisible Enterprisekedua kunci
// Checkbox: sitekey and page URL only.
$result = $solver->recaptcha(
    '6Lc...YOUR_SITEKEY',
    'https://example.com/login'
);

echo $result['code'];   // g-recaptcha-response token

// Invisible.
$result = $solver->recaptcha($sitekey, $pageUrl, ['invisible' => 1]);

// Enterprise, and both together.
$result = $solver->recaptcha($sitekey, $pageUrl, ['enterprise' => 1]);
$result = $solver->recaptcha($sitekey, $pageUrl, [
    'enterprise' => 1,
    'invisible' => 1,
]);

Nilai kembaliannya adalah array asosiatif, jadi $result['code'] adalah tokennya. $result['captchaId'] juga ada jika Anda ingin mencatat pemecahan mana yang menghasilkannya.

Menyiapkan input dengan benar

sitekey adalah data-sitekey atribut pada kontainer widget, atau argumen pertama untuk grecaptcha.render ketika mode Invisible berarti tidak ada kontainer untuk dilihat. Nilainya selalu diawali dengan 6L dan bersifat publik.

URL harus berupa halaman tempat widget dirender. Mengirimkan handler formulir atau redirect pasca-login adalah penyebab umum token yang terpecahkan baik-baik saja lalu gagal verifikasi.

Mengirimkan token

$ch = curl_init('https://example.com/login');

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'g-recaptcha-response' => $result['code'],
        'username' => '...',
        'password' => '...',
    ]),
]);

$response = curl_exec($ch);
curl_close($ch);

Token bersifat sekali pakai dan bertahan sekitar dua menit, jadi pecahkan selambat mungkin dalam alurnya. Jika situs menyerahkan token ke callback JavaScript alih-alih ke kolom formulir, pemecahannya identik tetapi cara pengirimannya berbeda. pemecah callback reCAPTCHA v2 membahas format tersebut.

Error, dan namespace yang sering terlewat

PHP menempatkan exception-nya di namespace tersendiri, yang membingungkan siapa pun yang menyalin import dari contoh Python atau Node:

use CapSkip\CapSkip;
use CapSkip\Exceptions\ValidationException;
use CapSkip\Exceptions\NetworkException;
use CapSkip\Exceptions\ApiException;
use CapSkip\Exceptions\TimeoutException;

try {
    $result = $solver->recaptcha($sitekey, $pageUrl);
} catch (ValidationException $e) {
    // missing or malformed arguments
} catch (NetworkException $e) {
    // CapSkip is not running on the configured port
} catch (ApiException $e) {
    // the sitekey or pageurl was rejected
} catch (TimeoutException $e) {
    // exceeded recaptchaTimeout
}

Keempatnya memperluas CapSkip\Exceptions\CapSkipError, sehingga satu catch pada base class menangani semuanya jika Anda lebih suka menangani kegagalan di satu tempat.

Memecahkan beberapa

PHP berjalan secara sinkron, sehingga setiap pemecahan memblokir hingga selesai:

use CapSkip\CapSkip;

$solver = new CapSkip();

foreach ($targets as $target) {
    $results[] = $solver->recaptcha($target['sitekey'], $target['url']);
}

Paket ini mengekspor AsyncCapSkip, tetapi di PHP itu hanya alias agar kode yang dipindahkan dari SDK lain tetap berjalan. Itu tidak menambah konkurensi. Untuk paralelisme yang sesungguhnya, jalankan beberapa proses worker atau gunakan antrean alih-alih berharap SDK menumpangtindihkan pemecahan.

Menggunakan proxy

$result = $solver->recaptcha($sitekey, $pageUrl, [
    'proxy' => ['type' => 'HTTPS', 'uri' => 'user:[email protected]:3128'],
]);

Proxy didukung untuk reCAPTCHA, Turnstile dan GeeTest, tetapi tidak untuk CAPTCHA gambar, yang dipecahkan dari byte gambarnya dan tidak pernah sampai ke situs target.

Pertanyaan yang sering diajukan

Apakah saya perlu melakukan polling untuk mendapatkan hasilnya?

Tidak. SDK melakukan polling secara internal dan mengembalikan token yang sudah jadi, sehingga CAPCHA_NOT_READY tidak pernah sampai ke kode Anda. Ia mulai memeriksa setelah 250ms dan melambat setelahnya.

Apakah pemecahan akan memblokir permintaan web saya?

Ya, dan hal itu penting di PHP. Pemecahan reCAPTCHA bisa memakan waktu beberapa detik, sehingga melakukannya di dalam render halaman akan menahan satu worker. Pindahkan pemecahan ke pekerjaan berantrean atau worker CLI daripada memblokir thread permintaan.

Apa saja persyaratannya?

PHP 8.0 atau lebih baru dengan curl dan json ekstensi, keduanya disertakan pada sebagian besar instalasi. Tidak ada dependensi runtime lain, jadi paket ini bisa langsung masuk ke proyek yang sudah ada tanpa menarik banyak paket.

Ringkasan

Satu metode, tiga varian, dipilih dengan invisible dan enterprise di array options. Baca $result['code'], kirimkan sebagai g-recaptcha-response, impor exception dari CapSkip\Exceptions, dan jauhkan pemecahan dari thread permintaan Anda.

Cakupan PHP yang lebih luas ada di pemecah CAPTCHA PHP halaman, bahasa lain di pemecah reCAPTCHA v2 halaman, dan ada demo v2 langsung untuk diuji. CapSkip adalah pemecah captcha lokal, sehingga tidak ada tagihan per pemecahan.