在网页加载后自动修改加密后的网址检查网址
当前为
// ==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']
});
})();