Android端获取FunCaptcha token的实现方案咨询
如何修改WebView代码以获取FunCaptcha的Token?
我希望通过WebView加载FunCaptcha,并在用户完成验证码验证后获取对应的token,FunCaptcha地址为:https://fbsbx.com/captcha/recaptcha/iframe/。以下代码原本用于获取Google Captcha token,请问如何修改以适配FunCaptcha?
原代码(Google reCAPTCHA版本)
binding.webview.settings.javaScriptEnabled = true binding.webview.setBackgroundColor(Color.TRANSPARENT) binding.webview.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) binding.webview.loadUrl("javascript: if($('div.g-recaptcha').length)" + "{" + "var sitekey = $('div.g-recaptcha').attr('data-sitekey');" + // 获取现有reCAPTCHA元素的site-key "$('body > *').remove(); " + // 清空页面所有内容 "$('body').append('<div id=\"captcha\"></div>'); " + // 创建用于渲染验证码的div "grecaptcha.render('captcha', {\n" + // 在新div中渲染reCAPTCHA " 'sitekey' : sitekey,\n" + " 'callback' : function(response){console.log('captchatoken:'+response)},\n" + // 回调中打印token到控制台 "});" + "$('body').css('background-color','transparent');" + // 美化背景 "}"); binding.webview.visibility = View.VISIBLE // 验证码准备好后显示WebView } } binding.webview.webChromeClient = object : WebChromeClient() { override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean { val message = consoleMessage.message() binding.txtToken.text = message if (message.startsWith("captchatoken:")) { val token = message.substring(13) // 移除前缀获取纯token if (token.isNotEmpty()){ binding.txtToken.text = token Log.d(TAG, "onConsoleMessage: $token") } } return super.onConsoleMessage(consoleMessage) } } binding.webview.loadUrl("https://fbsbx.com/captcha/recaptcha/iframe/")
修改后的代码(适配FunCaptcha)
FunCaptcha的API逻辑和Google reCAPTCHA不同,主要修改点集中在JavaScript渲染部分,以下是调整后的完整代码:
binding.webview.settings.javaScriptEnabled = true binding.webview.setBackgroundColor(Color.TRANSPARENT) binding.webview.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) // 适配FunCaptcha的JavaScript逻辑 binding.webview.loadUrl("javascript: if($('div[class*=\"fc-captcha\"]').length)" + "{" + "var publicKey = $('div[class*=\"fc-captcha\"]').attr('data-pkey');" + // 获取FunCaptcha的公钥(通常是data-pkey属性) "$('body > *').remove(); " + // 清空页面内容 "$('body').append('<div id=\"captcha\"></div>'); " + // 创建渲染容器 // 使用FunCaptcha的fc.render方法渲染验证码 "fc.render('captcha', {\n" + " 'pkey' : publicKey,\n" + " 'callback' : function(response){console.log('captchatoken:'+response)},\n" + // 回调打印token到控制台 "});" + "$('body').css('background-color','transparent');" + "}"); binding.webview.visibility = View.VISIBLE } } binding.webview.webChromeClient = object : WebChromeClient() { override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean { val message = consoleMessage.message() binding.txtToken.text = message if (message.startsWith("captchatoken:")) { val token = message.substring(13) if (token.isNotEmpty()){ binding.txtToken.text = token Log.d(TAG, "onConsoleMessage: $token") } } return super.onConsoleMessage(consoleMessage) } } binding.webview.loadUrl("https://fbsbx.com/captcha/recaptcha/iframe/")
关键修改说明
- 元素选择与密钥获取:将原reCAPTCHA的
div.g-recaptcha和data-sitekey替换为FunCaptcha对应的元素(通常是带fc-captcha类的div)和公钥属性data-pkey - 渲染方法替换:用FunCaptcha的
fc.render替代Google的grecaptcha.render,参数中用pkey传递公钥 - 回调逻辑保留:保持原有的控制台输出逻辑,这样WebChromeClient可以继续通过监听控制台消息提取token
- 注意事项:如果目标页面未自动加载FunCaptcha的SDK,需要在JavaScript中手动引入(比如添加
$('body').append('<script src="https://cdn.arkoselabs.com/fc/1.2.8/fc.js"></script>');),确保fc对象可用
内容的提问来源于stack exchange,提问作者RubinAds
相关产品推荐
相关产品推荐

