Selenium captcha solver ใน Python: ตัวอย่างที่ใช้งานได้ (2026)
Selenium รันเบราว์เซอร์จริง ดังนั้นหน้าเว็บจะเรนเดอร์และสคริปต์จะทำงานเหมือนที่ทำกับคน ขั้นตอนเดียวที่มันทำไม่ได้คือ solve PopularCaptcha widget คู่มือนี้เพิ่มขั้นตอนนั้น: อ่าน sitekey จากหน้าที่เรนเดอร์แล้ว รับ token ด้วยการเรียก API หนึ่งครั้ง ใส่ token ลงในฟอร์ม และส่งฟอร์ม
คู่มือนี้ครอบคลุม PopularCaptcha widget ซึ่ง Scarnox solve ได้ในวันนี้แบบ proxyless เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต และลองสคริปต์บนฟอร์มทดสอบก่อน
Selenium ต้องทำอะไรบ้าง
flow มีสี่ส่วน:
- โหลดหน้าและรอให้ widget เรนเดอร์
- อ่าน attribute
data-sitekeyจาก widget - รับ token จาก API และใส่ลงในฟอร์ม
- ส่งฟอร์มก่อนที่ token จะหมดอายุ
ส่วนที่สามเป็นส่วนเดียวที่แตะ captcha ส่วนที่เหลือคืองาน Selenium ปกติ
ติดตั้งแพ็กเกจ
pip install selenium requests
Selenium 4.6 ขึ้นไปจะหา ChromeDriver ที่เข้ากันได้ให้เอง คุณจึงไม่ต้องดาวน์โหลดไดรเวอร์ด้วยตนเอง
สคริปต์เต็ม
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.ui import WebDriverWait
API_KEY = "scarnox_YOURAPIKEY"
API_URL = "https://api.scarnox.com/api/tasks/create"
PAGE_URL = "https://example.com/signup"
def solve(sitekey: str, page_url: str, invisible: bool = False) -> str:
body = {
"captcha_type": "PopularCaptchaTaskProxyless",
"site_key": sitekey,
"site_url": page_url,
}
if invisible:
body["is_invisible"] = True
r = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json=body,
timeout=185, # รอจนกว่า token จะพร้อม
)
data = r.json()
if data.get("errorId") != 0:
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data["solution"]["token"]
INJECT_TOKEN_JS = """
const token = arguments[0];
let field = document.querySelector('[name="h-captcha-response"]');
if (!field) {
field = document.createElement("textarea");
field.name = "h-captcha-response";
field.style.display = "none";
document.querySelector("form").appendChild(field);
}
field.value = token;
let extra = document.querySelector('[name="g-recaptcha-response"]');
if (!extra) {
extra = document.createElement("textarea");
extra.name = "g-recaptcha-response";
extra.style.display = "none";
document.querySelector("form").appendChild(extra);
}
extra.value = token;
"""
def main() -> None:
driver = webdriver.Chrome()
try:
driver.get(PAGE_URL)
widget = WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "[data-sitekey]"))
)
sitekey = widget.get_attribute("data-sitekey")
invisible = widget.get_attribute("data-size") == "invisible"
token = solve(sitekey, driver.current_url, invisible=invisible)
# กรอกฟิลด์อื่นก่อน แล้วค่อยใส่ token ก่อนส่ง เพราะ token หมดอายุในประมาณสองนาที
driver.find_element(By.NAME, "email").send_keys("you@example.com")
driver.execute_script(INJECT_TOKEN_JS, token)
driver.find_element(By.CSS_SELECTOR, "form button[type=submit]").click()
WebDriverWait(driver, 15).until(EC.url_changes(PAGE_URL))
print("Submitted. Now at:", driver.current_url)
finally:
driver.quit()
if __name__ == "__main__":
main()
สำหรับการ solve PopularCaptcha แบบ proxyless ไม่จำเป็นต้องใช้ proxy ให้ตัดฟิลด์ proxy ออก และให้เว็บไซต์เห็นการเชื่อมต่อปกติของคุณ
ลำดับการทำงานคือส่วนที่ผิดพลาดบ่อยที่สุด กรอกส่วนที่เหลือของฟอร์มก่อน จากนั้น solve แล้วใส่ token และคลิก หากคุณ solve ก่อนพิมพ์ลงฟิลด์อื่น ฟอร์มที่ช้าอาจทำให้การส่งเกินอายุของ token ให้ช่วงเวลาระหว่างการ solve กับการคลิกสั้นที่สุดเท่าที่ทำได้ และตรวจหน้าผลลัพธ์หาข้อผิดพลาดก่อนสรุปว่า captcha ผ่านแล้ว
ทำไมต้องใส่ token ด้วย JavaScript
widget PopularCaptcha ส่วนใหญ่เขียน token ลงใน textarea ที่ซ่อนชื่อ h-captcha-response เมื่อมีคนแก้ เนื่องจาก Selenium ไม่มีคนอยู่เบื้องหลัง สคริปต์จึงเขียนฟิลด์เดียวกันด้วยตัวเอง snippet INJECT_TOKEN_JS ทำสองอย่าง:
- ใช้ textarea ซ้ำหาก widget สร้างไว้แล้ว
- สร้าง textarea หากหน้าไม่ได้สร้าง และต่อเข้ากับฟอร์ม
นอกจากนี้ยังกรอก g-recaptcha-response ด้วย เพราะเว็บไซต์จำนวนมากอ่านชื่อนี้เพื่อความเข้ากันได้
widget แบบ invisible
widget แบบ invisible ไม่มีช่องติ๊ก มันทำงานอยู่เบื้องหลังและมักเริ่มเมื่อส่งฟอร์ม สคริปต์ตรวจ data-size="invisible" และส่ง is_invisible: true เมื่อพบ เว็บไซต์บางแห่งยังผูก JavaScript callback กับ widget หากฟอร์มยังคงอยู่หลังจากใส่ token ให้มองหา attribute data-callback แล้วเรียกฟังก์ชันนั้นพร้อม token คู่มือ captcha แบบ invisible ครอบคลุมกรณีนี้
การใช้ในการทดสอบ
Selenium ยังเป็นเครื่องมือที่ใช้กันทั่วไปสำหรับ end-to-end test หาก staging ของคุณเองแสดง captcha โค้ดเดียวกันทำให้การทดสอบผ่านได้ ให้แยกสภาพแวดล้อมการทดสอบออกจาก production และอย่ารันกับเว็บไซต์ที่คุณไม่ได้เป็นเจ้าของ การตั้งค่าสำหรับ test suite อยู่ใน captcha ในการทดสอบอัตโนมัติ
ปัญหาที่พบบ่อย
- widget ไม่ปรากฏ เพิ่มเวลารอ หรือตรวจว่า widget อยู่ใน iframe หรือไม่ หากอยู่ ให้สลับเข้าเฟรมก่อนด้วย
driver.switch_to.frame(...) - ฟอร์มถูกส่งแต่เว็บไซต์ปฏิเสธ token ตรวจว่าคุณส่ง token ไปยังหน้าที่แสดง widget
driver.current_urlต้องตรงกับ URL จริงของหน้า รวมถึง query string ด้วย - token หมดอายุ ย้ายการเรียก
solveให้ใกล้ขั้นตอนการส่งมากขึ้น token มีอายุประมาณสองนาที - API timeout ใช้ timeout ประมาณ 185 วินาทีตามในสคริปต์ logic การ retry อยู่ใน การจัดการ error ของ captcha solver
ราคา
คุณจ่ายต่อการ solve ที่สำเร็จ การ solve ที่ล้มเหลวไม่ถูกเรียกเก็บเงิน ดู ราคาปัจจุบัน สำหรับอัตราต่าง ๆ และ เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต