您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Tries to detect and un-break Session IDs posted on 4chan
当前为
// ==UserScript== // @name 4chan Session ID Unbreaker // @license GPLv3 // @namespace https://boards.4chan.org/ // @version 1.5 // @description Tries to detect and un-break Session IDs posted on 4chan // @author ceodoe // @match https://boards.4chan.org/*/thread/* // @match https://boards.4chan.org/*/res/* // @icon https://www.google.com/s2/favicons?sz=64&domain=4chan.org // @grant none // ==/UserScript== function parsePosts() { let posts = document.querySelectorAll("blockquote.postMessage"); for(let i = 0; i < posts.length; i++) { if(posts[i].getAttribute("data-4sidu-parsed") !== "1") { posts[i].setAttribute("data-4sidu-parsed", "1"); // Strip all backlinks as they are likely to contain the magic number 05 that all Session IDs start with let postText = posts[i].innerText.replace(/\>\>\b[0-9]+\b/g, ""); let idStartIndex = postText.indexOf("05"); if(idStartIndex > -1) { let id = postText.substring(idStartIndex).replace(/[^A-Fa-f0-9]/g, "").substring(0, 66); if(id.length == 66) { // All Session IDs are 66 characters long; if we didn't get that many characters, the ID is invalid let overflow = ""; if(posts[i].parentNode.classList.contains("op")) { overflow = "overflow: auto;"; } let html = ` <div style="margin-top: 1em; border-top: 1px solid; padding: 0.5em; width: fit-content; ${overflow}"> <span style="color: #66cc33; font-weight: bold;">Session ID:</span> ${id} <input type="button" class="4sidu-copy-btn" id="4sidu-copy-btn-${i}" data-4sidu-session-id="${id}" style="margin-left: 0.5em;" value="Copy"> </div> `; posts[i].insertAdjacentHTML("beforeend", html); document.getElementById(`4sidu-copy-btn-${i}`).addEventListener("click", async function() { let tempInput = document.createElement("input"); tempInput.value = this.getAttribute("data-4sidu-session-id"); tempInput.select(); tempInput.setSelectionRange(0,66); try { await navigator.clipboard.writeText(tempInput.value); this.value = "✓"; window.setTimeout(function() { document.getElementById(`4sidu-copy-btn-${i}`).value = "Copy"; }, 3000) } catch (err) { alert("Failed to copy to clipboard: " + err); } }); } } } } } new MutationObserver(function(event) { parsePosts(); }).observe(document.querySelector("div.thread"), {childList: true}); parsePosts();