Cara Memecahkan reCAPTCHA v3 di PHP dan Menetapkan Action

solve recaptcha v3 in php - How to Solve reCAPTCHA v3 in PHP and Set an Action

reCAPTCHA v3 tidak pernah merender tantangan. Ia menilai kunjungan tanpa mencolok dan memberikan token kepada halaman, yang kemudian diverifikasi backend situs. Bagi kode Anda, itu berarti tidak ada yang perlu diklik, sehingga seluruh pekerjaannya adalah menghasilkan token yang diterima situs. Di PHP hal itu adalah recaptcha metode yang akan Anda gunakan untuk v2, dengan flag versi di dalam array options.

Hal yang menentukan apakah ini berhasil adalah action.

Penyiapan

# PHP 8.0+, with the curl and json extensions.
composer require capskip/capskip
use CapSkip\CapSkip;

$solver = new CapSkip([
    'host' => '127.0.0.1',
    'port' => 8080,
    'recaptchaTimeout' => 300,   // seconds, shared with Turnstile and GeeTest
]);

CapSkip berjalan di komputer Anda sendiri, jadi aplikasi desktop harus dibuka lebih dulu.

Panggilan dasar

$result = $solver->recaptcha(
    '6Lc...YOUR_SITEKEY',
    'https://example.com/checkout',
    [
        'version' => 'v3',
        'action' => 'submit',
    ]
);

echo $result['code'];   // the v3 token

Ada dua hal yang berbeda dari v2. version harus v3, dan action harus cocok dengan apa pun yang diteruskan halaman ke grecaptcha.execute. Hilangkan dan nilai defaultnya menjadi verify.

Mengapa action itu penting

Action adalah label yang dilekatkan situs pada setiap interaksi terlindungi sehingga login dan checkout dapat dinilai secara terpisah. Sebagian besar backend memeriksa bahwa action yang dibawa token cocok dengan yang mereka harapkan untuk endpoint tersebut.

Kirim label yang salah dan token-nya asli tetapi bertanda untuk interaksi yang berbeda, yang langsung ditolak banyak verifikator. Baca nilai sebenarnya dari halaman alih-alih menebak:

$html = file_get_contents('https://example.com/checkout');

// Sites normally call execute() with the action as a string literal.
preg_match('/execute\([^,]+,\s*\{\s*action:\s*[\'"]([^\'"]+)/', $html, $m);
$action = $m[1] ?? 'verify';

$result = $solver->recaptcha($sitekey, $pageUrl, [
    'version' => 'v3',
    'action' => $action,
]);

Nilai yang umum adalah login, submit, homepage dan checkout, tetapi itu adalah string sembarang yang ditentukan oleh siapa pun yang membangun situs tersebut.

Enterprise v3

$result = $solver->recaptcha($sitekey, $pageUrl, [
    'version' => 'v3',
    'enterprise' => 1,
    'action' => 'submit',
]);

Enterprise adalah flag ortogonal, bukan produk terpisah, jadi ia menumpuk pada panggilan v3. Bedakan keduanya dari skrip yang dimuat halaman: Enterprise menarik dari enterprise.js, standar menarik api.js. Menebak salah membuat pemecahan gagal alih-alih mengembalikan token yang buruk, jadi mengujinya tidak memakan biaya.

Mengirimkan token

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

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'token' => $result['code'],
        'order_id' => '...',
    ]),
]);

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

Berbeda dengan v2, tidak ada widget formulir standar yang membatasi bentuknya, sehingga integrasi v3 bervariasi. Sebagian menggunakan input tersembunyi g-recaptcha-response , sebagian lain mengirim JSON dengan key kustom. Periksa JavaScript milik halaman itu sendiri sebelum mengasumsikan nama field.

Kesalahan

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

try {
    $result = $solver->recaptcha($sitekey, $pageUrl, ['version' => 'v3']);
} 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
}

Perhatikan CapSkip\Exceptions namespace. Menyalin import dari contoh Python atau Node adalah sumber umum error fatal di sini.

Pertanyaan yang sering diajukan

Bisakah saya memeriksa skornya sebelum mengirim?

Tidak. Skor berada di Google dan hanya diungkapkan kepada pemilik situs ketika backend mereka memverifikasi token. Dari sisi klien Anda hanya menerima token dan tidak lebih, jadi tidak ada yang bisa diperiksa atau disaring sebelumnya.

Haruskah saya memecahkan di dalam permintaan web?

Sebaiknya tidak. PHP bersifat sinkron dan satu pemecahan bisa memakan waktu beberapa detik, sehingga melakukannya saat halaman dirender akan menahan satu worker selama itu. Pindahkan ke pekerjaan berantrean atau worker CLI.

Bagaimana jika halaman tidak pernah menetapkan action?

Beberapa halaman memanggil execute tanpa itu, dan dalam kasus itu nilai default verify sudah benar. Jika regex Anda tidak menemukan apa pun, biasanya itulah penyebabnya, bukan bug parsing.

Ringkasan

Atur version ke v3, cocokkan action ke apa yang dijalankan halaman, tambahkan enterprise saat dimuat enterprise.js, impor exception dari CapSkip\Exceptions, dan kirim tokennya dengan cepat karena ia kedaluwarsa dalam sekitar dua menit.

Bahasa lain dibahas di halaman pemecah reCAPTCHA v3 halaman, detail Enterprise di pemecah Enterprise , dan cakupan PHP yang lebih luas ada di halaman pemecah CAPTCHA PHP . Lihat token dihasilkan secara langsung di halaman kami demo v3. CapSkip adalah pemecah captcha yang berjalan di perangkat keras Anda sendiri.