Prefer Cloudflare Worker KV for verification codes with optional short IMAP fallback disabled for private deploy; track config.json/.env for private repo. Also add worker project, protocol mint backoff, and fail-fast Turnstile/mail timeouts from batch runs.
117 lines
4.1 KiB
JavaScript
117 lines
4.1 KiB
JavaScript
// Turnstile Patch - 隐藏自动化标识,加速 Turnstile 验证
|
||
// MV3 MAIN world + document_start:在页面脚本之前修补真实页面上下文
|
||
|
||
(function () {
|
||
"use strict";
|
||
|
||
// 1. 隐藏 navigator.webdriver 标识
|
||
// Chrome 自动化模式下 navigator.webdriver = true,Turnstile 会检测此属性
|
||
try {
|
||
Object.defineProperty(navigator, "webdriver", {
|
||
get: function () {
|
||
return false;
|
||
},
|
||
configurable: true,
|
||
});
|
||
} catch (e) {}
|
||
|
||
// 2. 移除 Chrome 自动化相关的 Runtime 属性
|
||
try {
|
||
if (window.chrome && window.chrome.runtime) {
|
||
delete window.chrome.runtime.onConnect;
|
||
delete window.chrome.runtime.onMessage;
|
||
}
|
||
} catch (e) {}
|
||
|
||
// 3. 覆盖 permissions.query,隐藏 notifications 权限异常
|
||
try {
|
||
if (navigator.permissions && navigator.permissions.query) {
|
||
var origQuery = navigator.permissions.query.bind(navigator.permissions);
|
||
navigator.permissions.query = function (params) {
|
||
if (params && params.name === "notifications") {
|
||
return Promise.resolve({ state: Notification.permission });
|
||
}
|
||
return origQuery(params);
|
||
};
|
||
}
|
||
} catch (e) {}
|
||
|
||
// 4. 修补 plugin 数量,模拟正常浏览器
|
||
try {
|
||
Object.defineProperty(navigator, "plugins", {
|
||
get: function () {
|
||
return [1, 2, 3, 4, 5];
|
||
},
|
||
configurable: true,
|
||
});
|
||
} catch (e) {}
|
||
|
||
// 5. 修补 languages 属性
|
||
try {
|
||
Object.defineProperty(navigator, "languages", {
|
||
get: function () {
|
||
return ["en-US", "en"];
|
||
},
|
||
configurable: true,
|
||
});
|
||
} catch (e) {}
|
||
|
||
// 6. 页面加载完成后,自动监控并点击 Turnstile 复选框
|
||
if (document.readyState === "loading") {
|
||
document.addEventListener("DOMContentLoaded", autoClickTurnstile);
|
||
} else {
|
||
autoClickTurnstile();
|
||
}
|
||
|
||
function autoClickTurnstile() {
|
||
// 定时检查 Turnstile iframe 是否出现
|
||
var checkCount = 0;
|
||
var maxChecks = 100; // 最多检查 100 次(约 50 秒)
|
||
var timer = setInterval(function () {
|
||
checkCount++;
|
||
if (checkCount > maxChecks) {
|
||
clearInterval(timer);
|
||
return;
|
||
}
|
||
try {
|
||
// 查找 Turnstile iframe
|
||
var iframes = document.querySelectorAll(
|
||
'iframe[src*="challenges.cloudflare.com"], iframe[src*="turnstile"]'
|
||
);
|
||
for (var i = 0; i < iframes.length; i++) {
|
||
var iframe = iframes[i];
|
||
try {
|
||
// 尝试访问 iframe 内部的 checkbox
|
||
var body = iframe.contentDocument || iframe.contentWindow.document;
|
||
var checkbox = body.querySelector(
|
||
'input[type="checkbox"], .mark, #cf-chl-widget-nomu1_resp'
|
||
);
|
||
if (checkbox && !checkbox.checked) {
|
||
checkbox.click();
|
||
}
|
||
} catch (e) {
|
||
// 跨域限制,尝试通过 postMessage 触发
|
||
try {
|
||
iframe.contentWindow.postMessage(
|
||
{ type: "turnstile-auto-click" },
|
||
"*"
|
||
);
|
||
} catch (e2) {}
|
||
}
|
||
}
|
||
|
||
// 也尝试直接操作 Turnstile API
|
||
if (
|
||
window.turnstile &&
|
||
typeof window.turnstile.getResponse === "function"
|
||
) {
|
||
var resp = window.turnstile.getResponse();
|
||
if (resp && resp.length > 0) {
|
||
clearInterval(timer); // 已获得 token,停止检查
|
||
}
|
||
}
|
||
} catch (e) {}
|
||
}, 500);
|
||
}
|
||
})();
|