如何查找 hCaptcha 的回调函数
每个网站都不一样,如果以下方式都不能解决问题,烦请您自己多研究研究,您可以的。
通过API获取到识别成功的gRecaptchaResponse值之后,如果你是使用模拟类的软件,如selenium,则需要执行回调函数,来告诉网页我们已经识别成功了,那么我们来了解如何查找到这个函数:
有表单,无需执行回调函数的情况
当hCaptcha处于表单之内,可以先找到类似name="h-captcha-response"
这样的表单元素textarea
,把获取到的gRecaptchaResponse
值写入(赋值)到表单元素中,
然后直接提交表单即可。当然这里需要你自己测试,并不是每一个网站都是这样,有的确实需要执行回调函数。
如果不会提交表单,
1.可以百度:JS提交表单,用执行JS代码的方式提交表单
2.如果是selenium模拟操作,可以直接点击提交按钮,或者执行提交事件
可以参考:reCaptcha的提交表单方式
如果没有表单,就要去找回调函数去执行函数。(有的页面只有一个验证码,并没有表单存在,说明验证通过之后,不是通过表单进入下一步,那就是有回调函数来执行提交到下一步的)
方法一:观察hCaptcha的加载链接
注意观察hCaptcha的加载链接,其中onload就是回调函数,这里是_hcaptchaOnLoad
https://hcaptcha.com/1/api.js?render=explicit&onload=_hcaptchaOnLoad&recaptchacompat=off&sentry=false
PS:如何观察:浏览器按F12
:点击Network
,搜索api.js
,观察加载的链接
如果没有找到上述链接,换其他方式
方法二:观察网页html源代码
浏览器按F12
:点击Elements
,搜索h-captcha
,观察data-callback
属性
<div class="h-captcha" data-sitekey="51829642-2cda-4b09-896c-594f89d700cc" data-callback="solvedCallback">
……
</div>
此处为solvedCallback
,然后可以在Console
处执行函数看看是不是我们想要的回调函数
可以看到这里solvedCallback
确实是一个函数,这个函数的内容也可以直接看到
这个DEMO这里回调并没有做什么动作,因为这个DEMO是一个表单提交形式的,所以无需执行回调函数。
如果是实际使用中,solvedCallback
是一个有效的回调函数的话,可以通过solvedCallback('TOKEN')
的形式来执行回调函数。
方法三:自动获取回调函数
当代码执行成功后,可以使用window.hcaptchaCallback('TOKEN')
这样的形式去执行回调函数
// every 100 ms we check if hcaptcha object is defined
window.myInterval = setInterval(() => {
if (window.hcaptcha) {
console.log('hcaptcha available, lets redefine render method')
// if hcaptcha object is defined, we save the original render method into window.originalRender
window.originalRender = hcaptcha.render
// then we redefine hcaptcha.render method with our function
window.hcaptcha.render = (container, params) => {
console.log(container)
console.log(params)
// storing hcaptcha callback globally
window.hcaptchaCallback = params.callback
// returning the original render method call
return window.originalRender(container, params)
}
clearInterval(window.myInterval)
} else {
console.log('hcaptcha not available yet')
}
}, 100)
// from now we can execute the callback function like window.hcaptchaCallback('TOKEN')
方法四:消息回调
((response) => {
for (const ele of document.querySelectorAll("iframe[data-hcaptcha-widget-id]")) {
const id = ele.attributes["data-hcaptcha-widget-id"].value;
const data = JSON.stringify({
source: "hcaptcha",
label: "challenge-closed",
id,
contents: {
event: "challenge-passed",
response,
expiration: 120
}
});
window.dispatchEvent(new MessageEvent('message', {data}))
}
})('你在平台获取的RESPONSE');
Clouflare保护的网站上的hCaptcha的回调函数
这个回调函数是动态的,比如:hcaptchaCallback1633868639408
函数名前半部份固定hcaptchaCallback
,后半部份为时间戳
在console中可以输入前半部份,会自动匹配后半部份,
然后点击进入JS代码,通过断点可以分析具体情况
建议有实力的可以研究一下如何获得这个动态的函数
关于确实找不到回调函数怎么办?
确实有些网站找不到回调函数,比如discord.com
找不到就放弃呗,直接使用插件,可以通过JS来控制识别
能解决问题就好了
PS:也可以:
使用图像识别接口
或者使用我们的基于图像识别接口开发的付费插件