NGA Auto Pager V2

NGA自动翻页插件

  1. // ==UserScript==
  2. // @name NGA Auto Pager V2
  3. // @version 2.40
  4. // @description NGA自动翻页插件
  5. // @match *://bbs.nga.cn/read.php*
  6. // @match *://bbs.nga.cn/thread.php*
  7. // @match *://bbs.nga.cn/wow*
  8. // @match *://bbs.nga.cn/it*
  9. // @match *://bbs.nga.cn/auto*
  10. // @match *://bbs.nga.cn/ink*
  11. // @match *://bbs.nga.cn/ng2*
  12. // @match *://bbs.nga.cn/play*
  13. // @match *://bbs.nga.cn/tvgame*
  14. // @match *://bbs.nga.cn/wa2*
  15. // @match *://bbs.nga.cn/ccq*
  16. // @match *://bbs.nga.cn/gw2*
  17. // @match *://bbs.nga.cn/bns*
  18. // @match *://bbs.nga.cn/heroes*
  19. // @match *://bbs.nga.cn/lol*
  20. // @match *://bbs.nga.cn/hs*
  21. // @match *://bbs.nga.cn/wot*
  22. // @match *://bbs.nga.cn/jx3*
  23. // @match *://bbs.nga.cn/coc*
  24. // @match *://bbs.nga.cn/pad*
  25. // @match *://bbs.nga.cn/d3*
  26. // @match *://bbs.nga.cn/dota*
  27. // @match *://bbs.nga.cn/wt*
  28. // @match *://bbs.nga.cn/ff14*
  29. // @match *://bbs.nga.cn/poi*
  30. // @match *://bbs.nga.cn/gta*
  31. // @match *://bbs.nga.cn/sc*
  32. // @match *://bbs.nga.cn/fn*
  33. // @match *://bbs.nga.cn/ow*
  34. // @match *://bbs.nga.cn/cr*
  35. // @match *://bbs.nga.cn/king*
  36. // @match *://nga.178.com/read.php*
  37. // @match *://nga.178.com/thread.php*
  38. // @match *://nga.178.com/wow*
  39. // @match *://nga.178.com/it*
  40. // @match *://nga.178.com/auto*
  41. // @match *://nga.178.com/ink*
  42. // @match *://nga.178.com/ng2*
  43. // @match *://nga.178.com/play*
  44. // @match *://nga.178.com/tvgame*
  45. // @match *://nga.178.com/wa2*
  46. // @match *://nga.178.com/ccq*
  47. // @match *://nga.178.com/gw2*
  48. // @match *://nga.178.com/bns*
  49. // @match *://nga.178.com/heroes*
  50. // @match *://nga.178.com/lol*
  51. // @match *://nga.178.com/hs*
  52. // @match *://nga.178.com/wot*
  53. // @match *://nga.178.com/jx3*
  54. // @match *://nga.178.com/coc*
  55. // @match *://nga.178.com/pad*
  56. // @match *://nga.178.com/d3*
  57. // @match *://nga.178.com/dota*
  58. // @match *://nga.178.com/wt*
  59. // @match *://nga.178.com/ff14*
  60. // @match *://nga.178.com/poi*
  61. // @match *://nga.178.com/gta*
  62. // @match *://nga.178.com/sc*
  63. // @match *://nga.178.com/fn*
  64. // @match *://nga.178.com/ow*
  65. // @match *://nga.178.com/cr*
  66. // @match *://nga.178.com/king*
  67. // @match *://ngabbs.com/read.php*
  68. // @match *://ngabbs.com/thread.php*
  69. // @match *://ngabbs.com/wow*
  70. // @match *://ngabbs.com/it*
  71. // @match *://ngabbs.com/auto*
  72. // @match *://ngabbs.com/ink*
  73. // @match *://ngabbs.com/ng2*
  74. // @match *://ngabbs.com/play*
  75. // @match *://ngabbs.com/tvgame*
  76. // @match *://ngabbs.com/wa2*
  77. // @match *://ngabbs.com/ccq*
  78. // @match *://ngabbs.com/gw2*
  79. // @match *://ngabbs.com/bns*
  80. // @match *://ngabbs.com/heroes*
  81. // @match *://ngabbs.com/lol*
  82. // @match *://ngabbs.com/hs*
  83. // @match *://ngabbs.com/wot*
  84. // @match *://ngabbs.com/jx3*
  85. // @match *://ngabbs.com/coc*
  86. // @match *://ngabbs.com/pad*
  87. // @match *://ngabbs.com/d3*
  88. // @match *://ngabbs.com/dota*
  89. // @match *://ngabbs.com/wt*
  90. // @match *://ngabbs.com/ff14*
  91. // @match *://ngabbs.com/poi*
  92. // @match *://ngabbs.com/gta*
  93. // @match *://ngabbs.com/sc*
  94. // @match *://ngabbs.com/fn*
  95. // @match *://ngabbs.com/ow*
  96. // @match *://ngabbs.com/cr*
  97. // @match *://ngabbs.com/king*
  98. // @match *://bbs.ngacn.cc/read.php*
  99. // @match *://bbs.ngacn.cc/thread.php*
  100. // @match *://bbs.ngacn.cc/wow*
  101. // @match *://bbs.ngacn.cc/it*
  102. // @match *://bbs.ngacn.cc/auto*
  103. // @match *://bbs.ngacn.cc/ink*
  104. // @match *://bbs.ngacn.cc/ng2*
  105. // @match *://bbs.ngacn.cc/play*
  106. // @match *://bbs.ngacn.cc/tvgame*
  107. // @match *://bbs.ngacn.cc/wa2*
  108. // @match *://bbs.ngacn.cc/ccq*
  109. // @match *://bbs.ngacn.cc/gw2*
  110. // @match *://bbs.ngacn.cc/bns*
  111. // @match *://bbs.ngacn.cc/heroes*
  112. // @match *://bbs.ngacn.cc/lol*
  113. // @match *://bbs.ngacn.cc/hs*
  114. // @match *://bbs.ngacn.cc/wot*
  115. // @match *://bbs.ngacn.cc/jx3*
  116. // @match *://bbs.ngacn.cc/coc*
  117. // @match *://bbs.ngacn.cc/pad*
  118. // @match *://bbs.ngacn.cc/d3*
  119. // @match *://bbs.ngacn.cc/dota*
  120. // @match *://bbs.ngacn.cc/wt*
  121. // @match *://bbs.ngacn.cc/ff14*
  122. // @match *://bbs.ngacn.cc/poi*
  123. // @match *://bbs.ngacn.cc/gta*
  124. // @match *://bbs.ngacn.cc/sc*
  125. // @match *://bbs.ngacn.cc/fn*
  126. // @match *://bbs.ngacn.cc/ow*
  127. // @match *://bbs.ngacn.cc/cr*
  128. // @match *://bbs.ngacn.cc/king*
  129. // @author Sunness
  130. // @namespace https://greasyfork.org/users/63731
  131. // @license GPL-3.0-or-later
  132. // ==/UserScript==
  133.  
  134. const snackbar_css=document.createElement("style");snackbar_css.innerHTML="#snackbar{visibility:hidden;padding:12px;right:50px;bottom:30px;background-color:#333;color:#fff;text-align:center;border-radius:6px;position:fixed}#snackbar.show{visibility:visible;-webkit-animation:fadein .5s,fadeout .5s 2.5s;animation:fadein .5s,fadeout .5s 2.5s}@-webkit-keyframes fadein{from{bottom:0;opacity:0}to{bottom:30px;opacity:1}}@keyframes fadein{from{bottom:0;opacity:0}to{bottom:30px;opacity:1}}@-webkit-keyframes fadeout{from{bottom:30px;opacity:1}to{bottom:0;opacity:0}}@keyframes fadeout{from{bottom:30px;opacity:1}to{bottom:0;opacity:0}}";const snackbar=document.createElement("div");snackbar.setAttribute("id","snackbar"),document.body.appendChild(snackbar_css),document.body.appendChild(snackbar);const backToTop=document.createElement("a");backToTop.setAttribute("id","btt"),backToTop.setAttribute("href","#");const reply=document.createElement("a");reply.setAttribute("id","quick_reply"),reply.setAttribute("href","#"),reply.innerText="回";const next=document.createElement("a");next.setAttribute("id","next_post"),next.setAttribute("href","#");const bar=document.createElement("div");bar.setAttribute("id","pager_bar");const bar_css=document.createElement("style");bar_css.innerHTML="#pager_bar{display:flex;position:fixed;right:32px;bottom:72px;justify-content:space-evenly}#pager_bar a{margin-left:1px;visibility:hidden;background-color:#333;color:#fff;text-align:center;border-radius:6px;padding:8px;width:16px;height:16px;text-decoration:none;user-select:none}#pager_bar a:hover{color:#FFF;opacity:0.8}#pager_bar .show{visibility:visible}#btt{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAAD///////////////////////////////////////////////////////////////////////8KOjVvAAAAEnRSTlMACLXDHg3y7rc5MeTc2jP2zT4cRXegAAAAVklEQVQY052NSxKAIAxDA4h8FNTc/7CWjnZ0qdl03mszxe84792byadxmZJsJgbyMnbPbeFo2X4u0yojRGPgNn7wAYjRFnpiqoCaxtSB2pTV7EW/4FtO+dIEDwMelUIAAAAASUVORK5CYII=') center 50% no-repeat #333}#next_post{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAAs0lEQVQ4jc3Ru2oCURSF4cH7c9hF3yFFMq15RS9DOiEREh9HsEmElOKg1ZfCC5PNDGoKcZVr//8+sE+S3E3QvoKtxeIZP3i6QH7AAumxSLGxz+Y0KJd7+D6wOdIEn/5mjccSuYtlYD8StDELgy0GBbmPVWBmaB2BFt4DsMNLhfx2kguvdDAPYI6v0M3RqTpSE1PVeUX93DfVkZXI2Vk5LJkU5PHFclgywvBqubCk8W/5ZvkFc4xr+hcT/FsAAAAASUVORK5CYII=') center 50% no-repeat #333}.fast_reply{position:fixed;left:33vw;top:25vh;background:#fff0cd;box-shadow:0 0 16px #403c33;border-radius:6px}",bar.appendChild(next),bar.appendChild(reply),bar.appendChild(backToTop),document.body.appendChild(bar_css),document.body.appendChild(bar);const toast=t=>{snackbar.innerHTML=t,snackbar.className="show",setTimeout(()=>{snackbar.className=""},3e3)},fast_post=$("fast_post_c"),old_post_btn=document.querySelector("#fast_post_c a.uitxt1"),subject=document.querySelector("#fast_post_c .row1 .c2 input"),content=document.querySelector("#fast_post_c .row1 .c2 textarea");if(null!=old_post_btn){const t=old_post_btn.cloneNode(!0);reply.addEventListener("click",e=>{e.preventDefault(),0===fast_post.className.length?(fast_post.className="fast_reply",old_post_btn.parentNode.replaceChild(t,old_post_btn)):(t.parentNode.replaceChild(old_post_btn,t),fast_post.className="")}),t.addEventListener("click",e=>{e.preventDefault(),commonui.newPost(t,postfunc.__REPLY_BLANK,window.__CURRENT_F_BIT,window.__CURRENT_FID,window.__CURRENT_TID,0,null,subject.value,content.value),reply.click(),toast("正在回复")})}else document.querySelector("a.rep.uitxt1")&&reply.setAttribute("href",document.querySelector("a.rep.uitxt1").href);const threshold=3e3,topPosition=Math.round(($("topicrows")||$("m_posts")).getBoundingClientRect().top+window.scrollY);let exist=!1,running=!1,opt=2,post=0,posts=document.querySelectorAll(".postbox"),ip=1,backing=!1,thread=!1,lastScrollTop=window.pageYOffset|window.document.scrollTop;for(const t of posts)document.documentElement.scrollTop>t.getBoundingClientRect().top+window.scrollY&&post++;"undefined"!=typeof __PAGE&&(ip=__PAGE[2],opt=0===__PAGE[0].indexOf("/read")?2:1026,exist=null!==document.querySelector("a.uitxt1[title=加载下一页]")),2===opt&&(thread=!0,next.className="show"),backToTop.addEventListener("click",t=>{t.preventDefault(),window.scrollTo({top:topPosition,left:0,behavior:"smooth"}),backing=!0}),next.addEventListener("click",t=>{t.preventDefault(),window.scrollTo({top:posts[post].getBoundingClientRect().top+window.scrollY,left:0,behavior:"smooth"}),posts.length>post+1&&post++});const fr=new FileReader,load=()=>{const data=pr(fr.result,opt),c=data[1].match(/\s*<tbody/)?_$("/table"):_$("/span"),pb=document.getElementsByName("pageball"),iPc=$("m_posts_c")||$("topicrows");eval(data[0]),c.innerHTML=data[1],c.childNodes.forEach(t=>{(1024&opt&&"TBODY"==t.nodeName||"forumbox postbox"==t.className)&&iPc.insertBefore(t,null)}),data[2].forEach(d=>eval(d)),__PAGE[2]++,commonui.pageBtn(pb[0],{0:__PAGE[0],1:__PAGE[1],2:ip,3:__PAGE[3]},20),commonui.pageBtn(pb[1],{0:__PAGE[0],1:__PAGE[1],2:__PAGE[2],3:__PAGE[3]},10),running=!1,posts=document.querySelectorAll(".postbox")};fr.addEventListener("loadend",load);const asyncFunc=t=>()=>{try{t()}catch(t){console.error("NGA Autopager V2",t)}},scroll=async()=>{const t=window.pageYOffset||window.document.scrollTop;if(thread&&(t>lastScrollTop?t>posts[post].getBoundingClientRect().top+window.scrollY&&posts.length>post+1&&post++:post>0&&t<posts[post-1].getBoundingClientRect().top+window.scrollY&&post>1&&post--,lastScrollTop=t),backing&&Math.abs(t-topPosition)<2&&(post=1,backing=!1),t<1e3?(backToTop.className="",thread&&(reply.className="",0!==fast_post.className.length&&reply.click())):(backToTop.className="show",thread&&(reply.className="show")),navigator.onLine&&exist&&!running&&document.documentElement.scrollHeight-t<threshold){if(running=!0,null!==document.querySelector("a.uitxt1[title=加载下一页]")){toast(`正在加载第${__PAGE[2]+1}页`);try{const t=await fetch(`${__PAGE[0]}&page=${__PAGE[2]+1}`);fr.readAsText(await t.blob(),"gbk")}catch(t){console.error("NGA Autopager V2",t),toast("加载错误")}}else exist=!1}};window.addEventListener("scroll",asyncFunc(scroll));