// ==UserScript== // @name BGM小组信息加密工具 // @namespace http://tampermonkey.net/ // @version 1.5 // @author Sedoruee // @match https://bgm.tv/group/topic/* // @description null // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; const defaultKeys = { "bangumi": "默认密钥", "sedoruee": "Sedoruee" }; let currentKey = "bangumi"; // 默认密钥 // 从存储中读取密钥,如果没有则使用默认密钥 let keys = GM_getValue('keys', defaultKeys); // 加密函数 (使用 AES 加密) function encrypt(text, key) { return CryptoJS.AES.encrypt(text, key).toString(); } // 解密函数 (使用 AES 解密) function decrypt(ciphertext, key) { try { const bytes = CryptoJS.AES.decrypt(ciphertext, key); return bytes.toString(CryptoJS.enc.Utf8); } catch (e) { return null; // 解密失败返回 null } } // 自动解密页面中的加密内容,并应用样式 function autoDecryptPage() { const encryptedRegex = /\[加密\](.*?)\[topic409567\]/g; document.body.innerHTML = document.body.innerHTML.replace(encryptedRegex, (match, p1) => { for (const key in keys) { const decryptedText = decrypt(p1, key); if (decryptedText) { return decryptedText; } } return match; // 所有密钥都解密失败,保留原始加密文本 }); } function createButtons() { const submitBtn = document.querySelector('#submitBtnO'); if (!submitBtn) return; const keySelect = document.createElement('select'); for (const key in keys) { const option = document.createElement('option'); option.value = key; option.text = keys[key]; if (key === currentKey) { option.selected = true; } keySelect.appendChild(option); } keySelect.addEventListener('change', () => { currentKey = keySelect.value; }); const encryptBtn = document.createElement('button'); encryptBtn.innerText = '加密'; encryptBtn.style.marginLeft = '10px'; encryptBtn.addEventListener('click', (event) => { event.preventDefault(); const contentTextarea = document.querySelector('#content'); if (contentTextarea) { const originalText = contentTextarea.value; const encryptedText = '[加密]' + encrypt(originalText, currentKey) + '[topic409567]'; contentTextarea.value = encryptedText; } }); const addKeyBtn = document.createElement('button'); addKeyBtn.innerText = '添加密钥'; addKeyBtn.style.marginLeft = '10px'; addKeyBtn.addEventListener('click', () => { let newKeyInput = prompt("请输入新的密钥和备注,以|分隔 (例如: mykey|我的密钥):"); if (newKeyInput) { let [newKey, newKeyDesc] = newKeyInput.split("|"); if (!newKey) return alert("密钥不能为空!"); newKey = newKey.trim(); // 去除空格 newKeyDesc = (newKeyDesc || newKey).trim(); // 去除空格 keys[newKey] = newKeyDesc; GM_setValue('keys', keys); location.reload(); // 刷新页面 } }); const deleteKeyBtn = document.createElement('button'); deleteKeyBtn.innerText = '删除密钥'; deleteKeyBtn.style.marginLeft = '10px'; deleteKeyBtn.addEventListener('click', () => { let keyToDelete = prompt("请输入要删除的密钥:", currentKey); if (keyToDelete && keys[keyToDelete]) { if (confirm(`确定要删除密钥 ${keys[keyToDelete]} (${keyToDelete}) 吗?`)) { delete keys[keyToDelete]; GM_setValue('keys', keys); location.reload(); // 刷新页面以更新密钥选择框 } } else { alert("密钥不存在!"); } }); submitBtn.parentNode.insertBefore(keySelect, submitBtn.nextSibling); submitBtn.parentNode.insertBefore(encryptBtn, keySelect.nextSibling); submitBtn.parentNode.insertBefore(addKeyBtn, encryptBtn.nextSibling); submitBtn.parentNode.insertBefore(deleteKeyBtn, addKeyBtn.nextSibling); } // 页面加载时自动解密 window.addEventListener('load', () => { autoDecryptPage(); createButtons(); }); })();