自动无缝翻页

自动无缝翻页,目前支持:所有「Discuz!、Flarum」论坛、豆瓣、微博、千图网、3DM、游侠网、游民星空、423Down、Apphot、不死鸟、亿破姐、小众软件、微当下载、落尘之木、异次元软件、老殁殁漂遥、异星软件空间、RARBG、PubMed、AfreecaTV、AlphaCoders、FitGirl Repacks...

当前为 2021-08-05 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name 自动无缝翻页
  3. // @version 1.4.2
  4. // @author X.I.U
  5. // @description 自动无缝翻页,目前支持:所有「Discuz!、Flarum」论坛、豆瓣、微博、千图网、3DM、游侠网、游民星空、423Down、Apphot、不死鸟、亿破姐、小众软件、微当下载、落尘之木、异次元软件、老殁殁漂遥、异星软件空间、RARBG、PubMed、AfreecaTV、AlphaCoders、FitGirl Repacks...
  6. // @match *://*/*
  7. // @connect www.gamersky.com
  8. // @icon https://i.loli.net/2021/03/07/rdijeYm83pznxWq.png
  9. // @grant GM_xmlhttpRequest
  10. // @grant GM_registerMenuCommand
  11. // @grant GM_openInTab
  12. // @grant GM_getValue
  13. // @grant GM_setValue
  14. // @license GPL-3.0 License
  15. // @run-at document-end
  16. // @namespace https://github.com/XIU2/UserScript
  17. // @supportURL https://github.com/XIU2/UserScript
  18. // @homepageURL https://github.com/XIU2/UserScript
  19. // ==/UserScript==
  20.  
  21. (function() {
  22. 'use strict';
  23. var webType, curSite = {SiteTypeID: 0};
  24. // 目前支持的网站
  25. const websiteList = ['movie.douban.com', 'weibo.com', 'www.58pic.com',
  26. 'www.3dmgame.com', 'www.ali213.net', 'gl.ali213.net', 'www.gamersky.com',
  27. 'www.423down.com', 'apphot.cc', 'iao.su', 'www.ypojie.com', 'www.appinn.com', 'www.weidown.com', 'www.luochenzhimu.com', 'www.iplaysoft.com', 'www.mpyit.com', 'www.yxssp.com',
  28. 'rarbgprx.org',
  29. 'pubmed.ncbi.nlm.nih.gov',
  30. 'www.afreecatv.com',
  31. 'art.alphacoders.com', 'wall.alphacoders.com', 'avatars.alphacoders.com', 'mobile.alphacoders.com',
  32. 'fitgirl-repacks.site'];
  33.  
  34. if (GM_getValue('menu_disable') == null){GM_setValue('menu_disable', [])};
  35. if (GM_getValue('menu_discuz_thread_page') == null){GM_setValue('menu_discuz_thread_page', true)};
  36. // 注册(不可用)脚本菜单
  37. if (menu_disable('check')) { // 当前网站是否已存在禁用列表中
  38. GM_registerMenuCommand('❎ 已禁用 (点击对当前网站启用)', function(){menu_disable('del')});
  39. return
  40. } else {
  41. if (websiteList.indexOf(location.host) > -1) {
  42. webType = 1 // 其他网站
  43. } else if (document.querySelector('meta[name="author"][content*="Discuz!"], meta[name="generator"][content*="Discuz!"]') || document.getElementById('ft') && document.getElementById('ft').textContent.indexOf('Discuz!') > -1) {
  44. webType = 2 // 所有 Discuz! 论坛
  45. } else if (document.getElementById('flarum-loading')) {
  46. webType = 3 // 所有 Flarum 论坛
  47. } else {
  48. GM_registerMenuCommand('❌ 当前网站暂不支持 [点击申请支持]', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://gf.qytechs.cn/zh-CN/scripts/419215/feedback', {active: true,insert: true,setParent: true});});
  49. return
  50. }
  51. GM_registerMenuCommand('✅ 已启用 (点击对当前网站禁用)', function(){menu_disable('add')});
  52. if (webType === 2) {
  53. GM_registerMenuCommand(`${GM_getValue('menu_discuz_thread_page')?'✅':'❎'} 帖子内自动翻页 (仅 Discuz! 论坛)`, function(){menu_switch(GM_getValue('menu_discuz_thread_page'), 'menu_discuz_thread_page', 'Discuz! 论坛帖子内翻页')});
  54. }
  55. }
  56. GM_registerMenuCommand('💬 反馈 & 欢迎申请支持', function () {window.GM_openInTab('https://github.com/XIU2/UserScript#xiu2userscript', {active: true,insert: true,setParent: true});window.GM_openInTab('https://gf.qytechs.cn/zh-CN/scripts/419215/feedback', {active: true,insert: true,setParent: true});});
  57.  
  58.  
  59. /*
  60. 自动翻页规则
  61. type:
  62. 1 = 脚本实现自动无缝翻页
  63. 2 = 网站自带了自动无缝翻页功能,只需要点击下一页按钮即可
  64. nextText: 按钮文本,只有按钮文本为该文本时才会点击按钮加载下一页,避免一瞬间加载太多次下一页
  65. intervals: 点击间隔时间,对于没有按钮文字变化的按钮,可以手动指定间隔时间,单位:ms
  66. 3 = 依靠元素距离可视区域底部的距离来触发翻页
  67. HT_insert:
  68. 1 = 插入该元素本身的前面;
  69. 2 = 插入该元素当中,第一个子元素前面;
  70. 3 = 插入该元素当中,最后一个子元素后面;
  71. 4 = 插入该元素本身的后面;
  72. scrollDelta:数值越大,滚动条触发点越靠上(越早开始翻页),一般是访问网页速度越慢,该值就需要越大(如果 Type = 3,则相反)
  73. function:
  74. before = 插入前执行函数;
  75. after = 插入后执行函数;
  76. parameter = 参数
  77. */
  78. let DBSite = {
  79. discuz_forum: {
  80. SiteTypeID: 0,
  81. pager: {
  82. type: 2,
  83. nextLink: '#autopbn',
  84. nextText: '下一页 »',
  85. scrollDelta: 1000
  86. }
  87. },
  88. discuz_thread: {
  89. SiteTypeID: 0,
  90. pager: {
  91. type: 1,
  92. nextLink: '//a[@class="nxt"][@href]',
  93. pageElement: 'css;div#postlist > div[id^="post_"]',
  94. HT_insert: ['css;div#postlist', 3],
  95. replaceE: 'css;div.pg',
  96. scrollDelta: 1000
  97. }
  98. },
  99. discuz_search: {
  100. SiteTypeID: 0,
  101. pager: {
  102. type: 1,
  103. nextLink: '//a[@class="nxt"][@href]',
  104. pageElement: 'css;div#threadlist > ul',
  105. HT_insert: ['css;div#threadlist', 3],
  106. replaceE: 'css;div.pg',
  107. scrollDelta: 1000
  108. }
  109. },
  110. discuz_guide: {
  111. SiteTypeID: 0,
  112. pager: {
  113. type: 1,
  114. nextLink: '//a[@class="nxt"][@href]',
  115. pageElement: 'css;div#threadlist div.bm_c table > tbody',
  116. HT_insert: ['css;div#threadlist div.bm_c table', 3],
  117. replaceE: 'css;div.pg',
  118. scrollDelta: 1000
  119. }
  120. },
  121. discuz_youspace: {
  122. SiteTypeID: 0,
  123. pager: {
  124. type: 1,
  125. nextLink: '//a[@class="nxt"][@href]',
  126. pageElement: 'css;tbody > tr:not(.th)',
  127. HT_insert: ['css;tbody', 3],
  128. replaceE: 'css;div.pg',
  129. scrollDelta: 1000
  130. }
  131. },
  132. discuz_collection: {
  133. SiteTypeID: 0,
  134. pager: {
  135. type: 1,
  136. nextLink: '//a[@class="nxt"][@href]',
  137. pageElement: 'css;div#ct div.bm_c table > tbody',
  138. HT_insert: ['css;div#ct div.bm_c table', 3],
  139. replaceE: 'css;div.pg',
  140. scrollDelta: 1000
  141. }
  142. },
  143. flarum: {
  144. SiteTypeID: 0,
  145. pager: {
  146. type: 2,
  147. nextLink: '.DiscussionList-loadMore > button[title]',
  148. scrollDelta: 1000
  149. }
  150. },
  151. douban_subject_comments: {
  152. SiteTypeID: 0,
  153. pager: {
  154. type: 1,
  155. nextLink: '//a[@class="next"][@href]',
  156. pageElement: 'css;#comments > .comment-item',
  157. HT_insert: ['css;#paginator', 1],
  158. replaceE: 'css;#paginator',
  159. scrollDelta: 1000
  160. }
  161. },
  162. douban_subject_reviews: {
  163. SiteTypeID: 0,
  164. pager: {
  165. type: 1,
  166. nextLink: '//link[@rel="next"][@href]',
  167. pageElement: 'css;.review-list > div',
  168. HT_insert: ['css;.review-list', 3],
  169. replaceE: 'css;.paginator',
  170. scrollDelta: 1000
  171. }
  172. },
  173. douban_subject_episode: {
  174. SiteTypeID: 0,
  175. pager: {
  176. type: 1,
  177. nextLink: '//link[@rel="next"][@href]',
  178. pageElement: 'css;#comments > div',
  179. HT_insert: ['css;#comments', 3],
  180. replaceE: 'css;.paginator',
  181. scrollDelta: 1000
  182. }
  183. },
  184. weibo_comment: {
  185. SiteTypeID: 0,
  186. pager: {
  187. type: 2,
  188. nextLink: 'a[action-type="click_more_comment"]',
  189. nextText: '查看更多c',
  190. scrollDelta: 1000
  191. }
  192. },
  193. _58pic: {
  194. SiteTypeID: 0,
  195. pager: {
  196. type: 1,
  197. nextLink: '//div[contains(@class,"page-box")]//a[text()="下一页"][@href]',
  198. pageElement: 'css;.pic-box > .qtw-card',
  199. HT_insert: ['css;.pic-box', 3],
  200. replaceE: 'css;.page-box',
  201. scrollDelta: 2000
  202. },
  203. function: {
  204. before: _58pic_beforeFunction
  205. }
  206. },
  207. _58pic_c: {
  208. SiteTypeID: 0,
  209. pager: {
  210. type: 1,
  211. nextLink: '//div[contains(@class,"page-box")]//a[text()="下一页"][@href]',
  212. pageElement: 'css;.list-box > .qtw-card',
  213. HT_insert: ['css;.list-box', 3],
  214. replaceE: 'css;.page-box',
  215. scrollDelta: 4000
  216. },
  217. function: {
  218. before: _58pic_beforeFunction
  219. }
  220. },
  221. _3dmgame: {
  222. SiteTypeID: 0,
  223. pager: {
  224. type: 3,
  225. nextLink: '//li[@class="next"]/a[@href]',
  226. pageElement: 'css;.news_warp_center > *',
  227. HT_insert: ['css;.news_warp_center', 3],
  228. replaceE: 'css;.pagewrap',
  229. scrollElement: '.pagewrap',
  230. scrollDelta: 400
  231. }
  232. },
  233. ali213_www: {
  234. SiteTypeID: 0,
  235. pager: {
  236. type: 3,
  237. nextLink: '//a[@id="after_this_page"][@href]',
  238. pageElement: 'css;#Content >*:not(.news_ding):not(.page_fenye)',
  239. HT_insert: ['css;.page_fenye', 1],
  240. replaceE: 'css;.page_fenye',
  241. scrollElement: '.page_fenye',
  242. scrollDelta: 400
  243. }
  244. },
  245. ali213_gl: {
  246. SiteTypeID: 0,
  247. pager: {
  248. type: 3,
  249. nextLink: '//a[@class="next n"][@href]',
  250. pageElement: 'css;.c-detail >*',
  251. HT_insert: ['css;.c-detail', 3],
  252. replaceE: 'css;.page_fenye',
  253. scrollElement: '.page_fenye',
  254. scrollDelta: 400
  255. }
  256. },
  257. gamersky_ent: {
  258. SiteTypeID: 0,
  259. pager: {
  260. type: 3,
  261. nextLink: '//div[@class="page_css"]/a[text()="下一页"][@href]',
  262. pageElement: 'css;.Mid2L_con > *:not(.gs_nc_editor):not(.pagecss):not(.page_css):not(.gs_ccs_solve):not(.post_ding)',
  263. HT_insert: ['css;.page_css', 1],
  264. replaceE: 'css;.page_css',
  265. scrollElement: '.page_css',
  266. scrollDelta: 100
  267. }
  268. },
  269. gamersky_gl: {
  270. SiteTypeID: 0,
  271. pager: {
  272. type: 3,
  273. nextLink: '//div[@class="page_css"]/a[text()="下一页"][@href]',
  274. pageElement: 'css;.Mid2L_con > *:not(.gs_nc_editor):not(.pagecss):not(.gs_ccs_solve):not(.post_ding)',
  275. HT_insert: ['css;.gs_nc_editor', 1],
  276. replaceE: 'css;.page_css',
  277. scrollElement: '.pagecss',
  278. scrollDelta: -1000
  279. },
  280. function: {
  281. before: gamersky_gl_beforeFunction
  282. }
  283. },
  284. _423down_postslist: {
  285. SiteTypeID: 0,
  286. pager: {
  287. type: 1,
  288. nextLink: '//div[@class="paging"]//a[contains(text(),"下一页")][@href]',
  289. pageElement: 'css;div.content-wrap ul.excerpt > li',
  290. HT_insert: ['css;div.content-wrap ul.excerpt', 3],
  291. replaceE: 'css;div.paging',
  292. scrollDelta: 1500
  293. }
  294. },
  295. apphot_postslist: {
  296. SiteTypeID: 0,
  297. pager: {
  298. type: 1,
  299. nextLink: '//div[@class="pagination"]//a[contains(text(),"下一页")][@href]',
  300. pageElement: 'css;div.content > article.excerpt',
  301. HT_insert: ['css;div.pagination', 1],
  302. replaceE: 'css;div.pagination',
  303. scrollDelta: 1500
  304. }
  305. },
  306. iao_su_postslist: {
  307. SiteTypeID: 0,
  308. pager: {
  309. type: 1,
  310. nextLink: '//li[@class="btn btn-primary next"]//a[@href]',
  311. pageElement: 'css;#index > article, #archive > article',
  312. HT_insert: ['css;ol.page-navigator', 1],
  313. replaceE: 'css;ol.page-navigator',
  314. scrollDelta: 800
  315. },
  316. function: {
  317. before: iao_su_postslist_beforeFunction
  318. }
  319. },
  320. appinn_postslist: {
  321. SiteTypeID: 0,
  322. pager: {
  323. type: 1,
  324. nextLink: '//a[@class="next page-numbers"][@href]',
  325. pageElement: 'css;section#latest-posts > article',
  326. HT_insert: ['css;nav.navigation.pagination', 1],
  327. replaceE: 'css;div.nav-links',
  328. scrollDelta: 1500
  329. }
  330. },
  331. weidown: {
  332. SiteTypeID: 0,
  333. pager: {
  334. type: 1,
  335. nextLink: '//a[@class="nextpage"][@href]',
  336. pageElement: 'css;.articleWrapper > .itemArticle, .articleWrapper > .richTextItem.search',
  337. HT_insert: ['css;.articleWrapper', 3],
  338. replaceE: 'css;#pageGroup',
  339. scrollDelta: 1500
  340. }
  341. },
  342. weidown_search: {
  343. SiteTypeID: 0,
  344. pager: {
  345. type: 1,
  346. nextLink: '//a[@class="nextpage"][@href]',
  347. pageElement: 'css;.articleListWrapper > .richTextItem.search',
  348. HT_insert: ['css;#pageGroup', 1],
  349. replaceE: 'css;#pageGroup',
  350. scrollDelta: 700
  351. }
  352. },
  353. weidown_special: {
  354. SiteTypeID: 0,
  355. pager: {
  356. type: 1,
  357. nextLink: '//a[@class="nextpage"][@href]',
  358. pageElement: 'css;.special > .item',
  359. HT_insert: ['css;.special', 3],
  360. replaceE: 'css;#pageGroup',
  361. scrollDelta: 700
  362. }
  363. },
  364. luochenzhimu: {
  365. SiteTypeID: 0,
  366. pager: {
  367. type: 1,
  368. nextLink: '//li[@class="next-page"]/a[@href]',
  369. pageElement: 'css;.content > article',
  370. HT_insert: ['css;.content > .pagination', 1],
  371. replaceE: 'css;.content > .pagination',
  372. scrollDelta: 1000
  373. },
  374. function: {
  375. before: luochenzhimu_beforeFunction
  376. }
  377. },
  378. iplaysoft_postslist: {
  379. SiteTypeID: 0,
  380. pager: {
  381. type: 1,
  382. nextLink: '//div[@class="pagenavi"]//a[@title="下一页"][@href]',
  383. pageElement: 'css;#postlist > div.entry',
  384. HT_insert: ['css;#postlist > .pagenavi-button', 1],
  385. replaceE: 'css;.pagenavi-button, .pagenavi',
  386. scrollDelta: 1200
  387. },
  388. function: {
  389. before: iplaysoft_postslist_beforeFunction
  390. }
  391. },
  392. iplaysoft_postcomments: {
  393. SiteTypeID: 0,
  394. pager: {
  395. type: 2,
  396. nextLink: '#loadHistoryComments',
  397. nextText: '展开后面',
  398. scrollDelta: 1200
  399. }
  400. },
  401. mpyit: {
  402. SiteTypeID: 0,
  403. pager: {
  404. type: 1,
  405. nextLink: '//a[@class="page-numbers"][@title="下一页"][@href]',
  406. pageElement: 'css;#post > div[id^="post-"]',
  407. HT_insert: ['css;#post > #pagenavi', 1],
  408. replaceE: 'css;#post > #pagenavi',
  409. scrollDelta: 1700
  410. }
  411. },
  412. mpyit_category: {
  413. SiteTypeID: 0,
  414. pager: {
  415. type: 1,
  416. nextLink: '//a[@class="page-numbers"][@title="下一页"][@href]',
  417. pageElement: 'css;#content > div[class^="entry_box"]',
  418. HT_insert: ['css;#content > #pagenavi', 1],
  419. replaceE: 'css;#content > #pagenavi',
  420. scrollDelta: 1700
  421. }
  422. },
  423. yxssp: {
  424. SiteTypeID: 0,
  425. pager: {
  426. type: 1,
  427. nextLink: '//div[@class="page-nav td-pb-padding-side"]/a[last()][@href]',
  428. pageElement: 'css;.td-modules-container.td-module-number4 > div',
  429. HT_insert: ['css;.td-modules-container.td-module-number4', 3],
  430. replaceE: 'css;.page-nav.td-pb-padding-side',
  431. scrollDelta: 1000
  432. }
  433. },
  434. rarbgprx: {
  435. SiteTypeID: 0,
  436. pager: {
  437. type: 1,
  438. nextLink: '(//a[@title="next page"])[1][@href]',
  439. pageElement: 'css;table.lista2t tr.lista2',
  440. HT_insert: ['css;table.lista2t > tbody', 3],
  441. replaceE: 'css;#pager_links',
  442. scrollDelta: 900
  443. }
  444. },
  445. pubmed_postslist: {
  446. SiteTypeID: 0,
  447. pager: {
  448. type: 2,
  449. nextLink: 'button.load-button.next-page',
  450. nextText: 'Show more',
  451. scrollDelta: 1500
  452. }
  453. },
  454. afreecatv: {
  455. SiteTypeID: 0,
  456. pager: {
  457. type: 2,
  458. nextLink: '.btn-more > button',
  459. intervals: 2000,
  460. scrollDelta: 1000
  461. }
  462. },
  463. alphacoders_art: {
  464. SiteTypeID: 0,
  465. pager: {
  466. type: 1,
  467. nextLink: '//a[@id="next_page"][@href]',
  468. pageElement: 'css;.container-masonry > div',
  469. HT_insert: ['css;.container-masonry', 3],
  470. replaceE: '//div[@class="hidden-xs hidden-sm"]/..',
  471. scrollDelta: 1000
  472. },
  473. function: {
  474. before: alphacoders_art_beforeFunction
  475. }
  476. },
  477. alphacoders_wall: {
  478. SiteTypeID: 0,
  479. pager: {
  480. type: 1,
  481. nextLink: '//a[@id="next_page"][@href]',
  482. pageElement: 'css;.thumb-container-big, .avatar-thumb, .thumb-element',
  483. HT_insert: ['css;.thumb-container-big:nth-last-child(1), .avatar-thumb:nth-last-child(1), .thumb-element:nth-last-child(1)', 4],
  484. replaceE: '//div[@class="hidden-xs hidden-sm"]/..',
  485. scrollDelta: 1000
  486. }
  487. },
  488. fitgirl: {
  489. SiteTypeID: 0,
  490. pager: {
  491. type: 1,
  492. nextLink: '//a[@class="next page-numbers"][@href]',
  493. pageElement: 'css;article[id^="post-"]',
  494. HT_insert: ['css;nav.navigation.paging-navigation', 1],
  495. replaceE: 'css;nav.navigation.paging-navigation',
  496. scrollDelta: 2000
  497. }
  498. }
  499. };
  500. // 生成 ID
  501. generateID();
  502.  
  503. // 用于脚本判断
  504. const SiteType = {
  505. GAMERSKY_GL: DBSite.gamersky_gl.SiteTypeID
  506. };
  507.  
  508.  
  509. if (webType === 1) { // < 其他网站 >
  510. switch (location.host) {
  511. case 'movie.douban.com':
  512. if (location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/comments') > -1) { // 短评
  513. curSite = DBSite.douban_subject_comments;
  514. } else if (location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/reviews') > -1) { // 影评
  515. curSite = DBSite.douban_subject_reviews;
  516. } else if(location.pathname.indexOf('/subject') > -1 && location.pathname.indexOf('/episode') > -1) { // 电视剧每集评论
  517. curSite = DBSite.douban_subject_episode;
  518. }
  519. break;
  520. case 'weibo.com':
  521. curSite = DBSite.weibo_comment;
  522. break;
  523. case 'www.58pic.com':
  524. if (location.pathname.indexOf('/tupian/') > -1) {
  525. curSite = DBSite._58pic;
  526. } else if (location.pathname.indexOf('/c/') > -1) {
  527. curSite = DBSite._58pic_c;
  528. }
  529. break;
  530. case 'www.3dmgame.com':
  531. curSite = DBSite._3dmgame;
  532. break;
  533. case 'www.ali213.net':
  534. curSite = DBSite.ali213_www;
  535. break;
  536. case 'gl.ali213.net':
  537. curSite = DBSite.ali213_gl;
  538. document.lastElementChild.appendChild(document.createElement('style')).textContent = `.n_show_b {display: none !important;}` // 隐藏部分碍事元素
  539. break;
  540. case 'www.gamersky.com':
  541. if (location.pathname.indexOf('/ent/') > -1) {
  542. curSite = DBSite.gamersky_ent;
  543. } else {
  544. curSite = DBSite.gamersky_gl;
  545. }
  546. break;
  547. case 'www.423down.com':
  548. if (location.pathname.indexOf('.html') === -1) curSite = DBSite._423down_postslist;
  549. break;
  550. case 'apphot.cc':
  551. if (location.pathname.indexOf('.html') === -1) curSite = DBSite.apphot_postslist;
  552. break;
  553. case 'iao.su':
  554. curSite = DBSite.iao_su_postslist;
  555. break;
  556. case 'www.appinn.com':
  557. curSite = DBSite.appinn_postslist;
  558. break;
  559. case 'www.weidown.com':
  560. if (location.pathname.indexOf('/search/') > -1) {
  561. curSite = DBSite.weidown_search;
  562. } else if (location.pathname.indexOf('/special/') > -1) {
  563. curSite = DBSite.weidown_special;
  564. } else {
  565. curSite = DBSite.weidown;
  566. }
  567. break;
  568. case 'www.ypojie.com':
  569. case 'www.luochenzhimu.com':
  570. curSite = DBSite.luochenzhimu;
  571. break;
  572. case 'www.iplaysoft.com':
  573. if (location.pathname.indexOf('.html') > -1 || location.pathname.indexOf('/p/') > -1) { // 文章内
  574. curSite = DBSite.iplaysoft_postcomments;
  575. } else { // 其他页面
  576. curSite = DBSite.iplaysoft_postslist;
  577. }
  578. break;
  579. case 'www.mpyit.com':
  580. if (location.pathname === '/' && !location.search) {
  581. curSite = DBSite.mpyit;
  582. } else if (location.pathname.indexOf('/category/') > -1 || location.search.indexOf('?s=') > -1) {
  583. curSite = DBSite.mpyit_category;
  584. }
  585. break;
  586. case 'www.yxssp.com':
  587. curSite = DBSite.yxssp;
  588. break;
  589. case 'rarbgprx.org':
  590. curSite = DBSite.rarbgprx;
  591. break;
  592. case 'pubmed.ncbi.nlm.nih.gov':
  593. curSite = DBSite.pubmed_postslist;
  594. break;
  595.  
  596. case 'www.afreecatv.com':
  597. curSite = DBSite.afreecatv;
  598. break;
  599. case 'art.alphacoders.com':
  600. curSite = DBSite.alphacoders_art;
  601. setTimeout(alphacoders_art_beforeFunction_0, 1000);
  602. break;
  603. case 'wall.alphacoders.com':
  604. case 'avatars.alphacoders.com':
  605. case 'mobile.alphacoders.com':
  606. curSite = DBSite.alphacoders_wall;
  607. break;
  608. case 'fitgirl-repacks.site':
  609. curSite = DBSite.fitgirl;
  610. break;
  611. }
  612. } else if (webType === 2) { // < 所有 Discuz!论坛 >
  613. if (location.pathname.indexOf('.html') > -1) { // 判断是不是静态网页(.html 结尾)
  614. if (location.pathname.indexOf('forum') > -1) { // 各版块帖子列表
  615. if (document.getElementById('autopbn')) { // 判断是否有 [下一页] 按钮
  616. curSite = DBSite.discuz_forum;
  617. } else {
  618. curSite = DBSite.discuz_guide;
  619. }
  620. } else if (location.pathname.indexOf('thread') > -1) { // 帖子内
  621. if (GM_getValue('menu_discuz_thread_page')) {
  622. curSite = DBSite.discuz_thread;
  623. hidePgbtn(); // 隐藏帖子内的 [下一页] 按钮
  624. }
  625. }else if(location.pathname.indexOf('search') > -1) { // 搜索结果
  626. curSite = DBSite.discuz_search;
  627. }
  628. } else {
  629. if (location.search.indexOf('mod=forumdisplay') > -1) { // 各版块帖子列表
  630. if (document.getElementById('autopbn')) { // 判断是否有 [下一页] 按钮
  631. curSite = DBSite.discuz_forum;
  632. } else {
  633. curSite = DBSite.discuz_guide;
  634. }
  635. } else if (location.search.indexOf('mod=viewthread') > -1) { // 帖子内
  636. if (GM_getValue('menu_discuz_thread_page')) {
  637. curSite = DBSite.discuz_thread;
  638. hidePgbtn(); // 隐藏帖子内的 [下一页] 按钮
  639. }
  640. } else if (location.search.indexOf('mod=guide') > -1) { // 导读帖子列表
  641. curSite = DBSite.discuz_guide;
  642. } else if(location.search.indexOf('mod=space') > -1 && location.search.indexOf('&view=me') > -1) { // 别人的主题/回复
  643. curSite = DBSite.discuz_youspace;
  644. } else if (location.search.indexOf('mod=collection') > -1) { // 淘贴列表
  645. curSite = DBSite.discuz_collection;
  646. } else if (location.pathname.indexOf('search') > -1) { // 搜索结果
  647. curSite = DBSite.discuz_search;
  648. } else { // 考虑到部分论坛的部分板块帖子列表 URL 是自定义的
  649. curSite = DBSite.discuz_forum;
  650. }
  651. }
  652. } else if (webType === 3) { // < 所有 Flarum 论坛 >
  653. curSite = DBSite.flarum;
  654. }
  655.  
  656.  
  657. curSite.pageUrl = ''; // 下一页URL
  658. pageLoading(); // 自动无缝翻页
  659.  
  660.  
  661. // 自动无缝翻页
  662. function pageLoading() {
  663. if (curSite.SiteTypeID > 0) {
  664. windowScroll(function (direction, e) {
  665. if (direction === "down") { // 下滑才准备翻页
  666. let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop,
  667. scrollHeight = window.innerHeight || document.documentElement.clientHeight,
  668. scrollDelta = curSite.pager.scrollDelta;
  669. if (curSite.pager.type === 3) { // 翻页类型 3
  670. let scrollElement = document.querySelector(curSite.pager.scrollElement);
  671. //console.log(scrollElement.offsetTop - (scrollTop + scrollHeight), scrollDelta, curSite.SiteTypeID)
  672. if (scrollElement.offsetTop - (scrollTop + scrollHeight) <= scrollDelta) {
  673. if (curSite.SiteTypeID === SiteType.GAMERSKY_GL) curSite.pager.scrollDelta -= 800 // 游民星空 gl 的比较奇葩,需要特殊处理下
  674. ShowPager.loadMorePage();
  675. }
  676. } else {
  677. if (document.documentElement.scrollHeight <= scrollHeight + scrollTop + scrollDelta) {
  678. if (curSite.pager.type === 2) { // 翻页类型 2
  679. if (curSite.SiteTypeID > 0) { // 如果指定了间隔时间,那么就依靠这个判断时间到了没有~
  680. let autopbn = document.querySelector(curSite.pager.nextLink);
  681. if (autopbn) { // 寻找下一页链接
  682. if (!curSite.pager.nextText) { // 如果没有指定 nextText 就直接点击
  683. autopbn.click();
  684. } else if (autopbn.textContent.indexOf(curSite.pager.nextText) > -1){ // 如果指定了 nextText 就需要判断后再点击(避免已经在加载了,还重复点击)
  685. autopbn.click();
  686. }
  687. // 对于没有按钮文字变化的按钮,可以手动指定间隔时间
  688. if (curSite.pager.intervals) {
  689. let _SiteTypeID = curSite.SiteTypeID;
  690. curSite.SiteTypeID = 0;
  691. setTimeout(function(){curSite.SiteTypeID = _SiteTypeID;}, curSite.pager.intervals)
  692. }
  693. }
  694. }
  695. } else { // 翻页类型 1
  696. ShowPager.loadMorePage();
  697. }
  698. }
  699. }
  700. }
  701. });
  702. }
  703. }
  704.  
  705.  
  706. /*function getElementToPageTop(el) {
  707. if(el.parentElement) {
  708. return getElementToPageTop(el.parentElement) + el.offsetTop
  709. }
  710. return el.offsetTop
  711. }*/
  712.  
  713.  
  714. // 隐藏帖子内的 [下一页] 按钮(Discuz! 论坛)
  715. function hidePgbtn() {
  716. let style_hidePgbtn = document.createElement('style');
  717. style_hidePgbtn.innerHTML = `.pgbtn {display: none;}`;
  718. document.head.appendChild(style_hidePgbtn);
  719. }
  720.  
  721.  
  722. // 58pic 的插入前函数(加载图片)
  723. function _58pic_beforeFunction(pageElems) {
  724. let is_one = document.querySelector('.qtw-card.place-box.is-one');
  725. if (is_one && is_one.style.display != 'none') {
  726. is_one.setAttribute('style', 'display: none;')
  727. }
  728. pageElems.forEach(function (one) {
  729. let now = one.querySelector('img.lazy')
  730. if (now && now.getAttribute('src') != now.dataset.original) {
  731. now.setAttribute('src', now.dataset.original)
  732. now.setAttribute('style', 'display: block;')
  733. }
  734. });
  735. return pageElems
  736. }
  737.  
  738.  
  739. // 游民星空攻略 的插入前函数(移除下一页底部的 "更多相关内容请关注:xxx" 文字)
  740. function gamersky_gl_beforeFunction(pageElems) {
  741. pageElems.forEach(function (one) {
  742. if (one.tagName === 'P' && one.textContent.indexOf('更多相关内容请关注') > -1) {
  743. one.style.display = 'none';
  744. }
  745. });
  746. return pageElems
  747. }
  748.  
  749.  
  750. // iao.su 的插入前函数(加载图片)
  751. function iao_su_postslist_beforeFunction(pageElems) {
  752. pageElems.forEach(function (one) {
  753. let now = one.getElementsByClassName('post-card')[0]
  754. if (now) {
  755. now.getElementsByClassName('blog-background')[0].style.backgroundImage = 'url("' + now.getElementsByTagName('script')[0].textContent.split("'")[1] + '")';
  756. //now.getElementsByClassName('blog-background')[0].style.backgroundImage = 'url("' + RegExp("(?<=loadBannerDirect\\(').*(?=', '',)").exec(now.getElementsByTagName('script')[0].textContent)[0]; + '")';
  757. }
  758. });
  759. return pageElems
  760. }
  761.  
  762.  
  763. // luochenzhimu 的插入前函数(加载图片)
  764. function luochenzhimu_beforeFunction(pageElems) {
  765. pageElems.forEach(function (one) {
  766. let now = one.querySelector('img.thumb')
  767. if (now) {
  768. now.setAttribute('src', now.dataset.src)
  769. }
  770. });
  771. return pageElems
  772. }
  773.  
  774.  
  775. // iplaysoft 的插入前函数(加载图片)
  776. function iplaysoft_postslist_beforeFunction(pageElems) {
  777. pageElems.forEach(function (one) {
  778. let now = one.querySelector('img.lazyload')
  779. if (now && !now.src) {
  780. now.setAttribute('src', now.dataset.src)
  781. now.setAttribute('srcset', now.dataset.src)
  782. now.setAttribute('class', 'lazyloaded')
  783. }
  784. });
  785. return pageElems
  786. }
  787.  
  788.  
  789. // alphacoders_art 的插入前函数(图片结构调整)
  790. function alphacoders_art_beforeFunction(pageElems) {
  791. pageElems.forEach(function (one) {
  792. one.setAttribute('style','float: left');
  793. });
  794. return pageElems
  795. }
  796. // alphacoders_art(图片结构调整)
  797. function alphacoders_art_beforeFunction_0() {
  798. let pageElems1 = document.querySelectorAll('.container-masonry > div')
  799. document.querySelector('.container-masonry').style.height = 'auto'
  800. pageElems1.forEach(function (one) {
  801. one.setAttribute('style','float: left');
  802. });
  803. }
  804.  
  805.  
  806. // 启用/禁用 (当前网站)
  807. function menu_disable(type) {
  808. switch(type) {
  809. case 'check':
  810. if(check()) return true
  811. return false
  812. break;
  813. case 'add':
  814. add();
  815. break;
  816. case 'del':
  817. del();
  818. break;
  819. }
  820.  
  821. function check() { // 存在返回真,不存在返回假
  822. let list = GM_getValue('menu_disable'); // 读取网站列表
  823. if (list.indexOf(location.host) === -1) return false // 不存在返回假
  824. return true
  825. }
  826.  
  827. function add() {
  828. if (check()) return
  829. let list = GM_getValue('menu_disable'); // 读取网站列表
  830. list.push(location.host); // 追加网站域名
  831. GM_setValue('menu_disable', list); // 写入配置
  832. location.reload(); // 刷新网页
  833. }
  834.  
  835. function del() {
  836. if (!check()) return
  837. let list = GM_getValue('menu_disable'), // 读取网站列表
  838. index = list.indexOf(location.host);
  839. list.splice(index, 1); // 删除网站域名
  840. GM_setValue('menu_disable', list); // 写入配置
  841. location.reload(); // 刷新网页
  842. }
  843. }
  844.  
  845.  
  846. // 菜单开关
  847. function menu_switch(menu_status, Name, Tips) {
  848. if (menu_status === true){
  849. GM_setValue(`${Name}`, false);
  850. }else{
  851. GM_setValue(`${Name}`, true);
  852. }
  853. location.reload();
  854. };
  855.  
  856.  
  857. // 生成 ID
  858. function generateID() {
  859. let num = 0
  860. for (let val in DBSite) {
  861. DBSite[val].SiteTypeID = num = num + 1;
  862. }
  863. }
  864.  
  865.  
  866. // 滚动条事件
  867. function windowScroll(fn1) {
  868. var beforeScrollTop = document.documentElement.scrollTop,
  869. fn = fn1 || function () {};
  870. setTimeout(function () { // 延时执行,避免刚载入到页面就触发翻页事件
  871. window.addEventListener("scroll", function (e) {
  872. var afterScrollTop = document.documentElement.scrollTop,
  873. delta = afterScrollTop - beforeScrollTop;
  874. if (delta == 0) return false;
  875. fn(delta > 0 ? "down" : "up", e);
  876. beforeScrollTop = afterScrollTop;
  877. }, false);
  878. }, 1000)
  879. }
  880.  
  881.  
  882. var ShowPager = { // 修改自 https://gf.qytechs.cn/scripts/14178
  883. getFullHref: function (e) {
  884. if(e == null) return '';
  885. "string" != typeof e && (e = e.getAttribute("href"));
  886. var t = this.getFullHref.a;
  887. return t || (this.getFullHref.a = t = document.createElement("a")), t.href = e, t.href;
  888. },
  889. createDocumentByString: function (e) {
  890. if (e) {
  891. if ("HTML" !== document.documentElement.nodeName) return (new DOMParser).parseFromString(e, "application/xhtml+xml");
  892. var t;
  893. try {
  894. t = (new DOMParser).parseFromString(e, "text/html");
  895. } catch (e) {
  896. }
  897. if (t) return t;
  898. if (document.implementation.createHTMLDocument) t = document.implementation.createHTMLDocument("ADocument"); else try {
  899. (t = document.cloneNode(!1)).appendChild(t.importNode(document.documentElement, !1)),
  900. t.documentElement.appendChild(t.createElement("head")), t.documentElement.appendChild(t.createElement("body"));
  901. } catch (e) {
  902. }
  903. if (t) {
  904. var r = document.createRange();
  905. r.selectNodeContents(document.body);
  906. var n = r.createContextualFragment(e);
  907. t.body.appendChild(n);
  908. for (var a, o = {
  909. TITLE: !0,
  910. META: !0,
  911. LINK: !0,
  912. STYLE: !0,
  913. BASE: !0
  914. }, i = t.body, s = i.childNodes, c = s.length - 1; c >= 0; c--) o[(a = s[c]).nodeName] && i.removeChild(a);
  915. return t;
  916. }
  917. } else console.error("没有找到要转成DOM的字符串");
  918. },
  919. loadMorePage: function () {
  920. if (curSite.pager) {
  921. let curPageEle = getElementByXpath(curSite.pager.nextLink);
  922. var url = this.getFullHref(curPageEle);
  923. //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`);
  924. if (url === '') return;
  925. if (curSite.pageUrl === url) return;// 避免重复加载相同的页面
  926. curSite.pageUrl = url;
  927. // 读取下一页的数据
  928. curSite.pager.startFilter && curSite.pager.startFilter();
  929. GM_xmlhttpRequest({
  930. url: url,
  931. method: 'GET',
  932. timeout: 5000,
  933. onload: function (response) {
  934. try {
  935. //console.log(`${response.responseText}`)
  936. var newBody = ShowPager.createDocumentByString(response.responseText);
  937. let pageElems = getAllElements(curSite.pager.pageElement, newBody, newBody);
  938. let toElement = getAllElements(curSite.pager.HT_insert[0])[0];
  939. if (pageElems.length >= 0) {
  940. // 如果有插入前函数就执行函数
  941. if (curSite.function && curSite.function.before) {
  942. if (curSite.function.parameter) { // 如果指定了参数
  943. pageElems = curSite.function.before(curSite.function.parameter);
  944. } else {
  945. pageElems = curSite.function.before(pageElems);
  946. }
  947. }
  948. // 插入位置
  949. let addTo;
  950. switch (curSite.pager.HT_insert[1]) {
  951. case 1:
  952. addTo = "beforebegin"
  953. break;
  954. case 2:
  955. addTo = "afterbegin"
  956. break;
  957. case 3:
  958. addTo = "beforeend"
  959. break;
  960. case 4:
  961. addTo = "afterend"
  962. break;
  963. }
  964. // 插入新页面元素
  965. pageElems.forEach(function (one) {
  966. toElement.insertAdjacentElement(addTo, one);
  967. });
  968. // 替换待替换元素
  969. try {
  970. let oriE = getAllElements(curSite.pager.replaceE);
  971. let repE = getAllElements(curSite.pager.replaceE, newBody, newBody);
  972. if (oriE.length === repE.length) {
  973. for (var i = 0; i < oriE.length; i++) {
  974. oriE[i].outerHTML = repE[i].outerHTML;
  975. }
  976. }
  977. } catch (e) {
  978. console.log(e);
  979. }
  980. // 如果有插入后函数就执行函数
  981. if (curSite.function && curSite.function.after) {
  982. if (curSite.function.parameter) { // 如果指定了参数
  983. curSite.function.after(curSite.function.parameter);
  984. }else{
  985. curSite.function.after();
  986. }
  987. }
  988. }
  989. } catch (e) {
  990. console.log(e);
  991. }
  992. }
  993. });
  994. }
  995. },
  996. };
  997.  
  998.  
  999. function getElementByXpath(e, t, r) {
  1000. r = r || document, t = t || r;
  1001. try {
  1002. return r.evaluate(e, t, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  1003. } catch (t) {
  1004. return void console.error("无效的xpath");
  1005. }
  1006. }
  1007.  
  1008.  
  1009. function getAllElements(e, t, r, n, o) {
  1010. let getAllElementsByXpath = function(e, t, r) {
  1011. return r = r || document, t = t || r, r.evaluate(e, t, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  1012. }
  1013.  
  1014. var i, s = [];
  1015. if (!e) return s;
  1016. 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) {
  1017. return (t || document).querySelectorAll(e);
  1018. }(e.slice(4), t) : getAllElementsByXpath(e, t, r); else {
  1019. if (!(i = e(r, n, o))) return s;
  1020. if (i.nodeType) return s[0] = i, s;
  1021. }
  1022. return function makeArray(e) {
  1023. var t, r, n, o = [];
  1024. if (e.pop) {
  1025. for (t = 0, r = e.length; t < r; t++) (n = e[t]) && (n.nodeType ? o.push(n) : o = o.concat(makeArray(n)));
  1026. return a()(o);
  1027. }
  1028. if (e.item) {
  1029. for (t = e.length; t;) o[--t] = e[t];
  1030. return o;
  1031. }
  1032. if (e.iterateNext) {
  1033. for (t = e.snapshotLength; t;) o[--t] = e.snapshotItem(t);
  1034. return o;
  1035. }
  1036. }(i);
  1037. }
  1038. })();

QingJ © 2025

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