คู่มือ
การคลิกภาพ reCAPTCHA v2 ด้วย Selenium
หน้านี้แปลด้วยเครื่องจากเวอร์ชันภาษาจีน อาจมีข้อผิดพลาด โปรดยึดเวอร์ชันภาษาจีนเป็นหลัก
บทช่วยสอนนี้ใช้ Selenium 4 เปิดหน้าเดโมของ reCAPTCHA จาก Google แล้วทำโจทย์ภาพให้เสร็จในเบราว์เซอร์จริง โดยอ่านคำถามและภาพ ส่งให้ reCAPTCHA v2 การจดจำภาพ (ReCaptchaV2Classification) ตัดสินว่าควรคลิกช่องใดบ้าง แล้วจำลองการคลิก เมื่อเทียบกับวิธีขอ token วิธีนี้ผ่านการตรวจสอบในเบราว์เซอร์จริง เหมาะกับเว็บไซต์ที่ token ผ่านได้ยาก
หากไม่ต้องการเขียนโค้ด สามารถใช้ ส่วนขยายเบราว์เซอร์ ได้เลย เพราะทำงานด้วยการคลิกอัตโนมัติผ่าน API เดียวกัน
การเตรียมตัว
หัวข้อที่มีชื่อว่า “การเตรียมตัว”pip install requests selenium pillowexport YESCAPTCHA_CLIENT_KEY=your_client_keyต้องติดตั้ง Chrome โดย Selenium 4 จะดาวน์โหลด chromedriver ที่ตรงกันให้อัตโนมัติ
ขั้นตอน
หัวข้อที่มีชื่อว่า “ขั้นตอน”- คลิกช่องกาเครื่องหมาย ช่องนี้อยู่ใน iframe ที่มี
title="reCAPTCHA"ให้สลับเข้าไปก่อน แล้วคลิก#recaptcha-anchor - สลับไปยัง iframe ของโจทย์ โจทย์อยู่ใน iframe อีกตัวที่ title มีคำว่า “challenge”
- อ่านคำถาม ข้อความตัวหนาใน
.rc-imageselect-desc-wrapper strongคือสิ่งที่ต้องหา เช่น “traffic lights” API ต้องใช้ ID ของคำถาม จึงต้องแปลงชื่อเป็น ID (/m/015qff) ด้วยตารางเทียบ ดู ID ของคำถาม หน้าจอเบราว์เซอร์ภาษาอังกฤษจะเทียบได้สะดวกที่สุด - ดึงภาพ ภาพในแต่ละช่องจริง ๆ แล้วเป็นภาพใหญ่ภาพเดียวกัน ให้ดาวน์โหลดจาก
srcของtd.rc-imageselect-tile imgสำหรับ 9 ช่อง (3x3) ปรับขนาดเป็น 300×300 และสำหรับ 16 ช่อง (4x4) ปรับเป็น 450×450 แล้วแปลงเป็น Base64 - จดจำภาพ เรียก
createTaskด้วยประเภทงานReCaptchaV2Classificationและส่งimageกับquestionเพิ่ม"confidence": 0.5แล้วภาพ 3x3 จะคืนทุกช่องที่ตรงเงื่อนไขในครั้งเดียว ไม่ต้องจัดการกับภาพเล็กที่โหลดใหม่หลังคลิก - คลิก
objectsที่คืนมาคือลำดับของช่อง เริ่มจาก 0 เรียงจากซ้ายไปขวาและบนลงล่าง ให้คลิกtdที่ตรงกันตามลำดับ - ยืนยัน คลิก
#recaptcha-verify-buttonหากมีโจทย์รอบใหม่ขึ้นมาอีก ให้กลับไปขั้นตอนที่ 3 เมื่อหน้าต่างโจทย์ปิดไปแสดงว่าผ่านแล้ว - ส่งฟอร์ม กลับมาที่หน้าหลักแล้วคลิกปุ่มส่ง
โค้ดฉบับสมบูรณ์
หัวข้อที่มีชื่อว่า “โค้ดฉบับสมบูรณ์”"""Click through a reCAPTCHA v2 image challenge with Selenium 4 and ReCaptchaV2Classification.
Flow: open the page -> click the checkbox -> read the target name and the grid image ->ask YesCaptcha which tiles to click -> click them -> press Verify. Repeat if a new challenge appears.
Run: pip install requests selenium pillow export YESCAPTCHA_CLIENT_KEY=your_client_key python recaptcha_click_selenium.pyEach recognized image is charged (see the price list). reCAPTCHA's page structure can change;adjust the selectors below if a step stops working."""import base64import ioimport osimport time
import requestsfrom PIL import Imagefrom 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://www.google.com/recaptcha/api2/demo"
# Target names shown in the challenge (English UI) -> question IDs.# Full list: https://docs.yescaptcha.com/en/tasks/recaptcha-classification/QUESTION_IDS = { "taxis": "/m/0pg52", "bus": "/m/01bjv", "buses": "/m/01bjv", "motorcycles": "/m/04_sv", "tractors": "/m/013xlm", "chimneys": "/m/01jk_4", "crosswalks": "/m/014xcs", "traffic lights": "/m/015qff", "bicycles": "/m/0199g", "parking meters": "/m/015qbp", "cars": "/m/0k4j", "bridges": "/m/015kr", "boats": "/m/019jd", "palm trees": "/m/0cdl1", "mountains or hills": "/m/09d_r", "fire hydrants": "/m/01pns0", "a fire hydrant": "/m/01pns0", "stairs": "/m/01lynh",}
def classify(image_b64, question): task = {"type": "ReCaptchaV2Classification", "image": image_b64, "question": question, "confidence": 0.5} data = requests.post( "https://api.yescaptcha.com/createTask", json={"clientKey": CLIENT_KEY, "task": task}, timeout=30, ).json() if data.get("errorId"): raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}") return data["solution"] # synchronous: the solution comes back right away
def grid_image_b64(url, size): """Download the challenge image and scale it to the standard size (300 for 3x3, 450 for 4x4).""" img = Image.open(io.BytesIO(requests.get(url, timeout=30).content)).convert("RGB") img = img.resize((size, size)) buf = io.BytesIO() img.save(buf, format="JPEG") return base64.b64encode(buf.getvalue()).decode()
driver = webdriver.Chrome()wait = WebDriverWait(driver, 15)try: driver.get(PAGE_URL)
# 1. Click the checkbox (inside the "reCAPTCHA" iframe) wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, 'iframe[title="reCAPTCHA"]'))) wait.until(EC.element_to_be_clickable((By.ID, "recaptcha-anchor"))).click() driver.switch_to.default_content()
# 2. Switch to the challenge iframe and solve rounds until it closes wait.until(EC.frame_to_be_available_and_switch_to_it( (By.XPATH, '//iframe[contains(@title, "challenge")]'))) for _ in range(5): target = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, ".rc-imageselect-desc-wrapper strong"))).text.strip().lower() question = QUESTION_IDS.get(target) if not question: print("unsupported target, reloading:", target) driver.find_element(By.ID, "recaptcha-reload-button").click() time.sleep(2) continue tiles = driver.find_elements(By.CSS_SELECTOR, "td.rc-imageselect-tile") size = 450 if len(tiles) == 16 else 300 url = driver.find_element(By.CSS_SELECTOR, "td.rc-imageselect-tile img").get_attribute("src") solution = classify(grid_image_b64(url, size), question) for index in solution.get("objects", []): tiles[index].click() time.sleep(0.3) time.sleep(1) driver.find_element(By.ID, "recaptcha-verify-button").click() time.sleep(3) driver.switch_to.default_content() frame = driver.find_element(By.XPATH, '//iframe[contains(@title, "challenge")]') if not frame.is_displayed(): # challenge closed: passed break driver.switch_to.frame(frame)
driver.switch_to.default_content() driver.find_element(By.ID, "recaptcha-demo-submit").click() time.sleep(2) print("passed" if "Verification Success" in driver.page_source else "not passed")finally: driver.quit()หมายเหตุ
หัวข้อที่มีชื่อว่า “หมายเหตุ”- โครงสร้างหน้าเว็บของ reCAPTCHA มีการอัปเดตอยู่เสมอ หาก selector ในโค้ดใช้ไม่ได้ ให้ปรับตามหน้าเว็บจริง
- การจดจำภาพทุกครั้งจะหักพอยต์ (ดูราคาได้ที่ reCAPTCHA v2 การจดจำภาพ) งานที่คลิกแล้วยืนยันไม่ผ่านสามารถ รายงาน ภายใน 1 ชั่วโมงเพื่อขอคืนพอยต์หลังรายงานได้
- หากพบคำถามที่ไม่มีในตารางเทียบ ให้คลิกปุ่มรีเฟรชเพื่อเปลี่ยนโจทย์ หรือติดต่อฝ่ายสนับสนุนเพื่อขอให้เพิ่มการรองรับ
© YesCaptcha