Internet Roadtrip Fix Cloudflare Turnstile

Fix Cloudflare Turnstile performance

目前為 2025-08-27 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name        Internet Roadtrip Fix Cloudflare Turnstile
// @namespace   jdranczewski.github.io
// @match       https://neal.fun/internet-roadtrip/*
// @version     0.3.1
// @author      jdranczewski
// @description Fix Cloudflare Turnstile performance
// @license     MIT
// @grant       unsafeWindow
// @grant       GM_setValue
// @grant       GM_getValue
// @run-at      document-start
// ==/UserScript==

(async function() {

// Clear the interval, the widget renews every 5 minutes either way
if (unsafeWindow.turnstileInterval) {
    clearInterval(unsafeWindow.turnstileInterval);
    console.log("Turnstile interval cleared immediately");
} else {
    let _turnstileInterval;
    Object.defineProperty(unsafeWindow, "turnstileInterval", {
        get() {
            return _turnstileInterval;
        },
        set(turnstileInterval) {
            _turnstileInterval = turnstileInterval;
            clearInterval(turnstileInterval);
            console.log("Turnstile interval cleared after a bit");
        },
        configurable: true,
        enumerable: true,
    });
}

// Save the token for 7 minutes, so voting works immediately after reload
function saveToken(token) {
    GM_setValue("IRToken", token);
    GM_setValue("token_date", Date.now());
}
// No token set yet
if (!unsafeWindow.IRToken) {
    const stored_token = GM_getValue("IRToken");
    const stored_date = GM_getValue("token_date");
    if (stored_token && stored_date && (Date.now() - stored_date) < 420000) {
        unsafeWindow.IRToken = stored_token;
    }
}
let _IRToken = unsafeWindow?.IRToken;
Object.defineProperty(unsafeWindow, "IRToken", {
    get() {
        return _IRToken;
    },
    set(IRToken) {
        _IRToken = IRToken;
        saveToken(IRToken);
    },
    configurable: true,
    enumerable: true,
});


})();