4chan Base64 Decode Tool

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

目前为 2022-01-22 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name 4chan Base64 Decode Tool
  3. // @namespace https://github.com/x94fujo6rpg/SomeTampermonkeyScripts
  4. // @version 0.01
  5. // @description appears in the thread page. auto recursive decoding if the message is coded multiple times.
  6. // @author x94fujo6
  7. // @match https://boards.4chan.org/*/thread/*
  8. // @match https://boards.4channel.org/*/thread/*
  9. // ==/UserScript==
  10. /* jshint esversion: 9 */
  11.  
  12. (function () {
  13. let
  14. elem = {
  15. tool: "decode_tool",
  16. in: "decode_input",
  17. out: "decode_output",
  18. decode: "decode_shit",
  19. copy: "decode_copy",
  20. open: "decode_open",
  21. close: "decode_close",
  22. },
  23. box = document.createElement("div"),
  24. class_list = {
  25. title: "usTitle",
  26. box: "usBox",
  27. t: "usTextBox",
  28. b: "usButton line-2-item",
  29. },
  30. getIn = () => document.getElementById(elem.in).value,
  31. getOut = () => document.getElementById(elem.out).value,
  32. setIn = (t = "") => document.getElementById(elem.in).value = t,
  33. setOut = (t = "") => document.getElementById(elem.out).value = t,
  34. decode_text = () => {
  35. let text = getIn(),
  36. count = 0,
  37. max = 100,
  38. [err, output] = decoder(text),
  39. last_output = output,
  40. err_msg = "decode failed";
  41. setIn();
  42. console.log(count, text);
  43. if (err) {
  44. setOut(err_msg);
  45. console.log(err_msg);
  46. }
  47. while (!err && output.length && count < max) {
  48. count++;
  49. console.log(count, last_output);
  50. setOut(last_output);
  51. [err, output] = decoder(last_output);
  52. if (err) {
  53. console.log("end loop");
  54. break;
  55. } else {
  56. setIn(last_output);
  57. last_output = output;
  58. }
  59. }
  60.  
  61. function decoder(_t = "") {
  62. let out = false,
  63. error = false;
  64. try {
  65. out = atob(_t);
  66. } catch (e) {
  67. error = e;
  68. } finally {
  69. return [error, out];
  70. }
  71. }
  72. },
  73. copy = () => {
  74. let text = document.getElementById(elem.out);
  75. text.select();
  76. text.setSelectionRange(0, 99999);
  77. document.execCommand("copy");
  78. },
  79. open = () => document.getElementById(elem.tool).style.display = "",
  80. close = () => document.getElementById(elem.tool).style.display = "none";
  81.  
  82. box.className = class_list.box;
  83. box.innerHTML = `
  84. <div class="${class_list.title}">Base64 Decode Tool</div>
  85. <div id="${elem.tool}" style="display: none;">
  86. <button type="button" id="${elem.decode}" class="${class_list.b}">Decode Input</button>
  87. <button type="button" id="${elem.copy}" class="${class_list.b}">Copy Output</button>
  88. <textarea id="${elem.in}" class="${class_list.t}" rows="10" cols="70" placeholder="input"></textarea>
  89. <textarea id="${elem.out}" class="${class_list.t}" rows="10" cols="70" placeholder="output"></textarea>
  90. </div>
  91. <button type="button" id="${elem.open}" class="${class_list.b}">Open</button>
  92. <button type="button" id="${elem.close}" class="${class_list.b}">Close</button>
  93. `;
  94. addCss();
  95. document.body.appendChild(box);
  96. document.getElementById(elem.decode).onclick = () => decode_text(false);
  97. document.getElementById(elem.copy).onclick = () => copy();
  98. document.getElementById(elem.open).onclick = () => open();
  99. document.getElementById(elem.close).onclick = () => close();
  100.  
  101. function addCss() {
  102. let s = document.createElement("style");
  103. document.head.appendChild(s);
  104. s.textContent = `
  105. .usTitle {
  106. display: block;
  107. font-size: large;
  108. margin: auto;
  109. width: 20rem;
  110. padding: 0.5rem;
  111. }
  112.  
  113. .usBox {
  114. position: fixed;
  115. bottom: 1rem;
  116. right: 1rem;
  117. z-index: 100;
  118. border: 2px ridge rgba(0, 0, 0, 0.3);
  119. background-color: rgba(255, 255, 255, 0.75);
  120. display: block;
  121. width: max-content;
  122. height: max-content;
  123. text-align: center;
  124. }
  125.  
  126. .usTextBox {
  127. display: flex;
  128. width: 95%;
  129. height: 35%;
  130. margin: 0.2rem auto;
  131. word-break: break-all;
  132. }
  133.  
  134. .usButton {
  135. display: inline;
  136. margin: 0.25rem;
  137. padding: 0.5rem;
  138. text-align: center;
  139. font-size: large;
  140. }
  141.  
  142. .line-2-item {
  143. max-width: 100%;
  144. width: calc(90% / 2);
  145. }
  146. `;
  147. }
  148. })();