<WebViewsource={{html: captchaHtml,// html 字符串模板baseUrl: 'https://ca.turing.captcha.qcloud.com' // 使用腾讯验证码的域名作为 baseUrl}}....// 其他必要配置/>
options={ready: function(size){// 与Android通信}}new TencentCaptcha(appId, callback, options);
<!doctype html><html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Web Domain Name Switching Demo</title></head><body><div id="cap_frame"></div></body><script>// Maximum time to load scriptconst MAX_SCRIPT_LOAD_TIME = 10000;/*** load script promise* @param {object} config*/function loadScriptPromise(config) {return new Promise((resolve, reject) => {loadScript(config, (err, result) => {if (err) {reject(err);} else {resolve(result);}});});}/*** error callback* @param {string} captchaAppid*/function errorCallback(captchaAppid) {// error ticketconst ticket = `trerror_1001_${captchaAppid}_${Math.floor(new Date().getTime() / 1000)}`;const result = {ret: -1,randstr: `@${Math.random().toString(36).substr(2)}`,ticket,errorCode: 1001,errorMessage: 'jsload_error',};console.log(result);}/*** success callback* @param {object} result*/function globalCallback(result) {console.log(result);}/*** dynamic load script* @param {object} src timeout* @param {function} cb*/function loadScript({ src, timeout = MAX_SCRIPT_LOAD_TIME }, cb) {const startTime = Date.now();const script = document.createElement('script');script.async = true;script.src = src;let finished = false;const cleanup = () => {if (script.parentNode) {script.parentNode.removeChild(script);}script.onload = null;script.onerror = null;};const executeCallback = (err, result) => {if (finished) return;finished = true;clearTimeout(timer);cleanup();cb(err, result);};var timer = setTimeout(() => {executeCallback(new Error('Script load timeout'));}, timeout);script.onload = () => {const cost = Date.now() - startTime;executeCallback(null, cost);};script.onerror = () => {executeCallback(new Error('Script load error'));};document.head.appendChild(script);}/*** use captcha sdk* @param {string} appid*/function useCaptcha(appid) {const captcha = new TencentCaptcha(document.getElementById('cap_frame'),appid,globalCallback,{},);captcha.show();}/*** load captcha sdk* @param {string} appid*/async function loadCaptchaSDK(appid) {const MAX_SCRIPT_LOAD_TIME = 10000;const cdnUrls = ['https://ca.turing.captcha.qcloud.com/TJNCaptcha-global.js','https://www.tycaptcha.com/TJNCaptcha-global.js',];for (const [index, src] of cdnUrls.entries()) {try {console.log(`Trying Domain ${index + 1}: ${src}`);await loadScriptPromise({ src, timeout: MAX_SCRIPT_LOAD_TIME });console.log(`Domain ${index + 1} Load Success`);return useCaptcha(appid);} catch (error) {console.warn(`Domain ${index + 1} Load Failed:`, error.message);if (index === cdnUrls.length - 1) {console.error('All Domains Load Failed');return errorCallback(appid);}}}}loadCaptchaSDK('Yours CaptchaAppid').catch(console.error);</script></html>
二进制位 | 风控拦截策略大类 | 示例 |
0 | 秒拨代理 IP 异常 | EvilBitmap 返回34,转为二进制值为100010,其二进制位1/5为1,说明对应的风控拦截策略为:IP 短时聚集异常 + 数据参数异常。 |
1 | IP 短时聚集异常(短时间内多次发起验证) | |
2 | CaptchaAppId + IP 短时聚集异常(短时间内多次发起验证) | |
3 | CaptchaAppId + IP + 设备短时聚集异常(短时间内多次发起验证) | |
4 | 流量特征异常(例如 TCP 协议栈信息异常) | |
5 | 数据参数异常(例如 浏览器参数异常) | |
6 | 蜜罐异常(执行了不该执行的逻辑) | |
7 | 行为聚类异常 | |
编码 | 风险类型 | 风险类型描述 |
101 | 综合评分风险 | - |
102 | 模拟鼠标轨迹风险 | 疑似机器模拟鼠标轨迹(仅适用于浏览器) |
201 | 恶意请求风险 | 疑似使用工具发起恶意请求 |
301 | 模拟器风险 | 疑似使用模拟器 |
401 | 设备篡改风险 | 疑似篡改设备硬件信息 |
501 | 疑似黑产风险 | 疑似使用黑灰产设备 |
601 | 行为风险 | 疑似使用自动化操作 |
701 | 浏览器风险 | 疑似浏览器被篡改 |
文档反馈