Solving invisible PopularCaptcha: ต่างกันอย่างไรและต้องส่งอะไร
Invisible PopularCaptcha ดูเหมือนไม่มี captcha เลย ไม่มีกล่อง "I am human" เว็บไซต์เรียก PopularCaptcha จาก JavaScript ของตัวเอง มักเกิดขึ้นตอนที่ผู้เข้าชมกดส่งฟอร์ม และแสดงความท้าทายก็ต่อเมื่อไม่แน่ใจเกี่ยวกับผู้เข้าชม สำหรับสคริปต์ automation widget นี้หาได้ยากกว่า แต่การ solve ก็ยังเป็น request เดียว
Scarnox solve PopularCaptcha ได้ในปัจจุบัน รวมถึงรูปแบบ invisible คุณตั้งค่า flag เดียวคือ is_invisible แล้วส่ง request เดียวกับที่คุณจะส่งสำหรับ widget ที่มองเห็นได้ captcha ประเภทอื่นกำลังจะมาเร็ว ๆ นี้
วิธีสังเกตว่าเป็น invisible
- widget มี
data-size="invisible" - เว็บไซต์เรียกฟังก์ชัน
execute()ของ widget จากโค้ดของตัวเอง - มี sitekey อยู่ในหน้า แต่ไม่มีช่องติ๊กให้เห็นที่ใดเลย
การตั้งค่าบน sitekey เป็นตัวตัดสิน ไม่ใช่หน้าตาของหน้าเว็บ ถ้าไม่แน่ใจ ให้ หา sitekey และตรวจตัวเลือกของ widget ในโค้ด JavaScript ของหน้า
สิ่งที่ต้องส่ง
ใช้ endpoint เดิมและประเภท task เดิม และเพิ่ม is_invisible ที่ตั้งเป็น true:
{
"captcha_type": "PopularCaptchaTaskProxyless",
"site_key": "10000000-ffff-ffff-ffff-000000000001",
"site_url": "https://example.com/login",
"is_invisible": true
}
ส่งพร้อมกับ API key ของคุณในหัว Authorization: Bearer เหมือนตัวอย่างอื่นทั้งหมด การเรียกจะรอจนกว่า token พร้อม ไม่ต้อง polling ตั้ง timeout ประมาณ 185 วินาที
ส่ง token กลับไป
การเชื่อมต่อแบบ invisible เกือบทุกกรณีใช้ callback แทนฟิลด์ฟอร์ม เว็บไซต์ส่งชื่อฟังก์ชันให้ widget ผ่าน attribute data-callback หรือผ่านตัวเลือกใน render() ให้เรียกฟังก์ชันนั้นพร้อม token แล้วโค้ดของเว็บไซต์จะทำงานต่อราวกับว่าผู้เข้าชมผ่านความท้าทายแล้ว
await page.evaluate((t) => {
document.querySelectorAll('[name="h-captcha-response"]').forEach((el) => { el.value = t; });
const cb = document.querySelector("[data-sitekey]")?.dataset.callback;
if (cb && typeof window[cb] === "function") window[cb](t);
}, token);
การตั้งค่าฟิลด์ที่ซ่อนไว้ด้วยไม่เป็นอันตราย และครอบคลุมเว็บไซต์ที่อ่านฟิลด์นั้นตอนส่งฟอร์ม
เวลาสำคัญกว่าปกติ
ใน widget แบบ invisible เว็บไซต์เป็นผู้กำหนดเวลาที่ความท้าทายทำงาน ซึ่งมักเป็นจังหวะที่ผู้เข้าชมกดส่ง ดังนั้นให้ solve ในจังหวะนั้น ไม่ใช่ก่อนหน้า รูปแบบที่ง่ายที่สุดคือเริ่ม solve ก่อนที่สคริปต์จะกดปุ่ม จากนั้นเรียก callback แล้วส่งฟอร์ม
token หมดอายุภายในประมาณสองนาที token ที่ดึงระหว่างโหลดหน้าและนำไปใช้หนึ่งนาทีต่อมามีแนวโน้มจะถูกปฏิเสธ
ความผิดพลาดที่พบบ่อย
การส่ง invisible sitekey เป็น task แบบ visible ปกติอาจได้ token ที่เว็บไซต์ปฏิเสธ หาก API ส่ง token กลับมาแต่เว็บไซต์ปฏิเสธ ให้ตรวจตามลำดับนี้:
is_invisibleตั้งเป็นtrueแล้วหรือยัง- เว็บไซต์เรียก callback หรือไม่ และทำก่อนที่ฟอร์มจะส่งหรือไม่
site_urlเป็นหน้าที่ invisible widget ทำงานอยู่หรือไม่- ถ้าเว็บไซต์ยังปฏิเสธ token ปัญหาอาจผูกกับ IP ที่ใช้ solve ให้เปรียบเทียบกับ การ solve แบบมี proxy กับ proxyless
ทดสอบ flow แบบ invisible อย่างปลอดภัย
widget แบบ invisible ทดสอบด้วยมือได้ยาก เพราะความท้าทายทำงานเฉพาะตอนส่งและส่วนใหญ่ผ่านไปโดยไม่แสดงอะไร ให้ทดสอบตามลำดับนี้:
- ยืนยันว่าการ solve คืน token เมื่อ
is_invisibleเป็นtrueโดยใช้ smoke test จากคู่มือเครดิตทดลองใช้ฟรี - เรียก callback ของเว็บไซต์ด้วยตัวเองใน console ของเบราว์เซอร์พร้อม token นั้น แล้วดูว่าฟอร์มดำเนินต่อหรือไม่
- ส่งฟอร์มจากสคริปต์ของคุณ แล้วตรวจหน้าที่ตามมา
- ทำซ้ำจากเครือข่ายที่สอง หากทำได้ เพื่อยืนยันว่า token ไม่ได้ผูกกับ IP ที่ใช้ solve
ทดสอบบนฟอร์มที่คุณเป็นเจ้าของ หรือสำเนา staging ของเว็บไซต์ที่คุณได้รับอนุญาตให้ทดสอบ อย่ารัน flow แบบ invisible กับบัญชีจริงที่คุณไม่ได้ควบคุม
ลำดับเหตุการณ์ในการส่งแบบ invisible หนึ่งครั้ง
การเชื่อมต่อที่ทำงานได้ดำเนินตามลำดับนี้:
- ผู้เข้าชม หรือสคริปต์ของคุณ กรอกฟอร์ม
- สคริปต์อ่าน sitekey และ URL ของหน้าจากหน้าเว็บ
- สคริปต์เรียก solve endpoint พร้อม
is_invisibleเป็นtrueแล้วรอ token - สคริปต์เขียน token ลงในฟิลด์ตอบกลับ แล้วเรียก callback ของเว็บไซต์
- โค้ดของเว็บไซต์ส่งฟอร์มพร้อม token
ถ้าขั้นตอนที่ 3 เกิดขึ้นเร็วกว่าขั้นตอนที่ 5 มาก token อาจหมดอายุก่อนที่ฟอร์มจะถูกส่ง ให้ช่วงเวลาระหว่างสองขั้นตอนสั้นที่สุดเท่าที่ทำได้
เมื่อเว็บไซต์ปฏิเสธ invisible token
การถูกปฏิเสธไม่ได้หมายความเสมอว่า token มีปัญหา ตรวจสิ่งเหล่านี้ก่อนเปลี่ยน request ของการ solve:
- callback ทำงานก่อนที่ฟอร์มจะส่ง ไม่ใช่หลังจากนั้น
- ฟอร์มอ่าน token จากฟิลด์ที่สคริปต์ของคุณเขียนลงไป บางเว็บไซต์ใช้ฟิลด์อื่นสำหรับ invisible widget
- request ที่ส่ง token มาจาก session เดียวกับที่โหลดหน้า cookie จาก session อื่นไม่ตรงกัน
- หน้าไม่ได้รีโหลดระหว่างการ solve กับการส่ง เพราะจะทำให้ token หายไป
หลังจากตรวจเหล่านี้แล้วค่อยมาดูเรื่อง proxy การถูกปฏิเสธส่วนใหญ่มาจาก callback หรือ session ไม่ใช่จาก IP
ขั้นตอนถัดไป
- วิธีแก้ PopularCaptcha ด้วย Python
- การแก้ PopularCaptcha ด้วย Playwright และ Puppeteer
- Retry และการจัดการ error ที่ใช้ได้จริงในโปรดักชัน
- ทดลองใช้ captcha solver ฟรี
เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต: สร้างบัญชี แล้วทดสอบ invisible sitekey บนหน้าที่คุณเป็นเจ้าของ