
Anh Tuan
Data Science Expert

⚠️ Mỗi trang web đều khác nhau, nếu không có phương pháp nào sau đây giải quyết được vấn đề.
Vui lòng tự nghiên cứu thêm.
Sau khi lấy được giá trị gRecaptchaResponse đã được nhận dạng thành công thông qua API, nếu bạn đang sử dụng phần mềm mô phỏng, chẳng hạn như selenium, bạn cần thực thi một hàm hồi gọi để thông báo cho trang web rằng chúng ta đã nhận dạng thành công, vì vậy hãy cùng tìm hiểu cách tìm hàm này:
Lưu ý: Trong một số trường hợp, thực sự không có hàm hồi gọi. Trong trường hợp này, bạn có thể trực tiếp gán giá trị cho vùng chứa g-recaptcha-response và gửi biểu mẫu.
Mở trang được hiển thị, nhấn F12 để vào bảng điều khiển, nhấn Ctrl+F trong Elements để tìm kiếm, từ khóa tìm kiếm: data-callback
Như bạn thấy, hàm hồi gọi của chúng ta ở đây là onSuccess, và sau đó chúng ta chỉ cần thực thi hàm này trong selenium
Nếu bạn không tìm thấy nó, nó có thể bị nhầm lẫn hoặc các trường hợp khác, bạn có thể thử các phương pháp khác
driver.execute_script(f'onSuccess("{gRecaptchaResponse}")')

Tương tự như phương pháp 1, tìm kiếm từ khóa: grecaptcha.render
Tìm mã tương tự, trong đó callback là hàm hồi gọi
grecaptcha.render('example', {
'sitekey': 'someSitekey',
'callback': myCallbackFunction,
'theme': 'dark'
});
Nhấn F12 để vào bảng điều khiển, nhập ___grecaptcha_cfg.clients, nếu báo lỗi, trang web chưa tải reCaptcha
Thông thường có nhiều nút, chúng ta cần chú ý đến sự khác biệt, ở đây onSuccess là hàm hồi gọi chúng ta đang tìm kiếm

Nếu khó thực hiện các phương pháp trên, bạn có thể thử tìm bằng cách định nghĩa một hàm tìm kiếm tự động
Nhấn F12 để vào bảng điều khiển và nhập hàm tự định nghĩa sau findRecaptchaClients()
function findRecaptchaClients() {
// eslint-disable-next-line camelcase
if (typeof (___grecaptcha_cfg) !== 'undefined') {
// eslint-disable-next-line camelcase, no-undef
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 (typeof toplevel === 'object' && 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
})
}
return []
}
findRecaptchaClients && findRecaptchaClients()
Sau đó thực thi hàm này findRecaptchaClients() trong console để tìm hàm tương ứng
[
{
"id": "0",
"version": "V2",
"sitekey": "site key-",
"function": "onSuccess",
"callback": "___grecaptcha_cfg.clients['0']['l']['l']['callback']",
"pageurl": "site url"
}
]
Lưu ý: Đôi khi hàm hồi gọi được tìm thấy là tên hàm, chẳng hạn như onSuccess được đề cập ở trên, trực tiếp onSuccess(gRecaptchaResponse) khi gọi, nhưng đôi khi nó được tìm thấy là một hàm vô danh, có nghĩa là không có tên hàm, chẳng hạn như sau:
Đối với loại hàm vô danh này, chúng ta chỉ cần thực thi nó theo đường dẫn đầy đủ mà chúng ta vừa tìm thấy, và hiệu ứng là như nhau, ví dụ:
___grecaptcha_cfg.clients.xxxxxxxxx.xxxxx.xxxxx.callback(gRecaptchaResponse)
Hãy lấy một ví dụ, lấy trang web này làm ví dụ, nhập ___grecaptcha_cfg.clients để mở rộng tìm kiếm, bạn có thể thấy hàm hồi gọi ở đây promise-callback là một hàm vô danh f(token)

Chúng ta có thể nhấp chuột phải vào nó và nhấp vào Copy property path để sao chép đường dẫn nút này
[100000].l.l["promise-callback"]("gRecaptchaResponse")
Thêm ___grecaptcha_cfg.clients vừa nhập vào, và bạn có thể nhận được đường dẫn đầy đủ của hàm này
___grecaptcha_cfg.clients[100000].l.l["promise-callback"]
Cuối cùng, nó giống như phương pháp thực thi được đề cập ở trên, chỉ cần thực thi nó như một hàm bình thường
___grecaptcha_cfg.clients[100000].l.l["promise-callback"](gRecaptchaResponse)
Nhóm Capsolver 💜
Đang gặp phải lỗi "reCAPTCHA Invalid Site Key" hoặc "token reCAPTCHA không hợp lệ"? Khám phá các nguyên nhân phổ biến, các giải pháp từng bước và mẹo khắc phục sự cố để giải quyết các vấn đề xác minh reCAPTCHA thất bại. Học cách sửa lỗi xác minh reCAPTCHA, vui lòng thử lại.

Học cách giải reCAPTCHA v2 bằng Python và API. Hướng dẫn toàn diện này bao gồm các phương pháp Proxy và không dùng Proxy cùng với mã nguồn có thể triển khai cho tự động hóa.
