Sleazy Fork is available in English.

t66y助手

优化t66y网页使用体验

  1. // ==UserScript==
  2. // @name t66y助手
  3. // @namespace com.t66y.jujufatu
  4. // @author jujufatu
  5. // @version 0.1.2
  6. // @description 优化t66y网页使用体验
  7. // @match http*://*t66y.com/*
  8. // @grant GM_setClipboard
  9. // @grant GM_getValue
  10. // @grant GM_setValue
  11. // @grant GM_deleteValue
  12. // @grant GM_registerMenuCommand
  13. // @grant unsafeWindow
  14. // @run-at document-start
  15. // @license CC BY-NC-ND 4.0
  16. // @homepage https://sleazyfork.org/zh-CN/scripts/480811-t66y%E5%8A%A9%E6%89%8B
  17. // @supportURL https://t66y.com/thread0806.php?fid=7
  18. // ==/UserScript==
  19.  
  20. (function() {
  21. "use strict";
  22. var pageWindow = unsafeWindow;
  23. const BAD_IMG_SVG = "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMjAwcHgiIGhlaWdodD0iMjAwcHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjMTBiMDE4IiAvPgogICAgICAgICAgPHRleHQgeD0iNTAlIiB5PSI3MS40IiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjZjdjNTAwIiBmb250LXNpemU9IjUyIiBmb250LWZhbWlseT0iQXJpYWwiPjx0c3BhbiB4PSI1MCUiIGR5PSIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ov4fmnJ88L3RzcGFuPjx0c3BhbiB4PSI1MCUiIGR5PSI1Ny4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7lm77luoo8L3RzcGFuPjwvdGV4dD48L3N2Zz4=";
  24. const ERROR_FORMAT_BBCODE_TIP_IMG = "data:image/svg+xml;charset=utf-8;base64,PHN2ZyB3aWR0aD0iMjAwcHgiIGhlaWdodD0iMjAwcHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJyZWQiIC8+CiAgICAgICAgICA8dGV4dCB4PSI1MCUiIHk9IjYwLjM5OTk5OTk5OTk5OTk5IiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjZjdjNTAwIiBmb250LXNpemU9IjM2IiBmb250LWZhbWlseT0iQXJpYWwiPjx0c3BhbiB4PSI1MCUiIGR5PSIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7otLTlm748L3RzcGFuPjx0c3BhbiB4PSI1MCUiIGR5PSIzOS42IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7moLzlvI88L3RzcGFuPjx0c3BhbiB4PSI1MCUiIGR5PSIzOS42IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7plJnor688L3RzcGFuPjwvdGV4dD48L3N2Zz4=";
  25. const originalWindowOpen = pageWindow.open;
  26. pageWindow.open = function(url) {
  27. let nextUrl = url;
  28. if (/^https:\/\/2023\.redircdn\.com/.test(url)) {
  29. const queryParams = new URLSearchParams(new URL(url).search);
  30. const queryObj = {};
  31. for (const [ key, value ] of queryParams) {
  32. queryObj[key] = value === "undefined" ? undefined : value;
  33. }
  34. nextUrl = queryObj.src || url;
  35. }
  36. return originalWindowOpen.call(this, nextUrl);
  37. };
  38. document.addEventListener("click", handleLinkClick);
  39. window.addEventListener("error", function(event) {
  40. if (event.target.tagName === "IMG") {
  41. event.target.src = event.target.src.startsWith(location.origin) ? ERROR_FORMAT_BBCODE_TIP_IMG : BAD_IMG_SVG;
  42. }
  43. }, true);
  44. document.addEventListener("DOMContentLoaded", function() {
  45. let floors = [ ...document.querySelectorAll(".tpc_content") ];
  46. floors.forEach(floor => {
  47. floor.innerHTML = createMagnetLink(floor.innerHTML);
  48. if (floor.innerHTML.includes("點擊這里打開新視窗")) {
  49. var $floor = $(floor);
  50. var urlRegex = /http[s]?:\/\/[^"'\s]+/i;
  51. $floor.find("a").each(function() {
  52. var onclickValue = $(this).attr("onclick");
  53. var urlMatch = urlRegex.exec(onclickValue);
  54. if (urlMatch) {
  55. var url = urlMatch[0];
  56. var $iframe = $(this).nextAll("iframe").first();
  57. $iframe.attr("src", url);
  58. }
  59. });
  60. }
  61. });
  62. let initComments = [ ...document.querySelectorAll(".post_cont") ];
  63. initComments.forEach(c => {
  64. c.innerHTML = createMagnetLink(c.innerHTML);
  65. });
  66. if (typeof pageWindow.loadComment === "function") {
  67. const originalLoadComment = pageWindow.loadComment;
  68. pageWindow.loadComment = function() {
  69. var data = pageWindow["comm" + arguments[0]];
  70. for (var key in data) {
  71. data[key].c = createMagnetLink(data[key].c);
  72. }
  73. originalLoadComment.apply(this, arguments);
  74. };
  75. }
  76. });
  77. if (document.readyState === "complete") {
  78. jump18();
  79. } else {
  80. window.addEventListener("load", jump18);
  81. }
  82. function jump18() {
  83. if (document.body.innerHTML.includes(`__ 滿 18 歲, \n請按此 __`)) {
  84. location.href = location.origin + "/index.php";
  85. }
  86. }
  87. function handleLinkClick(event) {
  88. const target = event.target;
  89. if (target.tagName === "A" && target.href) {
  90. let url = target.href;
  91. if (/^https:\/\/2023\.redircdn\.com\/\?http/.test(url)) {
  92. url = url.split("https://2023.redircdn.com/?")[1].replace(/______/g, ".").replace(/&z$/, "");
  93. event.preventDefault();
  94. window.open(url);
  95. }
  96. }
  97. }
  98. function createMagnetLink(str) {
  99. try {
  100. str = decodeURIComponent(str);
  101. str = decodeHtmlEntities(str);
  102. } catch (e) {
  103. console.log("createMagnetLink: format str error");
  104. }
  105. const magnetRegex = /(?<!<[^>]*|http\S*)(?:magnet:\?xt=urn:btih:)?([A-Z2-7]{32}|[a-fA-F0-9]{40})(?:&dn=([^&\s]+))?(?:&tr=([^&\s]+))?/gi;
  106. function replaceFunc(match, hash, dn, tr) {
  107. const magnetPrefix = "magnet:?xt=urn:btih:";
  108. const decodedDn = dn ? `磁力链接-${decodeURIComponent(dn)}` : `磁力链接-${hash}`;
  109. const trParam = tr ? `&tr=${encodeURIComponent(tr)}` : "";
  110. let href = match.startsWith(magnetPrefix) ? match : `${magnetPrefix}${hash}${dn ? `&dn=${encodeURIComponent(dn)}` : ""}${trParam}`;
  111. href = href.replace(/\s+/g, "");
  112. return `<a href="${href}">${decodedDn}</a>&nbsp;|&nbsp;<a style="cursor: pointer;" onclick="t66ycopy('${href}')">复制</a>`;
  113. }
  114. return str.replace(magnetRegex, replaceFunc);
  115. }
  116. function decodeHtmlEntities(str) {
  117. return str.replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&nbsp;/g, " ").replace(/&iexcl;/g, "¡").replace(/&cent;/g, "¢").replace(/&pound;/g, "£").replace(/&curren;/g, "¤").replace(/&yen;/g, "¥").replace(/&brvbar;/g, "¦").replace(/&sect;/g, "§").replace(/&uml;/g, "¨").replace(/&copy;/g, "©").replace(/&ordf;/g, "ª").replace(/&laquo;/g, "«").replace(/&not;/g, "¬").replace(/&shy;/g, "­").replace(/&reg;/g, "®").replace(/&macr;/g, "¯").replace(/&deg;/g, "°").replace(/&plusmn;/g, "±").replace(/&sup2;/g, "²").replace(/&sup3;/g, "³").replace(/&acute;/g, "´").replace(/&micro;/g, "µ").replace(/&para;/g, "¶").replace(/&middot;/g, "·").replace(/&cedil;/g, "¸").replace(/&sup1;/g, "¹").replace(/&ordm;/g, "º").replace(/&raquo;/g, "»").replace(/&frac14;/g, "¼").replace(/&frac12;/g, "½").replace(/&frac34;/g, "¾").replace(/&iquest;/g, "¿").replace(/&amp;/g, "&");
  118. }
  119. pageWindow.t66ycopy = function(str) {
  120. GM_setClipboard(str);
  121. Message({
  122. msg: "复制成功",
  123. duration: 666
  124. });
  125. };
  126. function Message({
  127. msg,
  128. duration = 1024
  129. } = {}) {
  130. const messageElement = document.createElement("div");
  131. messageElement.textContent = msg;
  132. messageElement.style.position = "fixed";
  133. messageElement.style.top = "66px";
  134. messageElement.style.left = "50%";
  135. messageElement.style.transform = "translate(-50%, -50%)";
  136. messageElement.style.backgroundColor = "#10b018";
  137. messageElement.style.color = "#f7c500";
  138. messageElement.style.fontSize = "3rem";
  139. messageElement.style.padding = "20px";
  140. messageElement.style.boxShadow = "0 4px 8px rgba(0,0,0,0.1)";
  141. messageElement.style.borderRadius = "10px";
  142. messageElement.style.zIndex = "1000";
  143. messageElement.style.transition = "opacity 0.5s, transform 0.5s";
  144. messageElement.style.opacity = "0";
  145. document.body.appendChild(messageElement);
  146. setTimeout(() => {
  147. messageElement.style.opacity = "1";
  148. messageElement.style.transform = "translate(-50%, -50%) scale(1)";
  149. }, 10);
  150. setTimeout(() => {
  151. messageElement.style.opacity = "0";
  152. messageElement.style.transform = "translate(-50%, -50%) scale(0.9)";
  153. setTimeout(() => {
  154. document.body.removeChild(messageElement);
  155. }, 500);
  156. }, duration);
  157. }
  158. let style = document.createElement("style");
  159. document.head.appendChild(style);
  160. style.sheet.insertRule(`.bad_bg { background-image: url("${BAD_IMG_SVG}") !important; }`, 0);
  161. })();