Cara Memecahkan reCAPTCHA dengan Parameter data-s di Python

recaptcha data-s parameter - How to Solve reCAPTCHA with the data-s Parameter in Python

Halaman milik Google sendiri menyertakan satu nilai tambahan pada widget reCAPTCHA, dan namanya data-s. Pecahkan salah satunya dengan cara biasa dan Anda mendapat token yang justru ditolak halaman itu. Perbaikannya adalah satu argumen tambahan: baca data-s dari HTML halaman, kirimkan ke pemecah, lalu submit token itu segera.

Parameter data-s recaptcha adalah bagian yang hampir selalu terlewat, terutama karena parameter ini tidak ada di situs biasa. Berikut tempatnya berada, cara menamainya, dan skrip yang bekerja dari awal sampai akhir.

Apa sebenarnya data-s itu

Ini adalah nilai berumur pendek dan sekali pakai yang dilampirkan Google ke widget reCAPTCHA di propertinya sendiri. Interstitial “unusual traffic” di Google Search adalah yang paling sering Anda temui. Nilai ini mengikat tantangan ke pemuatan halaman tertentu itu, jadi token yang Anda dapatkan hanya valid untuk konteks permintaan yang sama.

Tiga hal mengikuti dari situ, dan ketiganya menyebabkan kegagalan:

  • Nilainya kedaluwarsa. Perlakukan seperti nonce. Ambil halamannya, pecahkan, kirim. Jangan simpan di cache antar-eksekusi.
  • Hanya ada di Google. reCAPTCHA di situs orang lain tidak punya data-s. Tetap mengirimkannya adalah error parameter, bukan tambahan yang tidak berbahaya.
  • Ini bukan flag Enterprise. Keduanya terus-menerus tertukar. data-s dan enterprise adalah opsi terpisah yang menyelesaikan masalah berbeda, dan halaman pemecah reCAPTCHA Enterprise membahas yang kedua.

Apa yang Anda butuhkan

  • CapSkip berjalan secara lokal. Aplikasi ini mendengarkan di 127.0.0.1:8080 secara default, dan panduan penyiapan membahas proses instalasinya.
  • Python 3.10 atau lebih baru.
  • SDK dan sebuah client HTTP.
# the CapSkip SDK plus requests for fetching the page
pip install capskip requests

Di mana menemukan nilai data-s

Kedua nilai yang Anda butuhkan berada pada elemen yang sama. Widget-nya dirender sebagai sebuah div yang membawa data-sitekey dan, hanya di halaman Google, data-s:

<div class="g-recaptcha"
     data-sitekey="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
     data-s="SGVsbG8gdGhlcmUsIHRoaXMgaXMgYSBvbmUtdGltZSB2YWx1ZQ">
</div>

sitekey bersifat stabil dan bisa Anda hardcode. Nilai data-s berubah setiap kali halaman dimuat, jadi harus diambil saat runtime:

# pip install capskip requests
import re
import requests

PAGE = "https://www.google.com/search?q=example"

# Keep one session. The value is tied to the request that
# produced it, cookies included.
session = requests.Session()
html = session.get(PAGE, timeout=30).text

sitekey = re.search(r'data-sitekey="([^"]+)"', html).group(1)
datas   = re.search(r'data-s="([^"]+)"', html).group(1)

print(sitekey, datas)   # second value is single use

Jika kecocokan kedua kembali kosong, Anda tidak sedang berada di halaman Google dan sama sekali tidak memerlukan parameter ini. Pecahkan saja sebagai tantangan v2 biasa.

Kirimkan sebagai datas, bukan data-s

Ini jebakan penamaannya. API HTTP mentah menerima parameter persis seperti yang muncul di HTML, data-s. SDK tidak bisa memakai nama itu, karena tanda hubung tidak sah dalam keyword argument Python, jadi setiap SDK mengeksposnya sebagai datas.

LokasiNama
HTML halamandata-s
API mentah di in.phpdata-s
SDK Python, Node.js, PHP, .NETdatas

Setelah itu beres, pemecahannya hanya satu panggilan:

from capskip import CapSkip

solver = CapSkip(host="127.0.0.1", port=8080)

result = solver.recaptcha(
    sitekey=sitekey,
    url=PAGE,
    datas=datas,      # the data-s value, scraped seconds ago
)

print(result["code"])   # g-recaptcha-response token

Contoh lengkap yang berfungsi

Ambil, scrape, pecahkan, kirim, semuanya dalam satu session agar cookie dan IP tetap konsisten:

# pip install capskip requests
import re
import requests
from capskip import (
    CapSkip, ApiException, NetworkException, TimeoutException,
)

PAGE = "https://www.google.com/search?q=example"

session = requests.Session()
solver = CapSkip(host="127.0.0.1", port=8080, recaptchaTimeout=300)

html = session.get(PAGE, timeout=30).text
sitekey = re.search(r'data-sitekey="([^"]+)"', html).group(1)
datas   = re.search(r'data-s="([^"]+)"', html).group(1)

try:
    result = solver.recaptcha(sitekey=sitekey, url=PAGE, datas=datas)
except NetworkException:
    raise SystemExit("CapSkip is not running on 127.0.0.1:8080")
except TimeoutException:
    raise SystemExit("solve took longer than recaptchaTimeout")
except ApiException as err:
    raise SystemExit(f"API refused the task: {err}")

# Submit immediately. The token is good for about two minutes.
response = session.post(
    PAGE,
    data={"g-recaptcha-response": result["code"]},
    timeout=30,
)
print(response.status_code)

