熱門作品 - pixiv.net

2021/12/25 下午3:47:33

  1. // ==UserScript==
  2. // @name 熱門作品 - pixiv.net
  3. // @namespace Violentmonkey Scripts
  4. // @match http*://www.pixiv.net/*
  5. // @grant none
  6. // @version 2.1
  7. // @author HYTeddy
  8. // @license MIT
  9. // @run-at document-start
  10. // @description 2021/12/25 下午3:47:33
  11. // ==/UserScript==
  12.  
  13. //https://github.com/teddy92729/teddy92729.github.io/blob/main/tool.js
  14. let after = (ms, ...args) => {
  15. return new Promise((r) => {
  16. setTimeout(() => r(...args), ms);
  17. });
  18. }
  19. let afterFrame = (...args) => {
  20. return new Promise((r) => {
  21. requestAnimationFrame(() => r(...args));
  22. });
  23. }
  24. let afterIdle = (...args) => {
  25. return new Promise((r) => {
  26. requestIdleCallback(() => r(...args));
  27. });
  28. }
  29. //--------------------
  30. let elementCreated = (selector, timeout = -1) => {
  31. return new Promise((resolve, reject) => {
  32. let element = document.querySelector(selector);
  33. if (element) {
  34. resolve(element);
  35. return;
  36. }
  37. let observer = new MutationObserver((mutations) => {
  38. element = document.querySelector(selector);
  39. if (element) {
  40. observer.disconnect();
  41. resolve(element);
  42. }
  43. });
  44. observer.observe(document.documentElement, { childList: true, subtree: true });
  45. if (timeout >= 0) after(timeout).then(reject);
  46. });
  47. }
  48. let elementRemoved = (element, timeout = -1) => {
  49. return new Promise((resolve, reject) => {
  50. if (!element || !(element instanceof HTMLElement)) {
  51. resolve();
  52. return;
  53. }
  54. let observer = new MutationObserver((mutations) => {
  55. mutations.forEach((mutation) => {
  56. if (Array.from(mutation.removedNodes).includes(element))
  57. resolve();
  58. });
  59. });
  60. observer.observe(element.parentNode, { childList: true });
  61. if (timeout >= 0) after(timeout).then(reject);
  62.  
  63. });
  64. }
  65. let waitVideoLoaded = (videoElement, timeout = -1) => {
  66. return new Promise((resolve, reject) => {
  67. if (!(videoElement instanceof HTMLVideoElement)) return reject("invalid videoElement");
  68. if (videoElement.readyState > 0) return resolve(videoElement);
  69. videoElement.addEventListener("loadedmetadata", () => resolve(videoElement), { once: true });
  70. if (timeout >= 0) after(timeout).then(reject);
  71. });
  72. }
  73. //--------------------
  74. (() => {
  75. const pushStateEvent = new Event("pushState");
  76. const pushStateFunc = window.history.pushState;
  77. window.history.pushState = (...args) => {
  78. console.info("pushState");
  79. window.dispatchEvent(pushStateEvent);
  80. return pushStateFunc.apply(window.history, args);
  81. }
  82. })();
  83. //--------------------
  84. let addCss = (cssString) => {
  85. return new Promise((r) => {
  86. let css = document.createElement("style");
  87. css.innerText = cssString;
  88. document.head.appendChild(css);
  89. r(css);
  90. });
  91. }
  92. let addCssDisplayNone = (...selector) => {
  93. return addCss(`
  94. ${selector.join(", ")} {
  95. display: none !important;
  96. }
  97. `);
  98. }
  99. let addCssDisplayNoneAlt = (...selector) => {
  100. return addCss(`
  101. ${selector.join(", ")} {
  102. display: block !important;
  103. visibility: hidden !important;
  104. width: 0px !important;
  105. height: 0px !important;
  106. overflow: hidden !important;
  107. }
  108. `);
  109. }
  110.  
  111. console.log("tool.js loaded");
  112. //main
  113. addCssDisplayNone(
  114. "section div > a[href^=\"/premium/lead/lp/\"]", // 阻擋premium超連結
  115. "section div:has(a[href^=\"/premium/lead/lp/\"]) > aside > iframe",
  116. "section div:has(a[href^=\"/premium/lead/lp/\"]) > aside > div", // 阻擋premium廣告文字
  117. "section div:has(a[href^=\"/premium/lead/lp/\"]) > aside > button" // 阻擋premium廣告按鈕
  118. );
  119. addCss(`
  120. section div:has(a[href^=\"/premium/lead/lp/\"]) > aside > ul {
  121. mask: unset;
  122. overflow-x: overlay;
  123.  
  124. &::-webkit-scrollbar {
  125. height: 10px;
  126. }
  127. &::-webkit-scrollbar-track {
  128. background: #f1f1f1;
  129. margin-top: 20px;
  130. }
  131. &::-webkit-scrollbar-thumb {
  132. background: #888;
  133. }
  134. &::-webkit-scrollbar-thumb:hover {
  135. background: #555;
  136. }
  137. }
  138. `);// 移除熱門作品的漸變遮罩,並加上滾動條
  139.  
  140. let main = (e) => {
  141. // 檢查網站位置
  142. if (/tags\/\S*/.test(window.location.pathname)) {
  143. let tags = window.location.pathname.split('/')[2];//取得tags
  144. console.log(tags);
  145.  
  146. elementCreated("section div:has(a[href^=\"/premium/lead/lp/\"]) > aside:has(img)") // 等待熱門作品元素生成
  147. .then((aside) => {
  148. let ul = aside.querySelector("ul");
  149. let template_li = ul.children[0].cloneNode(true);//取得第一個熱門作品元素作為模板
  150. console.log("found ", ul);
  151. // 依模板生成新的熱門作品元素
  152. let createNewLi = (userId, artworksId, alt, title, src) => {
  153. let clone_li = template_li.cloneNode(true);
  154. let clone_a = clone_li.querySelector("a");
  155. let clone_img = clone_li.querySelector("img");
  156. clone_a.dataset.gtmUserId = userId;
  157. clone_a.dataset.gtmValue = artworksId;
  158. clone_a.href = "/artworks/" + artworksId;
  159. clone_img.alt = alt;
  160. clone_img.title = title;
  161. clone_img.src = src;
  162. return clone_li;
  163. }
  164. return fetch(`https://www.pixiv.net/ajax/search/artworks/${tags}`).then(res => res.json()).then((data) => {
  165. // 取得熱門作品資料
  166. let popular = data["body"]["popular"];
  167. // 將recent和permanent合併
  168. popular = [].concat(popular["recent"], popular["permanent"]);
  169.  
  170. ul.innerHTML = ""; // clear all li
  171. for (let v of popular) {
  172. let li = createNewLi(v.userId, v.id, v.alt, v.title, v.url);//生成熱門作品元素
  173. ul.appendChild(li);
  174. }
  175. });
  176. }).then(() => {
  177. console.log("成功執行");
  178. }).catch((e) => {
  179. console.error(e);
  180. afterIdle().then(main);//重新執行
  181. });
  182. }
  183. }
  184.  
  185. window.addEventListener("pushState", () => afterIdle().then(main));//pixiv跳轉
  186. afterIdle().then(main);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址