fc2 show all products

show full list of products in 1 page and sort by id / show full title

Від 28.12.2020. Дивіться остання версія.

  1. // ==UserScript==
  2. // @name fc2 show all products
  3. // @namespace https://github.com/x94fujo6rpg/SomeTampermonkeyScripts
  4. // @version 0.1
  5. // @description show full list of products in 1 page and sort by id / show full title
  6. // @author x94fujo6
  7. // @match https://adult.contents.fc2.com/*
  8. // @grant none
  9. // ==/UserScript==
  10. /* jshint esversion: 9 */
  11.  
  12. (function () {
  13. 'use strict';
  14. let msgid = "fc2_script_message";
  15.  
  16. window.document.body.onload = () => {
  17. setReload();
  18. checkLink();
  19. };
  20.  
  21. function setReload() {
  22. let menu = document.querySelector("[data-menulist]");
  23. if (menu) {
  24. let links = menu.querySelectorAll("a");
  25. links.forEach(a => {
  26. if (a.getAttribute("reload")) return;
  27. a.onclick = (event) => {
  28. document.location.href = a.href;
  29. event.preventDefault();
  30. };
  31. a.setAttribute("reload", true);
  32. });
  33. }
  34. }
  35.  
  36. function checkLink() {
  37. let link = document.location.href;
  38. //console.log(`link: ${link}`);
  39. if (link.match(/users\/[^\/]+\/articles\?sort=date&order=desc/)) {
  40. let regtest = link.match(/page=(\d+)/);
  41. let page = regtest ? regtest[1] : false;
  42. if (regtest) page = (page == 1) ? true : false;
  43. if (!regtest || page) {
  44. console.log(`script start, link: ${link}`);
  45. sortList();
  46. }
  47. }
  48. }
  49.  
  50. function getAllProduct() {
  51. let total = document.querySelector(".seller_user_articles_pageHeaderCount").textContent.match(/\((\d*)\)/)[1];
  52. total = parseInt(total, 10);
  53. let max_page = Math.ceil(total / 30);
  54. let user = document.location.href.match(/users\/([^\/]*)\/articles/)[1];
  55. let url = `https://adult.contents.fc2.com/users/${user}/articles?sort=date&order=desc&deal=&page=`;
  56.  
  57. console.log(`max page = ${max_page}, start to retrieve data`);
  58. updateMessage(`max page = ${max_page}, start to retrieve data`);
  59.  
  60. getPage(url, 2);
  61.  
  62. function resort(data, page) {
  63. page++;
  64. let current = getCurrentProduct();
  65. if (!current) return;
  66.  
  67. data = extractProducts(data);
  68. current.push(...data);
  69. current.sort((a, b) => b.id - a.id);
  70.  
  71. let pos = document.querySelector("section.seller_user_articlesList");
  72. [...pos.children].forEach(e => e.remove());
  73.  
  74. current.forEach(p => pos.appendChild(p.ele));
  75.  
  76. data = null;
  77. current = null;
  78.  
  79. if (page <= max_page) {
  80. setTimeout(() => { getPage(url, page); }, 500);
  81. } else {
  82. console.log("done");
  83. updateMessage(`done`);
  84. page = 2;
  85. }
  86.  
  87. function getCurrentProduct() {
  88. let pos = document.querySelector("section.seller_user_articlesList");
  89. if (pos) {
  90. return [...pos.children].map(ele => {
  91. return {
  92. id: ele.querySelector("a").href.match(/id=(\d*)/)[1],
  93. ele: ele.cloneNode(true),
  94. };
  95. });
  96. } else {
  97. return false;
  98. }
  99. }
  100.  
  101. function extractProducts(domtext) {
  102. let parser = new DOMParser();
  103. let new_document = parser.parseFromString(domtext, "text/html");
  104. let pos = new_document.querySelector("section.seller_user_articlesList");
  105. let products = [...pos.children];
  106. let list = products.map(div => processDiv(div));
  107. parser = null; // release memory
  108. new_document = null;
  109. return list;
  110. }
  111. }
  112.  
  113. function getPage(rq_url, page) {
  114. let rq = new XMLHttpRequest();
  115. rq.open("GET", `${rq_url}${page}`);
  116. rq.send(null);
  117. rq.onreadystatechange = function () {
  118. if (rq.readyState == 4 && rq.status == 200) {
  119. console.log(`processing... please wait [page: ${page}, total: ${max_page}]`);
  120. updateMessage(`processing... please wait [page: ${page}, total: ${max_page}]`);
  121. resort(rq.responseText, page);
  122. }
  123. };
  124. }
  125. }
  126.  
  127. function updateMessage(text = "") {
  128. document.getElementById(msgid).textContent = `script: ${text}`;
  129. }
  130.  
  131. function sortList() {
  132. let pos = document.querySelector("section.seller_user_articlesList");
  133. if (pos) {
  134. let products = [...pos.children];
  135. let list = products.map(div => processDiv(div));
  136.  
  137. document.querySelector(".c-pager-101").remove();
  138. list.sort((a, b) => b.id - a.id);
  139.  
  140. products.forEach(e => e.remove());
  141. list.forEach(data => { pos.appendChild(data.ele); });
  142.  
  143. let message = Object.assign(document.createElement("span"), {
  144. id: msgid,
  145. textContent: "script start",
  146. style: `
  147. display: inline-block;
  148. margin: 0.5rem;
  149. color: gold;
  150. `,
  151. });
  152. document.querySelector("div.seller_user_articles_pageHeader").appendChild(message);
  153. getAllProduct();
  154. }
  155. }
  156.  
  157. function processDiv(div) {
  158. let id = div.querySelector("a").href.match(/id=(\d*)/)[1];
  159. let box = div.querySelector(".c-cntCard-110-f_indetail");
  160. let title_ele = div.querySelector(".c-cntCard-110-f_itemName");
  161. let title_span = convertToSpan(title_ele);
  162. let id_span = Object.assign(document.createElement("span"), {
  163. textContent: id,
  164. style: `font-size: 1.5rem;`,
  165. });
  166. box.insertAdjacentElement("afterbegin", title_span);
  167. box.insertAdjacentElement("afterbegin", id_span);
  168. title_ele.remove();
  169.  
  170. div.querySelector("img").setAttribute("loading", "lazy");
  171. div.querySelector(".items_article_SmapleVideo").remove();
  172.  
  173. div.querySelector("span.c-cntCard-110-f_thumb_type").remove();
  174. div.querySelector("button").remove();
  175. div.querySelector("section.c-tooltip-107").remove();
  176.  
  177. //div.querySelector(".detail-layout").remove();
  178. div.querySelector(".c-cntCard-110-f_seller").remove();
  179.  
  180. let all_link = div.querySelectorAll("a");
  181. if (all_link) all_link.forEach(a => { a.target = "_blank"; });
  182. return { id: id, ele: div.cloneNode(true) };
  183.  
  184. function convertToSpan(ele) {
  185. return Object.assign(document.createElement("span"), {
  186. textContent: ele.textContent,
  187. className: ele.className,
  188. style: `
  189. overflow: visible;
  190. display: inline-block;
  191. width: auto;
  192. `,
  193. });
  194. }
  195. }
  196. })();