吾爱破解论坛增强 - 自动签到、翻页

自动签到、自动无缝翻页(全站)

目前为 2020-12-24 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name 吾爱破解论坛增强 - 自动签到、翻页
  3. // @version 1.1.8
  4. // @author X.I.U
  5. // @description 自动签到、自动无缝翻页(全站)
  6. // @match *://www.52pojie.cn/*
  7. // @icon https://www.52pojie.cn/favicon.ico
  8. // @grant GM_xmlhttpRequest
  9. // @grant GM_registerMenuCommand
  10. // @grant GM_unregisterMenuCommand
  11. // @grant GM_openInTab
  12. // @grant GM_getValue
  13. // @grant GM_setValue
  14. // @grant GM_notification
  15. // @license GPL-3.0 License
  16. // @run-at document-end
  17. // @namespace https://gf.qytechs.cn/scripts/412680
  18. // ==/UserScript==
  19.  
  20. (function() {
  21. var menu_thread_pageLoading = GM_getValue('xiu2_menu_thread_pageLoading'),
  22. menu_delateReward = GM_getValue('xiu2_menu_delateReward');
  23. var menu_feedBack_ID, menu_thread_pageLoading_ID, menu_delateReward_ID;
  24. if (menu_thread_pageLoading == null){menu_thread_pageLoading = false; GM_setValue('xiu2_menu_thread_pageLoading', menu_thread_pageLoading)};
  25. if (menu_delateReward == null){menu_delateReward = false; GM_setValue('xiu2_menu_delateReward', menu_delateReward)};
  26. registerMenuCommand();
  27.  
  28. // 注册(不可用)脚本菜单
  29. function registerMenuCommand() {
  30. var menu_thread_pageLoading_, menu_delateReward_;
  31. if (menu_feedBack_ID){ // 如果反馈菜单ID不是 null,则删除所有脚本菜单
  32. GM_unregisterMenuCommand(menu_thread_pageLoading_ID);
  33. GM_unregisterMenuCommand(menu_delateReward_ID);
  34. GM_unregisterMenuCommand(menu_feedBack_ID);
  35. menu_thread_pageLoading = GM_getValue('xiu2_menu_thread_pageLoading');
  36. menu_delateReward = GM_getValue('xiu2_menu_delateReward');
  37. }
  38.  
  39. if (menu_thread_pageLoading){menu_thread_pageLoading_ = "√";}else{menu_thread_pageLoading_ = "×";}
  40. if (menu_delateReward){menu_delateReward_ = "√";}else{menu_delateReward_ = "×";}
  41.  
  42. menu_thread_pageLoading_ID = GM_registerMenuCommand(`[ ${menu_thread_pageLoading_} ] 帖子内自动翻页`, function(){menu_switch(menu_thread_pageLoading,'xiu2_menu_thread_pageLoading','帖子内自动翻页')});
  43. menu_delateReward_ID = GM_registerMenuCommand(`[ ${menu_delateReward_} ] 屏蔽悬赏贴(导读 - 最新发表)`, function(){menu_switch(menu_delateReward,'xiu2_menu_delateReward','帖子内自动翻页')});
  44. menu_feedBack_ID = GM_registerMenuCommand('反馈 & 建议', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});});
  45. }
  46.  
  47. // 菜单开关
  48. function menu_switch(menu_status, Name, Tips) {
  49. if (menu_status){
  50. GM_setValue(`${Name}`, false);
  51. GM_notification(`已关闭 [${Tips}] 功能\n(刷新网页后生效)`, '吾爱破解论坛增强');
  52. }else{
  53. GM_setValue(`${Name}`, true);
  54. GM_notification(`已开启 [${Tips}] 功能\n(刷新网页后生效)`, '吾爱破解论坛增强');
  55. }
  56. registerMenuCommand(); // 重新注册(不可用)脚本菜单
  57. };
  58.  
  59. var ShowPager;
  60. showPager();
  61. // 默认 ID 为 0
  62. var curSite = {SiteTypeID: 0};
  63.  
  64. // 自动翻页规则,scrollDelta 数值越大,滚动条触发点越高
  65. let DBSite = {
  66. forum: {
  67. SiteTypeID: 1,
  68. pager: {
  69. scrollDelta: 766
  70. }
  71. },
  72. thread: {
  73. SiteTypeID: 2,
  74. pager: {
  75. nextLink: '//div[@id="pgt"]//a[contains(text(),"下一页")][@href]',
  76. pageElement: 'css;div#postlist > div[id^="post_"]',
  77. HT_insert: ['css;div#postlist', 2],
  78. replaceE: '//div[@class="pg"] | //div[@class="pgbtn"]',
  79. scrollDelta: 766
  80. }
  81. },
  82. guide: {
  83. SiteTypeID: 3,
  84. pager: {
  85. nextLink: '//div[@id="pgt"]//a[contains(text(),"下一页")][@href]',
  86. pageElement: 'css;div#threadlist div.bm_c table > tbody[id^="normalthread_"]',
  87. HT_insert: ['css;div#threadlist div.bm_c table', 2],
  88. replaceE: 'css;div.pg',
  89. scrollDelta: 766
  90. }
  91. },
  92. collection: {
  93. SiteTypeID: 4,
  94. pager: {
  95. nextLink: '//div[@class="pg"]//a[contains(text(),"下一页")][@href]',
  96. pageElement: 'css;div#ct div.bm_c table > tbody',
  97. HT_insert: ['css;div#ct div.bm_c table', 2],
  98. replaceE: 'css;div.pg',
  99. scrollDelta: 899
  100. }
  101. },
  102. search: {
  103. SiteTypeID: 5,
  104. pager: {
  105. nextLink: '//a[@class="nxt"][@href]',
  106. pageElement: 'css;div#threadlist > ul',
  107. HT_insert: ['css;div#threadlist', 2],
  108. replaceE: 'css;div.pg',
  109. scrollDelta: 766
  110. }
  111. }
  112. };
  113.  
  114. // 用于脚本内部判断当前 URL 类型
  115. let SiteType = {
  116. FORUM: DBSite.forum.SiteTypeID, // 各板块帖子列表
  117. THREAD: DBSite.thread.SiteTypeID, // 帖子内
  118. GUIDE: DBSite.guide.SiteTypeID, // 导读帖子列表
  119. COLLECTION: DBSite.collection.SiteTypeID, // 淘贴列表
  120. SEARCH: DBSite.search.SiteTypeID // 搜索结果列表
  121. };
  122.  
  123. // URL 匹配正则表达式
  124. var patt_thread = /\/thread-\d+-\d+\-\d+.html/,
  125. patt_thread_2 = /mod\=viewthread/,
  126. patt_forum = /\/forum-\d+-\d+\.html/,
  127. patt_forum_2 = /mod\=forumdisplay/,
  128. patt_guide = /mod\=guide\&view\=(hot|digest|new|newthread|my|tech|help)/,
  129. patt_guide_newthread = /mod\=guide\&view\=newthread/,
  130. patt_collection = /mod\=collection/
  131.  
  132. // URL 判断
  133. if (patt_thread.test(location.pathname) || patt_thread_2.test(location.search)){
  134. // 帖子内
  135. if(menu_thread_pageLoading)curSite = DBSite.thread;
  136. }else if (patt_forum.test(location.pathname) || patt_forum_2.test(location.search)){
  137. // 各板块帖子列表
  138. curSite = DBSite.forum;
  139. }else if (patt_guide.test(location.search)){
  140. // 导读帖子列表
  141. curSite = DBSite.guide;
  142. delateReward(); // 屏蔽悬赏贴(导读-最新发表)
  143. }else if (patt_collection.test(location.search)){
  144. // 淘贴列表
  145. curSite = DBSite.collection;
  146. }else if(location.pathname === '/search.php'){
  147. // 搜索结果列表
  148. curSite = DBSite.search;
  149. }else if(location.href === "https://www.52pojie.cn/home.php?mod=task&do=draw&id=2"){
  150. qianDaoBack(); // 先看看是不是签到跳转页面,如果是则返回
  151. }
  152. curSite.pageUrl = ""; // 下一页URL
  153.  
  154. qianDao(); // 看看有没有签到
  155. pageLoading(); // 自动翻页
  156.  
  157.  
  158. // 自动翻页
  159. function pageLoading() {
  160. if (curSite.SiteTypeID > 0){
  161. windowScroll(function (direction, e) {
  162. //console.log('1111111')
  163. if (direction === "down") { // 下滑才准备翻页
  164. var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;
  165. let scrollDelta = curSite.pager.scrollDelta;
  166. if (document.documentElement.scrollHeight <= document.documentElement.clientHeight + scrollTop + scrollDelta) {
  167. if (curSite.SiteTypeID === SiteType.FORUM) { // 如果是原创、精品等版块则直接点下一页就行了
  168. var autopbn = document.querySelector('#autopbn');
  169. if (autopbn && autopbn.innerText == "下一页 »"){ // 如果已经在加载中了,就忽略
  170. autopbn.click();
  171. }
  172. }else{
  173. ShowPager.loadMorePage();
  174. }
  175. }
  176. }
  177. });
  178. }
  179. }
  180.  
  181.  
  182. // 自动签到
  183. function qianDao() {
  184. var qiandao = document.querySelector('#um p:last-child a:first-child');
  185. if (qiandao){
  186. if(qiandao.href === "https://www.52pojie.cn/home.php?mod=task&do=apply&id=2")
  187. {
  188. qiandao.click();
  189. }
  190. }
  191. }
  192.  
  193.  
  194. // 签到后立即返回
  195. function qianDaoBack() {
  196. var qiandaoback = document.querySelector('#messagetext p.alert_btnleft a');
  197. if (qiandaoback){
  198. setTimeout(function(){qiandaoback.click()}, 500);
  199. }
  200. }
  201.  
  202.  
  203. // 滚动条事件
  204. function windowScroll(fn1) {
  205. var beforeScrollTop = document.documentElement.scrollTop,
  206. fn = fn1 || function () {};
  207. setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件
  208. window.addEventListener("scroll", function (e) {
  209. var afterScrollTop = document.documentElement.scrollTop,
  210. delta = afterScrollTop - beforeScrollTop;
  211. if (delta == 0) return false;
  212. fn(delta > 0 ? "down" : "up", e);
  213. beforeScrollTop = afterScrollTop;
  214. }, false);
  215. }, 1000)
  216. }
  217.  
  218.  
  219. //屏蔽悬赏贴(导读-最新发表)
  220. function delateReward(){
  221. if(patt_guide_newthread.test(location.search) && menu_delateReward){
  222. var table = document.querySelector("#threadlist > div.bm_c > table"),
  223. tbodys = table.getElementsByTagName('tbody'),
  224. arrs = [];
  225. for (let i=0; i<tbodys.length; i++){
  226. var by_td = tbodys[i].childNodes[1].children[2].children[0].attributes[0].value;
  227. if(by_td=="forum-8-1.html"){
  228. arrs.push(tbodys[i]);
  229. }
  230. }
  231. for (let i=0; i<arrs.length; i++){
  232. arrs[i].parentNode.removeChild(arrs[i]);
  233. }
  234. }
  235. if(document.body.scrollHeight < window.innerHeight) {
  236. // 如果屏蔽悬赏贴后,剩余帖子列表太少会没有滚动条,无法滚动页面触发自动翻页事件,需要手动触发
  237. ShowPager.loadMorePage();
  238. }
  239. }
  240.  
  241.  
  242. // 监听 XMLHttpRequest 事件
  243. function EventXMLHttpRequest() {
  244. var _send = window.XMLHttpRequest.prototype.send
  245. function sendReplacement(data) {
  246. if(this.onreadystatechange) {
  247. this._onreadystatechange = this.onreadystatechange;
  248. }
  249. this.onreadystatechange = onReadyStateChangeReplacement;
  250. return _send.apply(this, arguments);
  251. }
  252. function onReadyStateChangeReplacement() {
  253. if(this._onreadystatechange) {
  254. if (this.readyState==4 && this.status==200)
  255. {
  256. console.log('xxx')
  257. }
  258. }
  259. return this._onreadystatechange.apply(this, arguments);
  260. }
  261. window.XMLHttpRequest.prototype.send = sendReplacement;
  262. }
  263.  
  264. // 自动无缝翻页,修改自 https://gf.qytechs.cn/scripts/14178
  265. function showPager() {
  266. ShowPager = {
  267. getFullHref: function (e) {
  268. if(e == null) return '';
  269. "string" != typeof e && (e = e.getAttribute("href"));
  270. var t = this.getFullHref.a;
  271. return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e, t.href;
  272. },
  273. createDocumentByString: function (e) {
  274. if (e) {
  275. if ("HTML" !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, "application/xhtml+xml");
  276. var t;
  277. try {
  278. t = (new DOMParser).parseFromString(e, "text/html");
  279. } catch (e) {
  280. }
  281. if (t) return t;
  282. if (document.implementation.createHTMLDocument) t = document.implementation.createHTMLDocument("ADocument"); else try {
  283. (t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)),
  284. t.documentElement.appendChild(t.createElement("head")), t.documentElement.appendChild(t.createElement("body"));
  285. } catch (e) {
  286. }
  287. if (t) {
  288. var r = document.createRange();
  289. r.selectNodeContents(document.body);
  290. var n = r.createContextualFragment(e);
  291. t.body.appendChild(n);
  292. for (var a, o = {
  293. TITLE: !0,
  294. META: !0,
  295. LINK: !0,
  296. STYLE: !0,
  297. BASE: !0
  298. }, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a);
  299. return t;
  300. }
  301. } else console.error("没有找到要转成DOM的字符串");
  302. },
  303. loadMorePage: function () {
  304. if (curSite.pager) {
  305. let curPageEle = getElementByXpath(curSite.pager.nextLink);
  306. var url = this.getFullHref(curPageEle);
  307. //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`);
  308. if(url === '') return;
  309. if(curSite.pageUrl === url) return;// 不会重复加载相同的页面
  310. curSite.pageUrl = url;
  311. // 读取下一页的数据
  312. curSite.pager.startFilter && curSite.pager.startFilter();
  313. GM_xmlhttpRequest({
  314. url: url,
  315. method: "GET",
  316. timeout: 5000,
  317. onload: function (response) {
  318. try {
  319. var newBody = ShowPager.createDocumentByString(response.responseText);
  320. let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody);
  321. let toElement = getAllElements(curSite.pager.HT_insert[0])[0];
  322. if (pageElems.length >= 0) {
  323. let addTo = "beforeend";
  324. if (curSite.pager.HT_insert[1] == 1) addTo = "beforebegin";
  325. // 插入新页面元素
  326. pageElems.forEach(function (one) {
  327. toElement.insertAdjacentElement(addTo, one);
  328. });
  329. //删除悬赏贴
  330. delateReward();
  331. // 替换待替换元素
  332. try {
  333. let oriE = getAllElements(curSite.pager.replaceE);
  334. let repE = getAllElements(curSite.pager.replaceE, newBody, newBody);
  335. if (oriE.length === repE.length) {
  336. for (var i = 0; i < oriE.length; i++) {
  337. oriE[i].outerHTML = repE[i].outerHTML;
  338. }
  339. }
  340. } catch (e) {
  341. console.log(e);
  342. }
  343. }
  344. } catch (e) {
  345. console.log(e);
  346. }
  347. }
  348. });
  349. }
  350. },
  351. };
  352. }
  353.  
  354.  
  355. function getElementByXpath(e, t, r) {
  356. r = r || document, t = t || r;
  357. try {
  358. return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  359. } catch (t) {
  360. return void console.error("无效的xpath");
  361. }
  362. }
  363.  
  364.  
  365. function getAllElements(e, t, r, n, o) {
  366. let getAllElementsByXpath = function(e, t, r) {
  367. return r = r || document, t = t || r, r.evaluate(e, t, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  368. }
  369.  
  370. var i, s = [];
  371. if (!e) return s;
  372. if (r = r || document, n = n || window, o = o || void 0, t = t || r, "string" == typeof e) i = 0 === e.search(/^css;/i) ? function getAllElementsByCSS(e, t) {
  373. return (t || document).querySelectorAll(e);
  374. }(e.slice(4), t) : getAllElementsByXpath(e, t, r); else {
  375. if (!(i = e(r, n, o))) return s;
  376. if (i.nodeType) return s[0] = i, s;
  377. }
  378. return function makeArray(e) {
  379. var t, r, n, o = [];
  380. if (e.pop) {
  381. for (t = 0, r = e.length; t < r; t++) (n = e[t]) && (n.nodeType ? o.push(n) : o = o.concat(makeArray(n)));
  382. return a()(o);
  383. }
  384. if (e.item) {
  385. for (t = e.length; t;) o[--t] = e[t];
  386. return o;
  387. }
  388. if (e.iterateNext) {
  389. for (t = e.snapshotLength; t;) o[--t] = e.snapshotItem(t);
  390. return o;
  391. }
  392. }(i);
  393. }
  394. })();

QingJ © 2025

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