// ==UserScript==
// @name t66y助手
// @namespace com.t66y.jujufatu
// @author jujufatu
// @version 0.1.2
// @description 优化t66y网页使用体验
// @match http*://*t66y.com/*
// @grant GM_setClipboard
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant GM_registerMenuCommand
// @grant unsafeWindow
// @run-at document-start
// @license CC BY-NC-ND 4.0
// @homepage https://sleazyfork.org/zh-CN/scripts/480811-t66y%E5%8A%A9%E6%89%8B
// @supportURL https://t66y.com/thread0806.php?fid=7
// ==/UserScript==
(function() {
"use strict";
var pageWindow = unsafeWindow;
const BAD_IMG_SVG = "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMjAwcHgiIGhlaWdodD0iMjAwcHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjMTBiMDE4IiAvPgogICAgICAgICAgPHRleHQgeD0iNTAlIiB5PSI3MS40IiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjZjdjNTAwIiBmb250LXNpemU9IjUyIiBmb250LWZhbWlseT0iQXJpYWwiPjx0c3BhbiB4PSI1MCUiIGR5PSIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ov4fmnJ88L3RzcGFuPjx0c3BhbiB4PSI1MCUiIGR5PSI1Ny4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7lm77luoo8L3RzcGFuPjwvdGV4dD48L3N2Zz4=";
const ERROR_FORMAT_BBCODE_TIP_IMG = "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMjAwcHgiIGhlaWdodD0iMjAwcHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJyZWQiIC8+CiAgICAgICAgICA8dGV4dCB4PSI1MCUiIHk9IjYwLjM5OTk5OTk5OTk5OTk5IiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjZjdjNTAwIiBmb250LXNpemU9IjM2IiBmb250LWZhbWlseT0iQXJpYWwiPjx0c3BhbiB4PSI1MCUiIGR5PSIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7otLTlm748L3RzcGFuPjx0c3BhbiB4PSI1MCUiIGR5PSIzOS42IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7moLzlvI88L3RzcGFuPjx0c3BhbiB4PSI1MCUiIGR5PSIzOS42IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7plJnor688L3RzcGFuPjwvdGV4dD48L3N2Zz4=";
const originalWindowOpen = pageWindow.open;
pageWindow.open = function(url) {
let nextUrl = url;
if (/^https:\/\/2023\.redircdn\.com/.test(url)) {
const queryParams = new URLSearchParams(new URL(url).search);
const queryObj = {};
for (const [ key, value ] of queryParams) {
queryObj[key] = value === "undefined" ? undefined : value;
}
nextUrl = queryObj.src || url;
}
return originalWindowOpen.call(this, nextUrl);
};
document.addEventListener("click", handleLinkClick);
window.addEventListener("error", function(event) {
if (event.target.tagName === "IMG") {
event.target.src = event.target.src.startsWith(location.origin) ? ERROR_FORMAT_BBCODE_TIP_IMG : BAD_IMG_SVG;
}
}, true);
document.addEventListener("DOMContentLoaded", function() {
let floors = [ ...document.querySelectorAll(".tpc_content") ];
floors.forEach(floor => {
floor.innerHTML = createMagnetLink(floor.innerHTML);
if (floor.innerHTML.includes("點擊這里打開新視窗")) {
var $floor = $(floor);
var urlRegex = /http[s]?:\/\/[^"'\s]+/i;
$floor.find("a").each(function() {
var onclickValue = $(this).attr("onclick");
var urlMatch = urlRegex.exec(onclickValue);
if (urlMatch) {
var url = urlMatch[0];
var $iframe = $(this).nextAll("iframe").first();
$iframe.attr("src", url);
}
});
}
});
let initComments = [ ...document.querySelectorAll(".post_cont") ];
initComments.forEach(c => {
c.innerHTML = createMagnetLink(c.innerHTML);
});
if (typeof pageWindow.loadComment === "function") {
const originalLoadComment = pageWindow.loadComment;
pageWindow.loadComment = function() {
var data = pageWindow["comm" + arguments[0]];
for (var key in data) {
data[key].c = createMagnetLink(data[key].c);
}
originalLoadComment.apply(this, arguments);
};
}
});
if (document.readyState === "complete") {
jump18();
} else {
window.addEventListener("load", jump18);
}
function jump18() {
if (document.body.innerHTML.includes(`__ 滿 18 歲, \n請按此 __`)) {
location.href = location.origin + "/index.php";
}
}
function handleLinkClick(event) {
const target = event.target;
if (target.tagName === "A" && target.href) {
let url = target.href;
if (/^https:\/\/2023\.redircdn\.com\/\?http/.test(url)) {
url = url.split("https://2023.redircdn.com/?")[1].replace(/______/g, ".").replace(/&z$/, "");
event.preventDefault();
window.open(url);
}
}
}
function createMagnetLink(str) {
try {
str = decodeURIComponent(str);
str = decodeHtmlEntities(str);
} catch (e) {
console.log("createMagnetLink: format str error");
}
const magnetRegex = /(?<!<[^>]*|http\S*)(?:magnet:\?xt=urn:btih:)?([A-Z2-7]{32}|[a-fA-F0-9]{40})(?:&dn=([^&\s]+))?(?:&tr=([^&\s]+))?/gi;
function replaceFunc(match, hash, dn, tr) {
const magnetPrefix = "magnet:?xt=urn:btih:";
const decodedDn = dn ? `磁力链接-${decodeURIComponent(dn)}` : `磁力链接-${hash}`;
const trParam = tr ? `&tr=${encodeURIComponent(tr)}` : "";
let href = match.startsWith(magnetPrefix) ? match : `${magnetPrefix}${hash}${dn ? `&dn=${encodeURIComponent(dn)}` : ""}${trParam}`;
href = href.replace(/\s+/g, "");
return `<a href="${href}">${decodedDn}</a> | <a style="cursor: pointer;" onclick="t66ycopy('${href}')">复制</a>`;
}
return str.replace(magnetRegex, replaceFunc);
}
function decodeHtmlEntities(str) {
return str.replace(/"/g, '"').replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/ /g, " ").replace(/¡/g, "¡").replace(/¢/g, "¢").replace(/£/g, "£").replace(/¤/g, "¤").replace(/¥/g, "¥").replace(/¦/g, "¦").replace(/§/g, "§").replace(/¨/g, "¨").replace(/©/g, "©").replace(/ª/g, "ª").replace(/«/g, "«").replace(/¬/g, "¬").replace(/­/g, "").replace(/®/g, "®").replace(/¯/g, "¯").replace(/°/g, "°").replace(/±/g, "±").replace(/²/g, "²").replace(/³/g, "³").replace(/´/g, "´").replace(/µ/g, "µ").replace(/¶/g, "¶").replace(/·/g, "·").replace(/¸/g, "¸").replace(/¹/g, "¹").replace(/º/g, "º").replace(/»/g, "»").replace(/¼/g, "¼").replace(/½/g, "½").replace(/¾/g, "¾").replace(/¿/g, "¿").replace(/&/g, "&");
}
pageWindow.t66ycopy = function(str) {
GM_setClipboard(str);
Message({
msg: "复制成功",
duration: 666
});
};
function Message({
msg,
duration = 1024
} = {}) {
const messageElement = document.createElement("div");
messageElement.textContent = msg;
messageElement.style.position = "fixed";
messageElement.style.top = "66px";
messageElement.style.left = "50%";
messageElement.style.transform = "translate(-50%, -50%)";
messageElement.style.backgroundColor = "#10b018";
messageElement.style.color = "#f7c500";
messageElement.style.fontSize = "3rem";
messageElement.style.padding = "20px";
messageElement.style.boxShadow = "0 4px 8px rgba(0,0,0,0.1)";
messageElement.style.borderRadius = "10px";
messageElement.style.zIndex = "1000";
messageElement.style.transition = "opacity 0.5s, transform 0.5s";
messageElement.style.opacity = "0";
document.body.appendChild(messageElement);
setTimeout(() => {
messageElement.style.opacity = "1";
messageElement.style.transform = "translate(-50%, -50%) scale(1)";
}, 10);
setTimeout(() => {
messageElement.style.opacity = "0";
messageElement.style.transform = "translate(-50%, -50%) scale(0.9)";
setTimeout(() => {
document.body.removeChild(messageElement);
}, 500);
}, duration);
}
let style = document.createElement("style");
document.head.appendChild(style);
style.sheet.insertRule(`.bad_bg { background-image: url("${BAD_IMG_SVG}") !important; }`, 0);
})();