🏠 Home 

4chan Base64 Decode Tool

appears in the thread page. auto recursive decoding if the message is coded multiple times.

// ==UserScript==
// @name         4chan Base64 Decode Tool
// @namespace    https://github.com/x94fujo6rpg/SomeTampermonkeyScripts
// @version      0.01
// @description  appears in the thread page. auto recursive decoding if the message is coded multiple times.
// @author       x94fujo6
// @match        https://boards.4chan.org/*/thread/*
// @match        https://boards.4channel.org/*/thread/*
// ==/UserScript==
/* jshint esversion: 9 */
(function () {
let
elem = {
tool: "decode_tool",
in: "decode_input",
out: "decode_output",
decode: "decode_shit",
copy: "decode_copy",
open: "decode_open",
close: "decode_close",
},
box = document.createElement("div"),
class_list = {
title: "usTitle",
box: "usBox",
t: "usTextBox",
b: "usButton line-2-item",
},
getIn = () => document.getElementById(elem.in).value,
getOut = () => document.getElementById(elem.out).value,
setIn = (t = "") => document.getElementById(elem.in).value = t,
setOut = (t = "") => document.getElementById(elem.out).value = t,
decode_text = () => {
let text = getIn(),
count = 0,
max = 100,
[err, output] = decoder(text),
last_output = output,
err_msg = "decode failed";
setIn();
console.log(count, text);
if (err) {
setOut(err_msg);
console.log(err_msg);
}
while (!err && output.length && count < max) {
count++;
console.log(count, last_output);
setOut(last_output);
[err, output] = decoder(last_output);
if (err) {
console.log("end loop");
break;
} else {
setIn(last_output);
last_output = output;
}
}
function decoder(_t = "") {
let out = false,
error = false;
try {
out = atob(_t);
} catch (e) {
error = e;
} finally {
return [error, out];
}
}
},
copy = () => {
let text = document.getElementById(elem.out);
text.select();
text.setSelectionRange(0, 99999);
document.execCommand("copy");
},
open = () => document.getElementById(elem.tool).style.display = "",
close = () => document.getElementById(elem.tool).style.display = "none";
box.className = class_list.box;
box.innerHTML = `
<div class="${class_list.title}">Base64 Decode Tool</div>
<div id="${elem.tool}" style="display: none;">
<button type="button" id="${elem.decode}" class="${class_list.b}">Decode Input</button>
<button type="button" id="${elem.copy}" class="${class_list.b}">Copy Output</button>
<textarea id="${elem.in}" class="${class_list.t}" rows="10" cols="70" placeholder="input"></textarea>
<textarea id="${elem.out}" class="${class_list.t}" rows="10" cols="70" placeholder="output"></textarea>
</div>
<button type="button" id="${elem.open}" class="${class_list.b}">Open</button>
<button type="button" id="${elem.close}" class="${class_list.b}">Close</button>
`;
addCss();
document.body.appendChild(box);
document.getElementById(elem.decode).onclick = () => decode_text(false);
document.getElementById(elem.copy).onclick = () => copy();
document.getElementById(elem.open).onclick = () => open();
document.getElementById(elem.close).onclick = () => close();
function addCss() {
let s = document.createElement("style");
document.head.appendChild(s);
s.textContent = `
.usTitle {
display: block;
font-size: large;
margin: auto;
width: 20rem;
padding: 0.5rem;
}
.usBox {
position: fixed;
bottom: 1rem;
right: 1rem;
z-index: 100;
border: 2px ridge rgba(0, 0, 0, 0.3);
background-color: rgba(255, 255, 255, 0.75);
display: block;
width: max-content;
height: max-content;
text-align: center;
}
.usTextBox {
display: flex;
width: 95%;
height: 35%;
margin: 0.2rem auto;
word-break: break-all;
}
.usButton {
display: inline;
margin: 0.25rem;
padding: 0.5rem;
text-align: center;
font-size: large;
}
.line-2-item {
max-width: 100%;
width: calc(90% / 2);
}
`;
}
})();