Dua detail di sana lebih penting daripada kelihatannya. Objek session digunakan ulang, sehingga pemecahan dan pengiriman berbagi cookie. Dan pengiriman terjadi tepat setelah pemecahan, karena token reCAPTCHA berhenti diterima kira-kira dua menit setelah diterbitkan.

Di balik proxy

Jika Anda mengambil halaman lewat proxy, pecahkan lewat proxy yang sama. Tantangannya terikat pada permintaan yang membuatnya, dan pemecahan dari jalur jaringan yang berbeda adalah penyebab paling umum kedua token ditolak.

result = solver.recaptcha(
    sitekey=sitekey,
    url=PAGE,
    datas=datas,
    proxy={"type": "HTTPS", "uri": "user:[email protected]:3128"},
)

Proxy berfungsi untuk reCAPTCHA, Turnstile dan GeeTest. Proxy tidak berguna untuk CAPTCHA gambar, yang tidak pernah menyentuh situs target.

Panggilan yang sama tanpa SDK

API-nya kompatibel dengan 2captcha dan berjalan di komputer Anda, jadi client HTTP apa pun bisa dipakai. Di sini parameternya tetap memakai tanda hubung:

# submit the task, get an ID back
curl -s -X POST "http://127.0.0.1:8080/in.php" \
  -d "key=capskip" \
  -d "method=userrecaptcha" \
  -d "googlekey=YOUR_SITEKEY" \
  -d "pageurl=https://www.google.com/search?q=example" \
  -d "data-s=THE_DATA_S_VALUE" \
  -d "json=1"

# {"status":1,"request":"2122988149"}

Lalu lakukan polling ke res.php untuk mendapatkan token. Alur dua panggilan lengkapnya, termasuk jeda polling, ada di panduan memecahkan CAPTCHA dengan cURL.

SDK lain memakai ejaan datas yang sama. Node.js menerimanya di dalam objek options, dan .NET menaruhnya di dictionary options:

// npm install capskip
const { CapSkip } = require('capskip');

const solver = new CapSkip({ host: '127.0.0.1', port: 8080 });

const result = await solver.recaptcha(sitekey, pageUrl, {
  datas: dataS,        // same value, same rules
});

console.log(result.code);

Kesalahan umum

Apa yang Anda lihatPenyebabPerbaiki
ERROR_GOOGLEKEYsitekey tidak pernah masuk ke permintaan, atau regex mencocokkan atribut yang salahCetak nilai hasil scraping sebelum memecahkan. Detailnya ada di panduan memperbaiki ERROR_GOOGLEKEY
ERROR_BAD_PARAMETERSdata-s dikirim sebagai string kosong, atau dikirim ke halaman non-GoogleKirimkan hanya jika atributnya memang ada
ERROR_CAPTCHA_UNSOLVABLEBiasanya nilai basi dari data-s: halaman diambil beberapa menit sebelum pemecahanAmbil dan pecahkan berurutan tanpa jeda. Lihat ERROR_CAPTCHA_UNSOLVABLE
Token diterima oleh pemecah, ditolak oleh GoogleCookie berbeda atau IP berbeda antara pengambilan dan pengirimanGunakan ulang satu session, dan pakai proxy yang sama untuk keduanya
NetworkExceptionCapSkip tidak sedang berjalanJalankan aplikasinya, pastikan portnya di pengaturan

Setiap parameter dan bentuk respons tercantum di dokumentasi API.

Pertanyaan yang sering diajukan

Apakah saya perlu data-s di situs web biasa?

Tidak. Parameter ini hanya muncul di halaman milik Google sendiri. Jika data-s tidak ada di dalam HTML, hilangkan argumen itu sepenuhnya dan pecahkan sebagai tantangan v2 standar, seperti yang dijelaskan di halaman pemecah reCAPTCHA v2 tersebut.

Apakah data-s sama dengan flag Enterprise?

Tidak, dan keduanya independen. enterprise=1 memberi tahu pemecah produk reCAPTCHA mana yang sedang dihadapi. datas membawa nilai sekali pakai dari halaman. Tantangan Google Search memerlukan yang kedua, dan Anda bisa mengirim keduanya jika sebuah halaman memang memerlukannya.

Berapa lama nilai itu tetap berlaku?

Anggap hitungan detik, bukan menit. Nilai ini diterbitkan bersama halaman dan mati bersama halaman itu. Jika scraper Anda mengantrekan halaman dan memecahkannya belakangan, ambil ulang halamannya saat pemecahan alih-alih menyimpan nilainya.

Mengapa di kode ditulis datas tetapi di HTML data-s?

Karena tanda hubung tidak boleh muncul dalam keyword argument Python atau identifier C#. SDK menghapusnya dan mengirimkan nama bertanda hubung itu untuk Anda. Panggilan in.php mentah tetap mengharapkan data-s.

Ringkasan

Ambil data-sitekey dan data-s dari elemen yang sama, kirim yang kedua sebagai datas, dan submit token pada session yang sama dalam beberapa menit. Lewatkan salah satu dari ketiganya dan Anda mendapat token yang terlihat baik-baik saja tetapi gagal.

Sisa antarmuka Python ada di halaman pemecah CAPTCHA Python . CapSkip melakukan semua ini sebagai layanan lokal pada bypass captcha di komputer Anda sendiri, sehingga scraping halaman dua kali untuk mendapatkan nilai baru tidak menelan biaya apa pun selain permintaannya.