Panduan
Klik gambar hCaptcha dengan Selenium
Halaman ini diterjemahkan otomatis dari versi bahasa Mandarin dan mungkin mengandung kesalahan. Versi bahasa Mandarin menjadi acuan utama.
Panduan ini membuka halaman demo hCaptcha dengan Selenium 4 dan menyelesaikan tantangan gambar kisi 3×3 di browser sungguhan: membaca pertanyaan dan 9 gambar, meminta pengenalan gambar hCaptcha (HCaptchaClassification) menentukan mana yang merupakan target, lalu mensimulasikan klik.
hCaptcha juga memiliki jenis tantangan seperti “klik posisi tertentu” dan “seret”, yang mengembalikan koordinat, bukan kotak. Cara menanganinya ada di pengenalan gambar hCaptcha. Jika tidak ingin menulis kode, Anda bisa langsung memakai ekstensi browser; semua jenis tantangan ini didukung.
Persiapan
Section titled “Persiapan”pip install requests seleniumexport YESCAPTCHA_CLIENT_KEY=your_client_key- Klik kotak centang. Kotak centang berada di iframe hCaptcha yang alamatnya memuat
frame=checkbox. Pindah ke iframe tersebut, lalu klik#checkbox. - Pindah ke iframe tantangan. Tantangan berada di iframe yang alamatnya memuat
frame=challenge. - Baca pertanyaan. Teks di
.prompt-textadalah pertanyaannya; kirim apa adanya ke API (disarankan mengganti bahasa antarmuka hCaptcha ke Mandarin Sederhana atau Inggris). Jika di samping pertanyaan ada gambar contoh kecil, masukkan juga keanchors. - Ambil gambar. Latar belakang
.task-image .imagedi setiap kotak adalah satu gambar kecil. Unduh berurutan, ubah ke Base64, lalu susun menjadi daftarqueries. - Kenali. Panggil
createTaskdengan jenisHCaptchaClassification.objectspada hasil sesuai satu-satu dengan kotak;trueberarti target. - Klik dan kirim. Klik kotak yang merupakan target, lalu tekan tombol kirim. Bisa muncul beberapa putaran berturut-turut; ulangi langkah 3 sampai 6.
- Selesai. Setelah lolos, kolom
h-captcha-responsedi halaman berisi token; kirim bersama formulir.
Kode lengkap
Section titled “Kode lengkap”"""Click through an hCaptcha 3x3 image challenge with Selenium 4 and HCaptchaClassification.
Flow: open the page -> click the checkbox -> read the question and the 9 images ->ask YesCaptcha which images match -> click them -> submit. Repeat while new rounds appear.
Run: pip install requests selenium export YESCAPTCHA_CLIENT_KEY=your_client_key python hcaptcha_click_selenium.pyEach recognized round is charged (see the price list; rounds with no target found are free).hCaptcha changes its page structure often; adjust the selectors below if a step stops working.Click and drag questions return coordinates instead; see the HCaptchaClassification page."""import base64import osimport reimport time
import requestsfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWait
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]PAGE_URL = "https://accounts.hcaptcha.com/demo"
def classify(question, images_b64): task = {"type": "HCaptchaClassification", "question": question, "queries": images_b64} data = requests.post( "https://api.yescaptcha.com/createTask", json={"clientKey": CLIENT_KEY, "task": task}, timeout=60, ).json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data["solution"] # synchronous
def background_image_b64(element): """The tiles are <div>s with a CSS background image; download it and Base64-encode it.""" style = element.get_attribute("style") or "" match = re.search(r'url\("?(.*?)"?\)', style) if not match: return None return base64.b64encode(requests.get(match.group(1), timeout=30).content).decode()
driver = webdriver.Chrome()wait = WebDriverWait(driver, 15)try: driver.get(PAGE_URL)
# 1. Click the checkbox (inside the first hCaptcha iframe) wait.until(EC.frame_to_be_available_and_switch_to_it( (By.CSS_SELECTOR, 'iframe[src*="hcaptcha"][src*="frame=checkbox"]'))) wait.until(EC.element_to_be_clickable((By.ID, "checkbox"))).click() driver.switch_to.default_content()
# 2. Solve rounds in the challenge iframe wait.until(EC.frame_to_be_available_and_switch_to_it( (By.CSS_SELECTOR, 'iframe[src*="hcaptcha"][src*="frame=challenge"]'))) for _ in range(5): question = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".prompt-text"))).text.strip() tiles = driver.find_elements(By.CSS_SELECTOR, ".task-image") images = [background_image_b64(t.find_element(By.CSS_SELECTOR, ".image")) for t in tiles] if not tiles or None in images: print("not a 3x3 image challenge; see the docs for click/drag questions") break solution = classify(question, images) for tile, hit in zip(tiles, solution.get("objects", [])): if hit: tile.click() time.sleep(0.3) driver.find_element(By.CSS_SELECTOR, ".button-submit").click() time.sleep(3) if not driver.find_elements(By.CSS_SELECTOR, ".task-image"): break
driver.switch_to.default_content() token = driver.find_element(By.NAME, "h-captcha-response").get_attribute("value") print("token received" if token else "not passed")finally: driver.quit()Catatan
Section titled “Catatan”- Struktur halaman hCaptcha sering berubah. Sesuaikan selector di kode jika sudah tidak berfungsi.
- Setiap putaran pengenalan dikenai pemotongan poin; putaran tanpa target yang terdeteksi tidak dipotong. Jika verifikasi gagal setelah klik, Anda bisa melaporkannya dalam 1 jam untuk meminta pengembalian poin setelah laporan.
- Jika soal baru mengembalikan
ERROR_UNKNOWN_QUESTION, muat ulang untuk mendapat soal lain, atau hubungi Dukungan.
© YesCaptcha