Greasy Fork

来自缓存

Greasy Fork is available in English.

Cursor CN解除屏蔽

在sheerid的验证页面加入"CN" (China)

当前为 2025-05-08 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Cursor CN解除屏蔽
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  在sheerid的验证页面加入"CN" (China)
// @author       Kean L
// @match        https://services.sheerid.com/verify*
// @grant        unsafeWindow
// @run-at       document-start
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    console.log('SheerID Country Unlocker: Script injecting...');

    const TARGET_URL_PART = 'theme?locale='; // The part of the URL we want to intercept
    const COUNTRY_TO_ADD = 'CN';

    // --- Intercept fetch ---
    const originalFetch = unsafeWindow.fetch;
    unsafeWindow.fetch = async function(input, init) {
        const url = (typeof input === 'string') ? input : input.url;

        if (url && typeof url === 'string' && url.includes(TARGET_URL_PART)) {
            console.log('SheerID Country Unlocker: Intercepting fetch for', url);
            try {
                const response = await originalFetch.apply(this, arguments);
                const clonedResponse = response.clone(); // Clone to read body
                const data = await clonedResponse.json();

                if (data && data.config && data.config.countries) {
                    if (!data.config.countries.includes(COUNTRY_TO_ADD)) {
                        data.config.countries.unshift(COUNTRY_TO_ADD); // Add to the beginning
                        console.log(`SheerID Country Unlocker: Added "${COUNTRY_TO_ADD}" to countries via fetch. New list:`, data.config.countries);
                    } else {
                        console.log(`SheerID Country Unlocker: "${COUNTRY_TO_ADD}" already in countries list (fetch).`);
                    }

                    // Create a new response with the modified body
                    const newResponse = new Response(JSON.stringify(data), {
                        status: response.status,
                        statusText: response.statusText,
                        headers: response.headers // Preserve original headers
                    });
                    return newResponse;
                } else {
                    console.warn('SheerID Country Unlocker: Expected data structure not found in fetch response for', url, data);
                }
                return response; // Return original if structure is not as expected
            } catch (error) {
                console.error('SheerID Country Unlocker: Error modifying fetch response for', url, error);
                // In case of error, try to return the original call's result if possible,
                // or re-throw if it's a network error before getting response
                return originalFetch.apply(this, arguments);
            }
        }
        return originalFetch.apply(this, arguments);
    };
    console.log('SheerID Country Unlocker: Fetch override applied.');

    // --- Intercept XMLHttpRequest ---
    const originalXHROpen = XMLHttpRequest.prototype.open;
    const originalXHRSend = XMLHttpRequest.prototype.send;

    XMLHttpRequest.prototype.open = function(method, url) {
        this._sheerIdTargetUrl = null; // Custom property to store if this is our target
        if (typeof url === 'string' && url.includes(TARGET_URL_PART)) {
            this._sheerIdTargetUrl = url;
            // console.log('SheerID Country Unlocker: XHR.open preparing for', url);
        }
        originalXHROpen.apply(this, arguments);
    };

    XMLHttpRequest.prototype.send = function() {
        if (this._sheerIdTargetUrl) { // Check if this XHR instance is the one we care about
            const originalOnReadyStateChange = this.onreadystatechange;
            const originalOnLoad = this.onload;
            const currentXHR = this; // Capture 'this'

            const processResponse = function() {
                if (currentXHR.readyState === 4 && currentXHR.status >= 200 && currentXHR.status < 300) {
                    if (currentXHR._sheerIdResponseProcessed) return; // Ensure one-time processing
                    currentXHR._sheerIdResponseProcessed = true;

                    console.log('SheerID Country Unlocker: Intercepting XHR response for', currentXHR._sheerIdTargetUrl);
                    try {
                        const originalResponseText = currentXHR.responseText;
                        let data = JSON.parse(originalResponseText);

                        if (data && data.config && data.config.countries) {
                            if (!data.config.countries.includes(COUNTRY_TO_ADD)) {
                                data.config.countries.unshift(COUNTRY_TO_ADD);
                                console.log(`SheerID Country Unlocker: Added "${COUNTRY_TO_ADD}" to countries via XHR. New list:`, data.config.countries);

                                const modifiedResponseText = JSON.stringify(data);

                                // Override responseText and response
                                Object.defineProperty(currentXHR, 'responseText', { value: modifiedResponseText, writable: true, configurable: true });
                                if (currentXHR.responseType === '' || currentXHR.responseType === 'text') {
                                    Object.defineProperty(currentXHR, 'response', { value: modifiedResponseText, writable: true, configurable: true });
                                } else if (currentXHR.responseType === 'json') {
                                    Object.defineProperty(currentXHR, 'response', { value: data, writable: true, configurable: true });
                                }
                                // Note: 'responseXML' might also need handling if responseType is 'document', but unlikely for this JSON API
                            } else {
                                console.log(`SheerID Country Unlocker: "${COUNTRY_TO_ADD}" already in countries list (XHR).`);
                            }
                        } else {
                             console.warn('SheerID Country Unlocker: Expected data structure not found in XHR response for', currentXHR._sheerIdTargetUrl, data);
                        }
                    } catch (error) {
                        console.error('SheerID Country Unlocker: Error modifying XHR response for', currentXHR._sheerIdTargetUrl, error);
                    }
                }
            };

            if (originalOnReadyStateChange) {
                this.onreadystatechange = function() {
                    processResponse();
                    originalOnReadyStateChange.apply(this, arguments);
                };
            } else {
                 this.onreadystatechange = processResponse;
            }

            // Also listen to 'load' event as some libraries prefer it
            if(originalOnLoad){
                this.onload = function() {
                    processResponse(); // processResponse already checks readyState and status
                    originalOnLoad.apply(this, arguments);
                };
            } else {
                this.onload = processResponse;
            }

        }
        originalXHRSend.apply(this, arguments);
    };
    console.log('SheerID Country Unlocker: XMLHttpRequest overrides applied.');

})();