คู่มือ
ค้นหาพารามิเตอร์ของ reCAPTCHA
หน้านี้แปลด้วยเครื่องจากเวอร์ชันภาษาจีน อาจมีข้อผิดพลาด โปรดยึดเวอร์ชันภาษาจีนเป็นหลัก
การสร้างงาน reCAPTCHA ต้องใช้ websiteURL (ที่อยู่ของหน้าเว็บที่มี CAPTCHA) และ websiteKey (คีย์ของเว็บไซต์) ส่วน v3 ต้องใช้ pageAction ด้วย หากจำลองการส่งข้อมูลด้วยเครื่องมืออย่าง Selenium คุณต้องทราบฟังก์ชัน callback ด้วย ทั้งหมดนี้หาได้จากเครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์ (F12)
วิธีที่เร็วที่สุด: สคริปต์ค้นหาอัตโนมัติ
หัวข้อที่มีชื่อว่า “วิธีที่เร็วที่สุด: สคริปต์ค้นหาอัตโนมัติ”เปิดหน้าเว็บที่มี CAPTCHA แล้วกด F12 เพื่อเปิดแผง Console จากนั้นวางและรันสคริปต์นี้:
// Paste into the browser DevTools console on a page with reCAPTCHA, then run findRecaptchaClients().// Lists every reCAPTCHA on the page: version (V2/V3), sitekey, page URL and the callback function.function findRecaptchaClients() { if (typeof ___grecaptcha_cfg === 'undefined') return []; return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => { const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' }; const objects = Object.entries(client).filter(([, value]) => value && typeof value === 'object'); objects.forEach(([toplevelKey, toplevel]) => { const found = Object.entries(toplevel).find( ([, value]) => value && typeof value === 'object' && 'sitekey' in value && 'size' in value, ); if (toplevel instanceof HTMLElement && toplevel.tagName === 'DIV') data.pageurl = toplevel.baseURI; if (found) { const [sublevelKey, sublevel] = found; data.sitekey = sublevel.sitekey; const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback'; const callback = sublevel[callbackKey]; if (!callback) { data.callback = null; data.function = null; } else { data.function = callback; const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join(''); data.callback = `___grecaptcha_cfg.clients${keys}`; } } }); return data; });}
findRecaptchaClients();ในผลลัพธ์ sitekey คือ websiteKey, pageurl คือ websiteURL, version บอกว่าเป็น v2 หรือ v3 ส่วน function และ callback คือฟังก์ชัน callback:
[ { "id": "0", "version": "V2", "sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-", "function": "onSuccess", "callback": "___grecaptcha_cfg.clients['0']['l']['l']['callback']", "pageurl": "https://www.google.com/recaptcha/api2/demo" }]หากได้อาร์เรย์ว่าง แสดงว่าหน้าเว็บยังไม่ได้โหลด reCAPTCHA ให้รันอีกครั้งหลังจาก CAPTCHA ปรากฏแล้ว
websiteKey และ websiteURL
หัวข้อที่มีชื่อว่า “websiteKey และ websiteURL”ในแผง Network ให้ค้นหา anchor แล้วหาคำขอที่มีลักษณะดังนี้:
https://www.google.com/recaptcha/api2/anchor?ar=1&k=6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9&co=...&hl=en&size=normal- ค่าที่อยู่หลัง
k=คือwebsiteKey websiteURLให้ใส่ที่อยู่เต็มของหน้าเว็บที่มี CAPTCHA (โดยทั่วไปคือRefererของคำขอนี้)
นอกจากนี้ยังค้นหา data-sitekey ในซอร์สโค้ดของหน้าเว็บได้
pageAction (v3)
หัวข้อที่มีชื่อว่า “pageAction (v3)”pageAction คือ action ที่หน้าเว็บส่งเมื่อเรียก grecaptcha.execute(คีย์ของเว็บไซต์, {action: '...'}) และต้องตรงกับของหน้าเว็บ
วิธีที่ 1: ค้นหาในซอร์สโค้ด ในแผง Sources ของเครื่องมือสำหรับนักพัฒนา คลิกขวาแล้วเลือก “Search in all files” สำหรับ v3 ทั่วไปให้ค้นหา .execute( ส่วน v3 เวอร์ชัน Enterprise ให้ค้นหา .enterprise.execute แล้วดู action ที่ตามมา:
grecaptcha.ready(function () { grecaptcha.execute('6LdpS-gUAAAAAL3Qr2yP7rkrQjkKBVvEY_48JS5l', { action: 'login' }).then(function (token) { // ... });});ในตัวอย่างนี้ pageAction คือ login
วิธีที่ 2: breakpoint เมื่อโค้ดถูก obfuscate จนค้นหาไม่เจอ ให้รัน debug(grecaptcha.execute) ใน Console (เวอร์ชัน Enterprise ใช้ debug(grecaptcha.enterprise.execute)) แล้วทำสิ่งที่ทำให้เกิดการตรวจสอบบนหน้าเว็บ เช่น คลิกเข้าสู่ระบบ เมื่อโปรแกรมดีบักหยุดทำงาน ให้ดูค่าของ action ในส่วน Scope ทางด้านขวา
เว็บไซต์อาจใช้ action ต่างกันในแต่ละขั้นตอน (เช่น ตอนสมัครสมาชิกใช้ signup/submit_email ก่อน แล้วจึงใช้ signup/success) ให้ใช้ค่าของขั้นตอนที่คุณต้องการผ่าน กด F8 เพื่อทำงานต่อ จะเห็น action ถัดไป
ฟังก์ชัน callback
หัวข้อที่มีชื่อว่า “ฟังก์ชัน callback”เมื่อใช้เครื่องมืออย่าง Selenium ใส่ token ในเบราว์เซอร์ หลังใส่เสร็จต้องเรียกฟังก์ชัน callback ของหน้าเว็บ เพื่อแจ้งให้หน้าเว็บทราบว่าการตรวจสอบเสร็จสิ้นแล้ว:
- ค้นหา
data-callbackในแผง Elements ค่าของมันคือชื่อฟังก์ชัน callback เช่นdata-callback="onSuccess" - หรือค้นหา
grecaptcha.renderแล้วดูcallbackในพารามิเตอร์ - หรือดู
___grecaptcha_cfg.clientsใน Console หรือใช้สคริปต์ค้นหาอัตโนมัติข้างต้น
วิธีเรียก:
driver.execute_script("onSuccess(arguments[0])", g_recaptcha_response)บางหน้าเว็บไม่มีฟังก์ชัน callback ให้ใส่ token ลงในกล่องข้อความ g-recaptcha-response แล้วส่งฟอร์มได้เลย ดูขั้นตอนทั้งหมดที่ ใช้ token ผ่าน reCAPTCHA