Cara Menggunakan Ulang Cookie cf_clearance di Python Scraper

Memecahkan challenge Cloudflare hanya separuh dari pekerjaannya. Yang Anda dapatkan dari memecahkannya adalah cookie cf_clearance, dan cookie itulah yang sebenarnya mencegah request berikutnya ditantang lagi. Cookie ini cepat kedaluwarsa, terikat pada lebih banyak hal daripada yang kebanyakan orang kira, dan berhenti bekerja begitu client Anda menyimpang dari client yang awalnya mendapatkannya. Tulisan ini membahas apa itu cookie tersebut, cara menangkapnya, apa yang diam-diam membuatnya tidak valid, dan cara membedakan cookie yang kedaluwarsa dari yang rusak.
Apa yang Anda butuhkan
- Python 3.10 atau lebih baru, dengan HTTP client yang mendukung session. Contoh-contoh di sini menggunakan session agar cookie tetap ada di setiap request.
- Target yang benar-benar menerbitkan challenge. Situs yang tidak pernah menantang Anda tidak akan pernah mengatur cookie-nya, sehingga tidak ada apa pun untuk diuji.
- CapSkip yang berjalan, baik dalam mode Local di alamat loopback maupun dalam mode Server di komputer yang dapat dijangkau oleh worker Anda. Keduanya dijelaskan pada pengaturan koneksi, jadi pilih satu sebelum mulai.
Apa sebenarnya cookie cf_clearance itu
Cookie ini adalah tanda terima. Referensi Cloudflare mendeskripsikannya sebagai cookie yang menyimpan bukti bahwa challenge telah dilewati, digunakan agar challenge tidak lagi diterbitkan ketika cookie ini ada. Cookie ini juga menjadi tempat hasil deteksi JavaScript disimpan, dan diatur dengan SameSite None, Secure, dan Partitioned agar statenya tetap bertahan pada request lintas situs.
Masa berlakunya bukan sesuatu yang bisa Anda pilih sendiri. Itu berasal dari pengaturan Challenge Passage pada situs yang Anda tuju, dan Cloudflare mendokumentasikan nilai defaultnya dengan jelas: cookie cf_clearance memiliki masa berlaku 30 menit, dengan rentang wajar yang disarankan antara 15 hingga 45 menit. Sebagian situs mempersingkatnya. Sebagian lagi memperpanjangnya. Anda tidak dapat membaca nilainya dari luar, jadi perlakukan setiap clearance sebagai sesuatu yang berumur pendek dan rancang sistem Anda untuk melakukan refresh, bukan berharap clearance itu bertahan lama.
Ada tiga konsekuensi praktis dari hal ini. Anda sebaiknya menyimpan cookie-nya, karena memecahkan ulang pada setiap request itu lambat dan boros. Anda sebaiknya tidak pernah berasumsi cookie itu akan bertahan setelah restart. Dan Anda sebaiknya memiliki jalur kode yang menyadari ketika cookie sudah basi dan diam-diam mendapatkan yang baru.
Langkah 1: pecahkan challenge-nya, lalu simpan seluruh client
Kesalahan pertama yang perlu dihindari adalah menganggap token sebagai hadiah utama. Padahal bukan. Token yang Anda dapatkan dari memecahkan challenge Turnstile adalah apa yang Anda tukarkan untuk mendapatkan clearance, dan cookie yang Anda terima kembali itulah yang bernilai setelahnya. Jadi urutannya adalah: pecahkan, kirim, lalu simpan session yang menerima responsnya.
# pip install capskip
from capskip import CapSkip
solver = CapSkip(host="127.0.0.1", port=8080)
# A challenge page needs two more values than a plain widget does.
result = solver.turnstile(
sitekey="YOUR_SITEKEY",
url="https://example.com/protected",
data="YOUR_CDATA",
pagedata="YOUR_CHLPAGEDATA",
)
token = result["code"]
agent = result["userAgent"] # not optional, see the next sectionKirim token itu dengan cara yang sama seperti yang dilakukan halaman itu sendiri, dari session yang memang ingin Anda pertahankan. Begitu respons kembali, cookie clearance sudah ada di cookie jar untuk session tersebut dan Anda bisa langsung membacanya.
# pip install requests
import requests
s = requests.Session()
s.headers["User-Agent"] = agent # the exact agent the solver returned
# ... submit the token here, exactly as the challenge page does ...
clearance = s.cookies.get("cf_clearance")
print(bool(clearance)) # True once the challenge is clearedLangkah 2: kenali apa yang diam-diam membuatnya tidak valid
Cloudflare tidak mempublikasikan ikatan yang pasti, sehingga tabel ini merupakan perilaku hasil pengamatan, bukan kontrak yang terdokumentasi resmi. Konsistensinya cukup untuk dijadikan dasar, dan setiap baris di sini pernah menghabiskan waktu satu sore penuh bagi seseorang.
| Apa yang berubah | Apakah clearance-nya tetap bertahan | Mengapa |
|---|---|---|
| String user agent Anda | Tidak | Clearance diterbitkan untuk identitas browser tertentu |
| Alamat IP sumber Anda | Tidak | Cookie yang berpindah ke alamat baru adalah tanda klasik dari replay |
| TLS fingerprint Anda | Biasanya tidak | Handshake dibaca sebelum cookie-nya, sehingga ketidakcocokan terdeteksi lebih awal |
| Hostname yang Anda tuju | Tidak | Clearance berlaku per situs, bukan per akun dan bukan per jaringan |
| Berlalunya waktu | Hanya sampai Challenge Passage kedaluwarsa | Defaultnya 30 menit dan situs bisa mengubahnya |
| Menambahkan cookie lain yang tidak berkaitan | Ya | Cookie lain diabaikan oleh pemeriksaan clearance |
Tiga baris pertama sebenarnya adalah satu aturan yang sama dalam tiga wujud berbeda: clearance itu milik sebuah client, bukan milik Anda. Jadi kunci identitas yang mendapatkannya. Artinya satu user agent, satu exit IP, dan satu profil TLS untuk sepanjang masa hidup cookie itu. Mengganti proxy di tengah session membuang clearance yang sudah Anda bayar mahal, dan ini adalah cara paling umum sebuah scraper yang tadinya berjalan lancar tiba-tiba mulai ditantang lagi tanpa alasan yang terlihat.
Ini juga sebabnya solver mengembalikan sebuah user agent, bukan hanya token. Turnstile mengikat token pada identitas browser yang menghasilkannya, sehingga token yang dikirim dengan agent berbeda akan ditolak meskipun token itu sendiri sepenuhnya valid. Gunakan nilai yang dikembalikan itu apa adanya, dan terus gunakan untuk setiap request yang membawa cookie hasilnya. Panduan langkah demi langkah halaman challenge Turnstile menunjukkan dari mana dua nilai input tambahan itu berasal, yang merupakan separuh lainnya dari hal yang sering salah dilakukan orang.
Langkah 3: simpan agar bertahan lintas eksekusi
Cookie clearance yang mati bersama proses Anda jauh kurang bernilai dibandingkan yang bertahan setelah restart. Simpan cookie jar bersama identitas yang menyertainya, karena cookie itu sendiri tidak berguna jika Anda memuatnya ulang dengan agent atau proxy yang berbeda.
# pip install requests
import json, time
def save_clearance(session, agent, proxy, path="clearance.json"):
"""Store the cookie with the identity that earned it."""
blob = {
"cf_clearance": session.cookies.get("cf_clearance"),
"user_agent": agent,
"proxy": proxy,
"stored_at": time.time(),
}
with open(path, "w") as fh:
json.dump(blob, fh)Memuat ulang adalah kebalikannya, dengan satu pemeriksaan tambahan. Kadaluwarsakan catatan itu sendiri alih-alih menunggu sampai ditantang, karena refresh yang proaktif hanya menghabiskan satu pemecahan, sedangkan yang reaktif menghabiskan satu request gagal terlebih dahulu.
# pip install requests
import json, time, requests
def load_clearance(path="clearance.json", max_age=900):
"""Return a ready session, or None if the record is too old."""
with open(path) as fh:
blob = json.load(fh)
# 15 minutes, comfortably inside a 30 minute default.
if time.time() - blob["stored_at"] > max_age:
return None
s = requests.Session()
s.headers["User-Agent"] = blob["user_agent"]
s.proxies = {"https": blob["proxy"]} if blob["proxy"] else {}
s.cookies.set("cf_clearance", blob["cf_clearance"])
return sLima belas menit adalah batas atas yang sengaja dibuat konservatif. Anda tidak bisa melihat nilai Challenge Passage yang dikonfigurasi sebuah situs, defaultnya 30 menit, dan melakukan refresh di tengah jalan hanya menghabiskan satu pemecahan murah, bukan satu batch yang rusak. Jika solver berjalan di hardware Anda sendiri tanpa biaya per pemecahan, melakukannya lebih awal itu gratis.
Langkah 4: deteksi clearance yang basi tanpa menebak-nebak
Clearance yang sudah mati tidak akan memberi tahu Anda lewat error yang jelas. Yang biasanya Anda dapatkan adalah 403 yang terlihat normal, atau 200 yang membawa halaman interstitial HTML alih-alih JSON yang Anda minta. Memeriksa kode status saja tidak akan menangkap kasus kedua, dan sebuah retry loop yang hanya mengawasi kode status akan dengan senang hati berputar terus tanpa henti.
# pip install requests
def needs_new_clearance(response):
"""True when this response is a challenge rather than content."""
if response.status_code in (403, 503):
return True
body = response.text[:4000].lower()
markers = ("cf-turnstile", "challenge-platform", "just a moment")
return any(m in body for m in markers)Pasang pemeriksaan itu di depan parser Anda, bukan sesudahnya. Ketika hasilnya true, buang catatan yang tersimpan, lakukan satu kali pemecahan, dan coba lagi dengan session yang baru. Jangan mencoba lagi dengan cookie lama dan sleep yang lebih panjang, karena bukan waktu yang menjadi masalahnya. Perbedaan yang sama juga muncul pada token reCAPTCHA, yang jendela kedaluwarsanya bahkan jauh lebih singkat, dan tulisan tentang berapa lama token reCAPTCHA tetap valid membahas sisi itu.
Menjalankan pemecah di server saja
Cookie clearance berlaku per identitas, sehingga armada worker membutuhkan armada clearance, dan masing-masing harus dipecahkan. Pekerjaan itu tidak harus terjadi di worker itu sendiri. Pengaturan koneksi mencakup kedua susunan ini:
| Mode | Mendengarkan di | Gunakan saat |
|---|---|---|
| Lokal | 127.0.0.1, hanya perangkat itu | Scraper Anda dan pemecah berjalan di satu mesin |
| Server | Alamat jaringan atau IP publik Anda | Workers, VPS, atau platform hosted yang memanggil lewat API |
Arahkan host SDK ke mesin solver dan tidak ada lagi yang perlu diubah di kode Anda, sehingga dua puluh worker bisa berbagi satu instance sementara masing-masing tetap menyimpan cookie jar-nya sendiri. IP publik statis disarankan ketika pemanggil berada di luar jaringan Anda sendiri. Detailnya ada di pengaturan koneksi, dan mode Server tetap berjalan di hardware Anda sendiri dan tetap tanpa meteran: yang berubah hanya di mana solver berjalan, bukan siapa pemiliknya.
FAQ
Berapa lama cookie cf_clearance bertahan?
Tiga puluh menit secara default, dan pemilik situs bisa mengubahnya. Cloudflare mengeksposnya sebagai pengaturan Challenge Passage dan menyarankan menjaganya antara 15 dan 45 menit, sehingga sebagian besar situs yang Anda temui akan berada di rentang tersebut. Anda tidak dapat membaca nilai yang dikonfigurasi dari luar, itulah sebabnya melakukan refresh dengan timer yang Anda kendalikan sendiri lebih baik daripada menunggu ditantang lagi.
Bisakah saya berbagi satu cookie clearance di antara beberapa worker?
Hanya jika mereka berbagi identitas yang mendapatkannya, yang dalam praktiknya berarti exit IP yang sama, user agent yang sama, dan profil TLS yang sama. Ini bisa dicapai di balik satu proxy, dan merupakan cara yang baik untuk menghemat pemecahan. Begitu dua worker menggunakan alamat exit yang berbeda, cookie yang dibagikan akan mulai gagal untuk salah satunya, dan kegagalan itu terlihat acak sampai Anda menyadari worker mana yang mengalaminya.
Mengapa clearance saya berhenti bekerja setelah saya mengganti proxy?
Karena clearance itu diterbitkan untuk alamat yang lama. Cookie yang datang dari IP baru persis pola yang memang dirancang untuk ditangkap oleh perlindungan replay, sehingga cookie itu dibuang dan Anda ditantang lagi. Sebagai gantinya, lakukan rotasi pada batas session: satu proxy mendapatkan satu clearance, menggunakannya sampai kedaluwarsa, dan session berikutnya dimulai dari awal dengan alamat baru dan pemecahan baru.
Apakah saya perlu browser sungguhan untuk menyimpan cookie clearance?
Tidak. HTTP client mana pun yang memiliki cookie jar bisa membawanya, selama identitas di sekitarnya tetap tidak berubah. Yang diberikan browser secara cuma-cuma adalah TLS handshake yang meyakinkan dan urutan header yang meyakinkan, sementara HTTP client biasa tidak memiliki keduanya secara default. Jadi cookie-nya bukan bagian yang sulit, konsistensinyalah yang sulit, dan client yang melakukan impersonation menutupi hal itu tanpa biaya memori sebuah browser.
Versi paling singkatnya
Perlakukan cookie cf_clearance sebagai tanda terima berumur pendek yang terikat pada satu client. Tangkap dari session yang berhasil melewati challenge, simpan bersama user agent dan proxy yang mendapatkannya, dan lakukan refresh dengan timer sekitar lima belas menit alih-alih menunggu sampai diblokir. Periksa body-nya, bukan hanya kode statusnya, karena sebuah challenge bisa datang dengan status 200 yang tampak sehat sepenuhnya. Saat cookie itu benar-benar kedaluwarsa, satu kali pemecahan baru sudah cukup menjadi solusinya, dan sebuah pemecah captcha yang berjalan di hardware Anda sendiri membuat hal itu cukup murah untuk dilakukan lebih awal. Untuk dua bentuk input yang bisa diambil oleh sebuah pemecahan Turnstile, baca halaman pemecah Cloudflare Turnstile sebelum Anda memasang apa pun. Cara memasangnya ke worker pool dibahas secara terpisah di Pemecah CAPTCHA untuk web scraping, yang sepadan dengan dua puluh menit waktu Anda jika Anda menjalankan lebih dari satu worker.
