Cara Memecahkan CAPTCHA DataDome di Python (requests)

Untuk memecahkan CAPTCHA DataDome di Python, Anda membaca halaman blokir 403, membangun alamat challenge darinya, lalu mengirim alamat itu ke pemecah DataDome CapSkip dengan datadome(), dan mengulangi permintaan Anda dengan cookie yang dikembalikan. Jawabannya adalah cookie, bukan token untuk formulir, dan dokumentasi CapSkip menyebut bahwa cookie itu hanya berfungsi dengan User-Agent dan alamat IP yang dipakai saat memperolehnya. Panduan ini menjalankan seluruh loop dengan SDK Python CapSkip dan requests dalam sekitar 90 baris. CapSkip berjalan di PC Windows Anda sendiri tanpa biaya per pemecahan, jadi percobaan ulang tidak memakan biaya.
Apa yang Anda butuhkan
- CapSkip 3.2.0 atau lebih baru yang berjalan di PC Windows. Rilis itu menambahkan pemecahan DataDome untuk slider dan device check. Lihat panduan penyiapan untuk menjalankannya pertama kali.
- Python 3.10 atau lebih baru dan paket capskip versi 1.5.0 atau lebih baru. Versi sebelumnya tidak memiliki metode datadome. Kode di bawah dijalankan pada Python 3.11.7 dan 3.14.0 dengan capskip 1.5.0 dan requests 2.34.2. Python 3.10 tidak dicoba di sini.
- Prompt PowerShell. Perintahnya memakai sintaks PowerShell.
- Halaman milik Anda atau yang boleh Anda otomatisasi, di balik DataDome.
- Sebuah alamat untuk pemecah CAPTCHA. Dalam mode Local, CapSkip menjawab di 127.0.0.1 hanya untuk perangkat itu. Dalam mode Server, CapSkip mendengarkan di alamat jaringan atau IP publik Anda, sehingga skrip di PC lain, VPS, atau platform hosting dapat menjangkaunya melalui API. Keduanya diatur di pengaturan koneksi.
- Sebuah proxy sticky (proxy yang mempertahankan alamat IP yang sama) untuk setiap task setelah Anda melewati tahap pengujian. Cookie terikat pada alamat IP yang memperolehnya, seperti dijelaskan di Langkah 3.
Cara pengujiannya: kode dijalankan terhadap tiga server mock (server pengganti yang dibuat khusus untuk pengujian) yang saya tulis, bukan terhadap situs DataDome sungguhan. Satu meniru pemeriksaan CapSkip yang tercantum di bagian DataDome pada Dokumentasi API, satu berperan sebagai situs terlindungi yang menyajikan halaman blokir 403 dan hanya menerima cookie yang diterbitkan CapSkip, dengan User-Agent yang dipakai saat cookie itu diterbitkan, dan satu lagi berperan sebagai forward proxy. SDK-nya adalah capskip 1.5.0 yang asli. Aplikasi CapSkip tidak berjalan di PC saya, jadi tidak ada hal di sini yang menunjukkan berapa lama pemecahan sungguhan berlangsung atau apa yang diterima situs DataDome yang aktif. Aturan tentang cookie berasal dari dokumentasi CapSkip. Sedangkan dokumentasi cookie milik DataDome sendiri menyatakan bahwa cookie datadome berlaku selama satu tahun dan memperingatkan agar Domain atau Path-nya tidak diubah. Dokumentasi itu tidak menyebut cookie tersebut terikat pada apa.
Langkah 1: baca halaman blokir dan bangun captcha_url
Ketika DataDome meragukan sebuah permintaan, situs menjawab dengan status 403, kadang 401, dan halaman HTML kecil sebagai ganti konten. Halaman itu berisi objek skrip bernama dd dan memuat challenge dalam iframe dari geo.captcha-delivery.com. Alamat iframe itulah yang dibutuhkan CapSkip, dan dokumentasi menyebutnya captcha_url. Jika halaman sudah berisi iframe, Anda bisa mengambil src-nya apa adanya. Sebagian besar halaman blokir membangun iframe dengan skrip, jadi fungsi di bawah merakit alamat yang sama dari objek dd.
Nilai rt menentukan jalurnya. Nilai c berarti slider di bawah /captcha/, dan i berarti device check di bawah /interstitial/. Nilai t juga penting: fe adalah challenge, dan bv berarti DataDome telah memblokir alamat IP yang mengambil halaman itu. Permintaan pertama dikirim dengan User-Agent Chrome biasa. String itu tidak pernah dikirim ke CapSkip, jadi versi Chrome-nya tidak harus cocok dengan apa pun. Saya tidak menguji apakah situs DataDome yang aktif memberikan challenge yang sama kepada User-Agent yang berbeda, jadi anggap bagian itu belum teruji.
# pip install capskip requests
import json
import re
from urllib.parse import urlencode
import requests
PAGE_URL = "https://www.example.com/" # a page behind DataDome
BROWSER = { # for the first request only; the cookie comes with its own User-Agent
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
}
def get(headers, via=None):
proxies = {"http": via, "https": via} if via else None
return requests.get(PAGE_URL, headers=headers, proxies=proxies, timeout=30)
def captcha_url_from(resp):
"""Build the challenge address from a DataDome block page, or None."""
if resp.status_code not in (401, 403):
return None
found = re.search(r"var\s+dd\s*=\s*(\{[^}]*\})", resp.text)
if not found:
return None
dd = json.loads(found.group(1).replace("'", '"'))
path = "interstitial" if dd["rt"] == "i" else "captcha"
query = {"initialCid": dd["cid"], "hash": dd["hsh"], "cid": dd["cookie"]}
if dd.get("t"):
query["t"] = dd["t"] # fe is a challenge, bv means the address is banned
query.update(referer=PAGE_URL, s=dd["s"])
for key in ("e", "b"):
if dd.get(key):
query[key] = dd[key]
query["dm"] = "cd"
return f"https://{dd.get('host', 'geo.captcha-delivery.com')}/{path}/?{urlencode(query)}"Fungsi ini mengembalikan None untuk respons apa pun yang bukan halaman blokir, sehingga skrip dapat membedakan “tidak ada yang perlu dipecahkan” dari “sudah dipecahkan”. Setiap halaman blokir adalah challenge baru. Pakai captcha_url-nya segera, dan minta halaman lagi untuk task berikutnya alih-alih memakai ulang alamat lama.
Langkah 2: pecahkan dengan datadome()
Metode SDK-nya adalah datadome(captcha_url, pageurl, userAgent, proxy), yang mengikuti urutan argumen 2Captcha. Dua yang pertama wajib. Di CapSkip, userAgent dan proxy bersifat opsional. Jika Anda tidak mengirim User-Agent, CapSkip memakai milik browsernya sendiri dan mengembalikannya sebagai userAgent di hasil. Jika Anda mengirimnya, harus Chrome untuk Windows dengan versi mayor yang sama dengan browser CapSkip, jadi tidak mengirimnya adalah pilihan yang mudah. Metode ini menunggu dengan timeout 300 detik yang lebih panjang, yang juga dipakai reCAPTCHA, karena CapSkip melewati challenge di browser sungguhan. Dokumentasi API menyebut pemecahan biasanya memakan 3 sampai 20 detik, dan saya tidak mengukurnya.
Proxy adalah proxy yang akan dipakai permintaan Anda berikutnya. Berikan jika skrip Anda keluar melalui proxy, dan jangan berikan apa pun jika permintaan keluar dari mesin yang menjalankan CapSkip. Jika CapSkip berada di server, mesin itu adalah server tersebut.
from capskip import CapSkip
# Local mode. In Server mode, use your server's address instead.
solver = CapSkip(host="127.0.0.1", port=8080)
def proxy_arg(proxy_url):
if not proxy_url:
return None # your requests leave from the PC that runs CapSkip
scheme, rest = proxy_url.split("://", 1)
return {"type": scheme.upper(), "uri": rest} # e.g. HTTP, user:pass@ip:port
def solve(captcha_url, proxy_url=None):
# No userAgent argument: CapSkip uses its own browser's and reports it.
return solver.datadome(captcha_url, PAGE_URL, proxy=proxy_arg(proxy_url))Jika device check tidak bisa dipenuhi, DataDome beralih ke slider. Menurut dokumentasi CapSkip, satu panggilan yang sama mengikutinya ke sana, jadi Anda tidak memerlukan kode terpisah untuk kedua challenge itu.
Langkah 3: kirim cookie dengan User-Agent dan alamat IP-nya
Hasilnya adalah dictionary dengan empat field yang penting. Field code adalah cookie persis seperti yang diatur DataDome, lengkap dengan Max-Age, Domain, dan atribut lainnya, yang dibutuhkan cookie jar. Field cookie hanya berisi pasangan nama dan nilai datadome, yang dibutuhkan header Cookie. Field userAgent adalah User-Agent yang memperolehnya. Field proxy muncul hanya jika Anda tidak mengirim proxy dan CapSkip memecahkan melalui daftar proxy DataDome bawaannya sendiri. Dokumentasi CapSkip menyebut DataDome menolak cookie dari alamat IP lain atau dengan User-Agent lain, jadi kirim User-Agent yang sama setiap kali, dan ketika hasilnya menyebut sebuah proxy, kirim permintaan melalui proxy itu. Field proxy tersebut hanya berisi host dan port, tanpa skema dan tanpa login. Fungsi ini menambahkan http:// sehingga mengasumsikan proxy daftar yang tidak memerlukan login. Jika proxy Anda memerlukannya, tambahkan sendiri.
DataDome juga bisa mengirim cookie pengganti pada respons berikutnya. Fungsi ini menyimpan yang terbaru, seperti yang dilakukan sebuah browser.
def send_with_cookie(result, proxy_url=None):
# The cookie works only from the address and User-Agent that earned it.
via = proxy_url
if not via and result.get("proxy"):
via = "http://" + result["proxy"] # CapSkip solved through its own list
headers = {"User-Agent": result["userAgent"], "Cookie": result["cookie"]}
resp = get(headers, via)
fresh = resp.cookies.get("datadome") # DataDome may rotate the cookie
if fresh:
headers["Cookie"] = f"datadome={fresh}"
return resp, headers, viaCookie diatur secara manual di header, jadi requests tidak mengelolanya untuk Anda. Itu disengaja: header eksplisit mengalahkan cookie jar sesi, dan menjaga cookie, User-Agent, dan proxy tetap bersama di satu tempat. Satu hal yang ditunjukkan eksekusi dengan proxy: teks setelah skema dikirim ke CapSkip persis seperti yang Anda tulis, jadi jaga agar login proxy bebas dari karakter yang memerlukan percent-encoding. Untuk proxy socks5, requests juga memerlukan extra socks, yang dipasang dengan pip install requests[socks].
Langkah 4: contoh lengkap yang berfungsi
Blok terakhir menyatukan alur CAPTCHA DataDome di Python dan menambahkan percobaan ulang. Simpan keempat blok dalam satu file bernama datadome_demo.py, satu demi satu, lalu jalankan dengan python datadome_demo.py. Setiap percobaan meminta halaman lagi, jadi tiap percobaan membawa challenge baru. Pemecahan yang gagal memunculkan ApiException dan loop mencoba lagi. Cookie yang tetap mendapat 403 juga membuat loop berputar lagi, dengan halaman blokir yang baru.
from capskip import ApiException
def fetch_protected(proxy_url=None):
for attempt in range(1, 4):
resp = get(BROWSER, proxy_url) # a fresh block page, a fresh challenge
captcha_url = captcha_url_from(resp)
if captcha_url is None:
return resp, BROWSER, proxy_url # no block page on this response
try:
result = solve(captcha_url, proxy_url)
except ApiException as err:
print(f"attempt {attempt}: {err}") # the next attempt gets a new page
continue
resp, headers, via = send_with_cookie(result, proxy_url)
if resp.status_code != 200:
print(f"attempt {attempt}: HTTP {resp.status_code} with the cookie")
continue
return resp, headers, via
raise RuntimeError("DataDome not passed in 3 attempts")
if __name__ == "__main__":
page, headers, via = fetch_protected()
print(page.status_code, page.text[:40])
again = get(headers, via) # reuse the cookie while it lasts
print(again.status_code)SDK menolak captcha_url dengan t=bv sebelum mengirim apa pun, karena tidak ada pemecahan dari alamat itu yang bisa lolos. ValidationException itu bukan ApiException, jadi loop tidak menangkapnya. Biarkan muncul: itu adalah sinyal untuk mengganti alamat dan mulai dari awal. Pemblokiran yang justru dilaporkan CapSkip, sebagai ERROR_PROXY_BANNED, tiba sebagai ApiException dan loop mencobanya lagi pada alamat yang sama, jadi jika Anda melihat error itu di output, ganti proxy sebelum menjalankan lagi. Lihat panduan rotasi proxy untuk cara merotasinya, dan cara membedakan CAPTCHA dari blokir untuk kasus lainnya, ketika halaman itu sama sekali bukan challenge.
Pada eksekusi mock, skrip berperilaku seperti ini:
| Pengaturan mock | Yang dilakukan skrip |
|---|---|
| Halaman blokir slider, setiap pemecahan dijawab | Satu task, lalu status 200 dengan cookie, dan 200 lagi saat dipakai ulang |
| Halaman blokir device check | Kode yang sama berjalan: captcha_url menunjuk ke /interstitial/ dan hasilnya sama |
| Dua pemecahan pertama ditolak | Dua baris percobaan, lalu status 200 pada task ketiga |
| Tiga pemecahan pertama ditolak | Tiga baris percobaan, lalu RuntimeError |
| Hasil menyebut sebuah proxy, seperti daftar milik CapSkip sendiri | Permintaan dengan cookie melewati proxy itu dan mendapat 200 |
| Proxy Anda sendiri diteruskan ke pemecahan | in.php menerima proxy beserta tipenya, dan permintaan memakainya |
| Halaman blokir dengan t=bv | ValidationException, dan mock CapSkip tidak melihat permintaan sama sekali |
| Cookie dikirim dengan User-Agent yang berbeda | Situs mock menjawab 403 |
| Cookie dikirim dari alamat IP yang berbeda | Situs mock menjawab 403 untuk cookie yang diterbitkan CapSkip melalui proxy, yang dikirim tanpa proxy itu |
Dua baris terakhir menguji aturan mock saya, yang mengikuti dokumentasi CapSkip. Keduanya bukan bukti tentang layanan yang sebenarnya.
Kesalahan umum
| Kesalahan | Penyebab | Perbaiki |
|---|---|---|
| ValidationException | captcha_url yang bukan alamat challenge DataDome, halaman blokir dengan t=bv, pageurl yang bukan http atau https, atau userAgent yang bukan Chrome untuk Windows. Pesannya menyebut mana dari semua itu yang terjadi | Bangun ulang alamat dari halaman blokir yang baru, ganti alamat IP jika diblokir, dan hapus argumen userAgent |
| ApiException dengan ERROR_WRONG_USERAGENT | User-Agent adalah Chrome untuk Windows, tetapi versi mayornya berbeda dari browser CapSkip | Jangan kirim userAgent dan pakai yang dilaporkan hasilnya |
| ApiException dengan ERROR_CAPTCHA_UNSOLVABLE | Challenge tidak berhasil dilewati | Minta halaman lagi dan kirim captcha_url barunya |
| ApiException dengan ERROR_PROXY_BANNED | CapSkip menolak task yang halaman blokirnya berisi t=bv, menurut dokumentasi API | Ganti proxy dan minta halaman lagi |
| ApiException dengan ERROR_PROXY_CONNECT_REFUSED | CapSkip melaporkannya ketika tidak bisa terhubung melalui proxy. Saya tidak mereproduksinya | Periksa alamat, login, dan tipe proxy |
| TimeoutException | CapSkip tidak memberi jawaban dalam waktu tunggu 300 detik. Ini bukan ApiException, jadi loop tidak menangkapnya | Pastikan CapSkip berjalan dan memecahkan, lalu jalankan skrip lagi |
| NetworkException | CapSkip tidak berjalan, atau host atau port-nya salah | Jalankan CapSkip dan periksa pengaturan koneksi |
| Tetap 403 dengan cookie | Permintaan keluar dari alamat IP lain, memakai User-Agent lain, atau cookie sudah kedaluwarsa | Kirim userAgent dan proxy dari hasilnya setiap kali, atau jalankan loop lagi dengan halaman blokir yang baru |
Menjalankan solver di sebuah server
Skrip memerlukan dua hal dari CapSkip: host dan port. Dalam mode Local itu adalah 127.0.0.1 dan PC Anda sendiri. Dalam mode Server, CapSkip mendengarkan di alamat jaringan atau IP publik Anda, sehingga skrip di PC lain, VPS, atau platform hosting dapat memanggilnya melalui API yang sama. Ubah host dan port di konstruktor CapSkip, dan tidak ada hal lain yang berubah. IP publik statis disarankan untuk akses jarak jauh yang stabil. Mode Server tetap berjalan di hardware Anda sendiri dan tetap tanpa meteran. Mode Server memang membuka port untuk semua alamat, jadi tambahkan aturan blokir Windows Firewall untuk alamat yang tidak boleh menjangkaunya. Ingat bahwa pemecahan berjalan di mesin itu, jadi cookie diperoleh dari alamat IP server tersebut. Kecuali Anda memberikan proxy, permintaan yang membawa cookie juga harus keluar dari server itu. Dengan proxy, berikan proxy yang sama untuk pemecahan dan untuk permintaan Anda. Lihat pengaturan koneksi untuk cara beralih mode.
FAQ
Apakah pemecah DataDome mengembalikan token?
Tidak. Pemecah ini mengembalikan cookie datadome. Anda mengirim cookie itu di header Cookie pada permintaan yang diblokir, bersama User-Agent yang sama. Tidak ada field formulir yang perlu diisi.
Apakah saya memerlukan proxy untuk DataDome?
Tidak untuk pengujian. Satu alamat IP sudah cukup untuk percobaan pertama. Menurut dokumentasi CapSkip, cookie hanya berfungsi dari alamat IP yang memperolehnya, jadi begitu Anda mengirim banyak permintaan, rencanakan satu proxy sticky per task dan berikan proxy yang sama itu untuk pemecahan dan untuk permintaan Anda.
Apakah ini berfungsi untuk slider maupun device check?
Ya, lewat panggilan yang sama. captcha_url untuk slider berada di bawah /captcha/ dan untuk device check di bawah /interstitial/. Dokumentasi CapSkip menyebut bahwa device check yang naik menjadi slider akan diikuti ke sana.
Bisakah platform hosting menjalankan ini terhadap CapSkip saya?
Bisa, lewat mode Server. Atur CapSkip untuk mendengarkan di jaringan atau IP publik Anda, arahkan konstruktor CapSkip ke host dan port itu, dan loop bekerja sama, dengan satu perubahan: pemecahan kini berjalan di server, jadi berikan proxy yang sama untuk pemecahan dan untuk permintaan Anda. Pemecah tetap berjalan di hardware Anda.
Versi singkatnya
Sebuah CAPTCHA DataDome di Python memerlukan empat langkah: baca halaman blokir, bangun captcha_url, panggil datadome(), dan ulangi permintaan dengan cookie, User-Agent, dan alamat IP yang terikat padanya. Mencoba ulang itu gratis di mesin Anda sendiri, dan itulah yang Anda harapkan dari pemecah captcha lokal saat situs yang dilindungi terus memberi Anda challenge baru. Untuk bagian SDK lainnya, lihat Halaman pemecah CAPTCHA Python.
