// ==UserScript==
// @name Steam_Commit_Crypto
// @namespace https://blog.chrxw.com
// @version 0.1
// @description STEAM评测加密解密助手
// @author Chr_
// @include /https://(store\.steampowered|steamcommunity)\.com?/*.
// @require https://gf.qytechs.cn/scripts/426509-bear-encode-decode/code/Bear_Encode_Decode.js
// @require https://cdn.jsdelivr.net/npm/[email protected]/base64.min.js
// @require https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/core.min.js
// @connect steamcommunity.com
// @license AGPL-3.0
// @icon https://blog.chrxw.com/favicon.ico
// ==/UserScript==
let G_ver = '2.3'; // 版本号
let G_CMode = 'syyz'; // 加密解密模式
let G_str = '';
const CryptoMode = { // 加解密模式
// 'auto': ['自动猜测(非万能)', null, null],
'syyz': ['兽音译者', bearEncode, bearDecode],
// 'msdm': ['摩斯电码', null, null],
// 'xfy': ['佛曰', null, null],
// 'rcnb': ['RCNB', null, null],
// 'bs64': ['Base64', null, null],
};
const ValidElemtents = [
['class', 'content'],
['class', 'input_box']
];
(() => {
'use strict';
// if (self != top) {// 位于iframe中,不执行脚本
// return;
// }
addPanel();
window.addEventListener('mouseup', handleMouseUpEvent);
window.addEventListener('mousedown', handleMouseDownEvent);
})();
// 添加GUI
function addPanel() {
function genButton(text, foo, id) {
let b = document.createElement('button');
b.textContent = text;
b.style.cssText = 'vertical-align: inherit;padding: 0 5px;'
b.addEventListener('click', foo);
if (id) { b.id = id; }
return b;
}
function genDiv(id) {
let d = document.createElement('div');
// d.style.cssText = 'vertical-align:middle;';
if (id) { d.id = id };
return d;
}
function genPanel(name, visiable) {
let d = genDiv(name);
d.style.cssText = 'background: rgba(58, 58, 58, 0.9);position: fixed;top: 50%;';
d.style.cssText += 'text-align: center;transform: translate(0px, -50%);z-index: 1000;';
d.style.cssText += 'border: 1px solid rgb(83, 83, 83);padding: 5px;';
d.style.cssText += 'transition:right 0.8s;right:-300px;width:280px;font-size:14px;'
if (visiable) {
d.style.right = '0';
}
return d;
}
function genPanel2(name, visiable) {
let d = genDiv(name);
d.style.cssText = 'background: rgba(58, 58, 58, 0.9);position: fixed;';
d.style.cssText += 'text-align: center;transform: translate(0px, -50%);z-index: 2000;';
d.style.cssText += 'border: 1px solid rgb(83, 83, 83);padding: 2px;visibility: none';
d.style.cssText += 'transition:visiable 0.8s;font-size:14px;'
if (visiable) {
d.style.visibility = 'visible';
}
return d;
}
function genLabel(text, bind) {
let l = document.createElement('label');
l.textContent = text;
l.style.verticalAlign = 'inherit';
if (bind) { l.setAttribute('for', bind); }
return l;
}
function genA(text, url) {
let a = document.createElement('a');
a.textContent = text;
a.href = url;
return a;
}
function genSelect(id, choose, choice) {
let s = document.createElement('select');
s.id = id;
s.style.cssText = 'color:#000;background:#fff;border:none;border-radius:0;vertical-align:inherit;width: 70%;';
for (k in choose) {
s.options.add(new Option(choose[k][0], k));
}
s.value = choice;
return s;
}
function genSpace() {
let s = document.createElement('span');
s.textContent = ' ';
return s;
}
function genBr() {
return document.createElement('br');
}
function genHr() {
let h = document.createElement('hr');
h.style.margin = '2px 0';
return h;
}
function genTextArea(id, tips) {
let t = document.createElement('textarea');
if (id) { t.id = id; }
if (tips) { t.placeholder = tips; }
t.style.cssText = 'width: 98%;height: 100px;resize: vertical;font-size: 12px;';
t.style.cssText += 'max-height:500px;background-color: #fff;padding: 2px;';
return t;
}
let panelFunc = genPanel('sccCtrl', false);
document.body.appendChild(panelFunc);
let divTitle = genDiv();
divTitle.style.marginBottom = '5px'
let lblTitle = genLabel(`SCC - V ${G_ver} - By `, null);
let lblUrl = genA('Chr_', 'https://steamcommunity.com/id/Chr_');
let lblFeed = genA('[反馈]', 'https://blog.chrxw.com/scripts.html');
let btnClose = genButton('关闭', () => { switchPanel(false); }, 'btnClose');
btnClose.style.float = 'left';
divTitle.appendChild(lblTitle);
divTitle.appendChild(lblUrl);
divTitle.appendChild(genSpace());
divTitle.appendChild(lblFeed);
divTitle.appendChild(btnClose);
let txtInput = genTextArea('txtInput', '在这里输入密文');
let divMode = genDiv();
let lblMode = genLabel('模式:', 'lblMode');
let selMode = genSelect('selMode', CryptoMode, G_CMode);
divMode.style.marginBottom = '5px'
divMode.appendChild(lblMode);
divMode.appendChild(selMode);
let divAction = genDiv()
let btnEncode = genButton('加密↑', encode, 'btnEncode');
let btnDecode = genButton('解密↓', decode, 'btnDecode');
let btnExchange = genButton('交换↕', exchange, 'btnExchange');
// let btnExtract = genButton('提取链接🌐', null, 'btnExchange');
divAction.style.marginBottom = '5px'
divAction.appendChild(btnEncode);
divAction.appendChild(genSpace());
divAction.appendChild(btnDecode);
divAction.appendChild(genSpace());
divAction.appendChild(btnExchange);
// divAction.appendChild(genSpace());
// divAction.appendChild(btnExtract);
let txtOutput = genTextArea('txtOutput', '在这里输入明文');
panelFunc.appendChild(divTitle);
panelFunc.appendChild(txtInput);
panelFunc.appendChild(divMode);
panelFunc.appendChild(divAction);
panelFunc.appendChild(txtOutput);
let panelTips = genPanel2('sccTips', false);
document.body.appendChild(panelTips);
let btnSyyzD = genButton('兽音解密', () => { toolbarCallback('syyz_d'); }, 'btnSyyzD');
let btnSyyzE = genButton('兽音加密', () => { toolbarCallback('syyz_e'); }, 'btnSyyzE');
panelTips.appendChild(btnSyyzD);
panelTips.appendChild(btnSyyzE);
}
// 加密
function encode() {
let m = document.getElementById('selMode');
let i = document.getElementById('txtInput');
let o = document.getElementById('txtOutput');
let obj = CryptoMode[m.value][1];
i.value = obj(o.value);
}
// 解密
function decode() {
let m = document.getElementById('selMode');
let i = document.getElementById('txtInput');
let o = document.getElementById('txtOutput');
let obj = CryptoMode[m.value][2];
o.value = obj(i.value);
}
// 交换明文密文
function exchange() {
let i = document.getElementById('txtInput');
let o = document.getElementById('txtOutput');
[i.value, o.value] = [o.value, i.value];
}
// 选中文本显示工具栏
function showDialog(event) {
let x = event.clientX;
let y = event.clientY;
console.log(x, y)
console.log(window.getSelection().toString());
}
// 隐藏工具栏
function hideDialog(event) {
let x = event.clientX;
let y = event.clientY;
console.log(x, y)
console.log(window.getSelection().toString());
}
// 鼠标松开事件(显示工具栏)
function handleMouseUpEvent(event) {
setTimeout(() => {
let ele = event.target;
let str = window.getSelection().toString();
let bar = document.getElementById('sccTips');
if (str == "") { // 未选择文本,终止
return;
}
G_str = str;
// 判断选中的文字是否处于特定的元素中
for (let [key, value] of ValidElemtents) {
let obj = ele.getAttribute(key);
if (obj && obj.toString().indexOf(value) != -1) {
console.log(G_str);
console.log(key, value);
let x, y;
x = event.clientX + 15;
y = event.clientY - 15;
bar.style.left = `${x}px`;
bar.style.top = `${y}px`;
bar.style.visibility = 'visible';
break;
}
}
}, 500);
}
// 鼠标按下事件(隐藏工具栏)
function handleMouseDownEvent(event) {
let ele = event.target;
if (ele.parentElement.id != 'sccTips') {
let bar = document.getElementById('sccTips');
if (bar.style.visibility != 'hidden') {
bar.style.visibility = 'hidden';
}
}
}
// 工具栏回调
function toolbarCallback(mode) {
let m = document.getElementById('selMode');
let i = document.getElementById('txtInput');
let o = document.getElementById('txtOutput');
let b = document.getElementById('sccTips');
b.style.visibility = 'hidden';
switchPanel(true);
i.value = G_str;
o.value = G_str;
m.value = mode.substr(0, mode.length - 2);
switch (mode.substr(mode.length - 1)) {
case 'd':
decode();
break;
case 'e':
encode();
break;
default:
break;
}
}
// 显示/隐藏面板
function switchPanel(mode) {
let p = document.getElementById('sccCtrl');
if (mode === null) {
if (p.style.right == '-300px') {
p.style.right = '0';
} else {
p.style.right = '-300px';
}
} else {
p.style.right = mode ? '0' : '-300px';
}
}