ข้ามไปยังเนื้อหา
สถานะแดชบอร์ด

คู่มือ

ค้นหาพารามิเตอร์ของ reCAPTCHA

หน้านี้แปลด้วยเครื่องจากเวอร์ชันภาษาจีน อาจมีข้อผิดพลาด โปรดยึดเวอร์ชันภาษาจีนเป็นหลัก

การสร้างงาน reCAPTCHA ต้องใช้ websiteURL (ที่อยู่ของหน้าเว็บที่มี CAPTCHA) และ websiteKey (คีย์ของเว็บไซต์) ส่วน v3 ต้องใช้ pageAction ด้วย หากจำลองการส่งข้อมูลด้วยเครื่องมืออย่าง Selenium คุณต้องทราบฟังก์ชัน callback ด้วย ทั้งหมดนี้หาได้จากเครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์ (F12)

เปิดหน้าเว็บที่มี CAPTCHA แล้วกด F12 เพื่อเปิดแผง Console จากนั้นวางและรันสคริปต์นี้:

find-recaptcha-clients.js
// 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 ปรากฏแล้ว

ในแผง 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 คือ 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 ถัดไป

เมื่อใช้เครื่องมืออย่าง 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