วิธี solve PopularCaptcha ด้วย Python (ตัวอย่างที่ใช้งานได้ 2026)
หากสคริปต์ Python ของคุณเจอ PopularCaptcha คุณไม่จำเป็นต้องมีฟาร์มเบราว์เซอร์หรือโมเดลของตัวเอง คุณต้องการ sitekey ของหน้า POST request หนึ่งครั้ง และ token ที่ได้กลับมา
คู่มือนี้จะพาคุณจากศูนย์ไปยัง token ที่ใช้งานได้ในราวห้านาที: รับ API key หา sitekey ขอ token ส่งไปยังฟอร์ม และจัดการกรณีความล้มเหลวที่เกิดขึ้นเมื่อสคริปต์ทำงานโดยไม่มีคนดู การ solve ที่ล้มเหลวไม่มีค่าใช้จ่าย ดังนั้น retry จึงเสียแค่เวลา
Scarnox solve PopularCaptcha ได้ในวันนี้ ทั้งแบบ proxyless หรือใช้ proxy ของคุณเอง captcha ประเภทอื่นอย่าง reCAPTCHA, Cloudflare Turnstile และ AWS WAF กำลังจะมาเร็ว ๆ นี้ ดังนั้นทุกตัวอย่างในที่นี้จึงใช้ PopularCaptcha ภาพรวมประเภทของ captcha อธิบายว่าแต่ละประเภทต่างกันอย่างไร
1. รับ API key
สร้างบัญชี และเริ่มด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต API key ของคุณอยู่ในแดชบอร์ด เก็บไว้นอกซอร์สโค้ด และอ่านจากตัวแปรสภาพแวดล้อมแทน:
export SCARNOX_KEY="scarnox_YOURAPIKEY"
2. หา sitekey
เปิดหน้าที่มี captcha เปิด DevTools และค้นหา data-sitekey ในแผง Elements sitekey ของ PopularCaptcha เป็น UUID:
<div class="h-captcha" data-sitekey="10000000-ffff-ffff-ffff-000000000001"></div>
ไม่พบ data-sitekey ใน HTML หรือไม่ widget อาจถูกเรนเดอร์ด้วย JavaScript ให้ตรวจแท็บ Network หา request ที่ดึงการตั้งค่าของ widget พารามิเตอร์ query sitekey คือค่าที่คุณต้องการ วิธีหาอื่น ๆ ครอบคลุม URL ของ iframe และ widget แบบ invisible
ส่ง URL ของหน้าที่แสดง widget เป็น site_url โฮสต์มีความสำคัญที่สุด แต่ URL เต็มของหน้าเป็นตัวเลือกที่ปลอดภัยที่สุด
3. ขอ token
import os
import requests
API_URL = "https://api.scarnox.com/api/tasks/create"
API_KEY = os.environ["SCARNOX_KEY"]
def solve_captcha(sitekey: str, page_url: str) -> str:
r = requests.post(
API_URL,
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"captcha_type": "PopularCaptchaTaskProxyless",
"site_key": sitekey,
"site_url": page_url,
},
timeout=185, # การเรียกบล็อกรอจนกว่า token จะพร้อม
)
data = r.json()
if data.get("errorId") != 0:
raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
return data["solution"]["token"]
if __name__ == "__main__":
token = solve_captcha("10000000-ffff-ffff-ffff-000000000001", "https://example.com/signup")
print(token[:40], "...")
นั่นคือการเชื่อมต่อทั้งหมด ไม่มี polling loop และไม่มีการเรียก "get result" ครั้งที่สอง request คืนค่าเมื่อ token พร้อม ดังนั้นการตั้งค่าเดียวที่สำคัญคือ timeout ที่นานพอสำหรับการ solve ที่ช้า ให้ใช้ประมาณ 185 วินาที
การตอบกลับที่สำเร็จมี errorId เป็น 0 และ token อยู่ภายใต้ solution.token errorId ใดที่ไม่ใช่ค่านี้หมายความว่าการ solve ล้มเหลว และการตอบกลับจะมี errorCode กับ errorDescription ที่บอกสาเหตุ
4. ส่ง token
token ถูกส่งไปยังที่ที่เว็บไซต์คาดหวังการตอบสนองของ captcha สำหรับ PopularCaptcha มักเป็นฟิลด์ฟอร์มชื่อ h-captcha-response เว็บไซต์จำนวนมากยังรับ g-recaptcha-response ด้วย ดังนั้นให้ส่งทั้งสองอย่าง:
import requests
def sign_up(session: requests.Session, form_url: str, email: str, sitekey: str) -> requests.Response:
token = solve_captcha(sitekey, form_url)
return session.post(form_url, data={
"email": email,
"h-captcha-response": token,
"g-recaptcha-response": token,
}, timeout=30)
มีสองรายละเอียดที่สำคัญ เว็บไซต์จริงมักตรวจ cookie ของ session จากการโหลดหน้าด้วย ดังนั้นให้โหลดฟอร์มด้วย requests.Session เดียวกันก่อนโพสต์ และโพสต์ไปยัง action ของฟอร์ม ซึ่งไม่ได้เป็น URL ของหน้าเสมอไป
solve ทันทีก่อนส่ง token หมดอายุภายในประมาณสองนาที ดังนั้นอย่าดึงมาตั้งแต่ต้นงานยาวแล้วถือไว้ หากเว็บไซต์ปฏิเสธ token ให้เปิดฟอร์มใน DevTools และยืนยันชื่อฟิลด์ที่ซ่อนอยู่
5. จัดการความล้มเหลว
การ solve ที่ล้มเหลวไม่มีค่าใช้จ่าย ดังนั้น retry เสียแค่เวลาและไม่มีอย่างอื่น แต่ error บางอย่างจะไม่สำเร็จเมื่อ retry ดังนั้นอย่า loop แบบไม่คิด ตรวจ errorId ทุกครั้ง บันทึก errorCode และ errorDescription และ retry เฉพาะความล้มเหลวชั่วคราว
error ของเครือข่ายต้องจัดการแยกต่างหาก เพราะ requests จะ raise ก่อนที่จะมี response:
import requests
try:
token = solve_captcha(sitekey, page_url)
except requests.RequestException as exc:
print("network problem, retry later:", exc)
except RuntimeError as exc:
print("solve rejected:", exc)
คู่มือการจัดการ error มีนโยบาย retry ที่สมบูรณ์พร้อม backoff และ jitter
ข้อผิดพลาดที่พบบ่อย
- **
site_urlผิด** ส่งหน้าที่แสดง widget ไม่ใช่หน้าแรก - token เก่า token ที่ใช้หลังประมาณสองนาทีจะถูกปฏิเสธ ให้ solve ทันทีก่อนส่ง
- session หาย การโพสต์โดยไม่มี cookie ของหน้า อาจล้มเหลวแม้ token จะถูกต้อง
- **บางเว็บไซต์ต้องการ
rqdata** หากหน้าให้ค่าrqdataสำหรับ widget ให้ส่งในฟิลด์rqdataที่เป็นตัวเลือกของ request - widget แบบ invisible หากไม่มีช่องติ๊กและเว็บไซต์เริ่ม widget จากโค้ดของตัวเอง ให้เพิ่ม
"is_invisible": trueลงใน request คู่มือ captcha แบบ invisible แสดงวิธีส่ง token กลับ
ทดลองใช้ฟรี
สร้างบัญชี และเริ่มด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต รันตัวอย่างข้างบนกับฟอร์มที่คุณเป็นเจ้าของก่อนเชื่อมต่อกับงานที่ใหญ่กว่า สำหรับค่าใช้จ่ายเมื่อใช้งานปริมาณมาก ดู ราคาปัจจุบัน
บันทึกการ solve แต่ละครั้ง
บันทึกหนึ่งบรรทัดต่อการ solve หนึ่งครั้ง: sitekey โฮสต์ของหน้า errorId errorCode เมื่อล้มเหลว และเวลาที่การเรียกใช้ไป ไม่ต้องบันทึก API key หรือรหัสผ่านของ proxy บรรทัดเหล่านี้บอกคุณว่าการรันที่ช้าช้าเพราะหน้า proxy หรือ solver และเป็นสิ่งแรกที่คุณต้องใช้หากเปิดคำขอสนับสนุน
การ solve ในลูป
หากสคริปต์ของคุณ solve captcha หลายครั้งติดกัน ให้ลูปเรียบง่าย: solve ส่ง ตรวจผลลัพธ์ แล้วค่อยไปต่อ อย่า solve ล่วงหน้าแล้วพักคิวของ token เพราะแต่ละอันหมดอายุภายในประมาณสองนาที การหน่วงเวลาสั้น ๆ ระหว่างการ solve บนเว็บไซต์เดียวกันช่วยให้อัตรา request ของคุณใกล้เคียงกับที่คนจะทำ