Lewati ke konten
StatusDasbor

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.

pip install requests selenium
export YESCAPTCHA_CLIENT_KEY=your_client_key
  1. Klik kotak centang. Kotak centang berada di iframe hCaptcha yang alamatnya memuat frame=checkbox. Pindah ke iframe tersebut, lalu klik #checkbox.
  2. Pindah ke iframe tantangan. Tantangan berada di iframe yang alamatnya memuat frame=challenge.
  3. Baca pertanyaan. Teks di .prompt-text adalah 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 ke anchors.
  4. Ambil gambar. Latar belakang .task-image .image di setiap kotak adalah satu gambar kecil. Unduh berurutan, ubah ke Base64, lalu susun menjadi daftar queries.
  5. Kenali. Panggil createTask dengan jenis HCaptchaClassification. objects pada hasil sesuai satu-satu dengan kotak; true berarti target.
  6. Klik dan kirim. Klik kotak yang merupakan target, lalu tekan tombol kirim. Bisa muncul beberapa putaran berturut-turut; ulangi langkah 3 sampai 6.
  7. Selesai. Setelah lolos, kolom h-captcha-response di halaman berisi token; kirim bersama formulir.
hcaptcha_click_selenium.py
"""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.py
Each 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 base64
import os
import re
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from 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()
  • 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.