禁用VIKACG网址安全检查

在网页加载后自动修改加密后的网址检查网址

目前為 2025-10-05 提交的版本,檢視 最新版本

// ==UserScript==
// @name         禁用VIKACG网址安全检查
// @version      1.1
// @description  在网页加载后自动修改加密后的网址检查网址
// @author       xsap
// @match        https://www.vikacg.com/p/*
// @grant        none
// @namespace    NoVikUrlBlock
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // --- 内置极简 CryptoJS AES CBC Pkcs7 实现 ---
    const CryptoJS = (function() {
        // Base64解码
        function base64ToBytes(base64) {
            const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
            let str = base64.replace(/=+$/, '');
            let bytes = [];
            for (let bc = 0, bs, buffer, idx = 0; buffer = str.charAt(idx++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
                bc++ % 4) ? bytes.push(255 & bs >> (-2 * bc & 6)) : 0) buffer = chars.indexOf(buffer);
            return bytes;
        }

        // Utf8编码/解码
        const Utf8 = {
            parse: str => new TextEncoder().encode(str),
            stringify: bytes => new TextDecoder().decode(bytes)
        };

        // AES-CBC 解密
        async function aesCbcDecrypt(base64, key, iv) {
            const data = new Uint8Array(base64ToBytes(base64));
            const cryptoKey = await crypto.subtle.importKey(
                "raw",
                key,
                { name: "AES-CBC" },
                false,
                ["decrypt"]
            );
            const decrypted = await crypto.subtle.decrypt(
                { name: "AES-CBC", iv: iv },
                cryptoKey,
                data
            );
            return new Uint8Array(decrypted);
        }

        return { enc: { Utf8 }, AES: { decrypt: aesCbcDecrypt } };
    })();

    // 解密函数
    async function decrypt(encryptedUrl) {
        try {
            const key = CryptoJS.enc.Utf8.parse("7R75R3JZE2PZUTHH");
            const iv = CryptoJS.enc.Utf8.parse("XWO76NCVZM2X1UCU");
            const hex = encryptedUrl.match(/.{1,2}/g).map(byte => parseInt(byte, 16));
            const base64 = btoa(String.fromCharCode.apply(null, hex));
            const decryptedBytes = await CryptoJS.AES.decrypt(base64, key, iv);
            return new TextDecoder().decode(decryptedBytes).replace(/\x00+$/, '');
        } catch (e) {
            console.error('解密失败:', e);
            return encryptedUrl;
        }
    }

    // 更新所有匹配的链接
    async function updateLinks() {
        const links = document.querySelectorAll('a[href^="/external?e="]');
        for (const link of links) {
            const encryptedUrl = new URL(link.href, window.location.origin).searchParams.get('e');
            if (encryptedUrl) {
                const decryptedUrl = await decrypt(encryptedUrl);
                if (decryptedUrl.startsWith('http')) link.href = decryptedUrl;
            }
        }
    }

    // 初次执行 + 监听DOM变化
    updateLinks();
    const observer = new MutationObserver(updateLinks);
    observer.observe(document.body, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['href']
    });
})();