在进入NGA帖子时自动轮询最后一页的内容,并去重后添加到页面末尾
// ==UserScript== // @name 启用NGA自动向后加载 // @namespace https://yuyuyzl.github.io/ // @version 0.7.1 // @description 在进入NGA帖子时自动轮询最后一页的内容,并去重后添加到页面末尾 // @author yuyuyzl // @require https://cdn.bootcdn.net/ajax/libs/jquery/3.4.0/jquery.min.js // @match *://nga.178.com/read.php?tid=* // @match *://bbs.nga.cn/read.php?tid=* // @match *://bbs.ngacn.cc/read.php?tid=* // @match *://ngabbs.com/read.php?tid=* // @grant none // ==/UserScript== var needScroll=false; function getScrollTop(){ var scrollTop = 0, bodyScrollTop = 0, documentScrollTop = 0; if(document.body){ bodyScrollTop = document.body.scrollTop; } if(document.documentElement){ documentScrollTop = document.documentElement.scrollTop; } scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop; return scrollTop; } //文档的总高度 function getScrollHeight(){ var scrollHeight = 0, bodyScrollHeight = 0, documentScrollHeight = 0; if(document.body){ bodyScrollHeight = document.body.scrollHeight; } if(document.documentElement){ documentScrollHeight = document.documentElement.scrollHeight; } scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ? bodyScrollHeight : documentScrollHeight; return scrollHeight; } function getWindowHeight(){ var windowHeight = 0; if(document.compatMode == "CSS1Compat"){ windowHeight = document.documentElement.clientHeight; }else{ windowHeight = document.body.clientHeight; } return windowHeight; } jQuery.noConflict(); var jq=jQuery; var currentPage=parseInt(jq("#pagebbtm td a.invert").text().replace(".","")); (function(){ var prog,progv=0,ti,cal function init(){ prog = _$('/div','style','position:fixed;display:none;bottom:0;left:0;right:0;height:1em;background:silver;fontSize:0.3em;borderLeft:0 solid '+__COLOR.border0+';transition:border-left-width 0.3s linear 0s,0.3s') }// function progr(){ progv = 0 prog.style.borderLeftWidth=0 prog.style.display = 'none' if(cal)cal() }// commonui.progbar = function(v,o,f){//progress/% hidetimeout/ms if(!prog) init() if(v!=progv){ if(progv==0){ prog.style.display = '' cal = null } progv = v, prog.style.borderLeftWidth = (prog.offsetWidth*v/100)+'px' if(ti) clearTimeout(ti) if(v==100) ti = window.setTimeout(function(){progr()},300) else if(o) ti = window.setTimeout(function(){progr()},o) if(f) cal = f } }// })(); (function() { if (!XMLHttpRequest) return var pageStat = {}, //{页n:[贴1,2,3,...], 页n+1:[贴1,2,3,...], ...} $ = _$, HTTP = new XMLHttpRequest(), l = location, tmp, minp, //当前最小页 maxp, //当前最大页 iPo, //当前第一条 iPc, ot = 0, count = 1, //当前显示的总页数 progr = function() { commonui.loadReadHidden.lock = 0 }, progt = function(v, o) { commonui.progbar(v * 10, o ? o : 5000, v == 10 ? progr : null) }, cs = document.characterSet || document.defaultCharset || document.charset; HTTP.onerror = function(e) { error('HTTP ERROR') } HTTP.onload = HTTP.onabout = function(e) { progt(10) } HTTP.onprogress = function(e) { /* if (e.lengthComputable) progv = (e.loaded / e.total)*prog.offsetWidth else if(progv = this.getResponseHeader('X-NGA-CONTENT-LENGTH')) progv = (e.loaded / progv)*prog.offsetWidth else{ progv = e.loaded/100 if(progv>prog.offsetWidth) progv = prog.offsetWidth } */ progt(3) } var ifp = function(o, opt) { if (opt & 1024) { if (o.nodeName == 'TBODY') return 1 } else if (o.className == 'forumbox postbox') return 1 } pr = function(txt, opt) { if (opt & 1024) { //console.log(txt) var x = cut(txt, ['<!--topicliststart-->', '<!--topiclistend-->', '//topicloadallstart', '//topicloadallend', ], 0, 1) if (x.length < 2) return error('parse page error') var y = cut(x[0], ["<script type='text/javascript'>", '</script>'], 0, 0) y.push(x[1]) return [null, x[0], //内容 y//取出内容加载脚本 ] } var x = cut(txt, ['//userinfostart', '//userinfoend', '<!--postliststart-->', '<!--postlistend-->'], 0, 1) if (x.length < 2) return error('parse page error') //去重by yuyuyzl var newList=[]; cut(x[1], ['<table', '</table>'], 0, 0).forEach(function(o,i){ if(o==null)return; o='<table'+o+ '</table>'; idList=o.match(/post[a-z_]+[0123456789]+/g) //console.log(idList) if(idList==null){newList.push(o);return;} for(var j=0;j<idList.length;j++)if( $(o.match(/post[a-z_]+[0123456789]+/g)[j])!=null)return; newList.push(o); }); cut(x[1], ['<script>', '</script>'], 0, 0).forEach(function(o,i){ if(o==null)return; o='<script>'+o+ '</script>'; idList=o.match(/post[a-z_]+[0123456789]+/g) //console.log(idList) if(idList==null){newList.push(o);return;} for(var j=0;j<idList.length;j++)if( $(o.match(/post[a-z_]+[0123456789]+/g)[j])!=null)return; newList.push(o); }); var filtereddata="\n\n\n"+newList.join("\n\n")+"\n"; //console.log(newList) return [x[0], //用户信息脚本 filtereddata, //内容 cut(filtereddata, ['<script>', '</script>'], 0, 0)//取出内容加载脚本 ] } commonui.loadReadHiddenNS = function(p, opt, recursiveCount) { // 页, &1替换加载指定页 &2连续加载下一页 &4连续加载上一页 if (this.loadReadHidden.lock) return this.loadReadHidden.lock = 1 if (!iPc) { iPc = $('m_posts_c') if (!iPc) { iPc = $('topicrows') ot |= 1024 } } opt |= ot if (!minp) { minp = maxp = __PAGE[2] pageStat[maxp] = [] for (var i = 0; i < iPc.childNodes.length; i++) { if (ifp(iPc.childNodes[i], opt)) pageStat[maxp].push(iPc.childNodes[i]) } } var ugo = __PAGE[0] + '&page=' + p HTTP.__rep = 0 HTTP.abort() HTTP.open('GET', ugo) HTTP.onreadystatechange = function() { if (HTTP.readyState !== HTTP.DONE) return var all = HTTP.responseText if (HTTP.status !== 200 || HTTP.getResponseHeader("X-NGA-CONTENT-TYPE") == 'short-message') { var c = all.match(/<!--msgcodestart-->(\d+)<!--msgcodeend-->/) if (c && c[1] == 15 && HTTP.__rep < 1) { __COOKIE.setCookieInSecond('guestJs', __NOW, 1200) HTTP.__rep++ return setTimeout(function() { HTTP.abort() HTTP.open('GET', ugo) HTTP.send() }, 500) } var c = all.match(/<!--msginfostart-->(.+?)<!--msginfoend-->/) if (c) return error(c[1].replace(/<br\s*\/>/g, "\n").replace(/<\/?[A-Za-z]+(\s[^>]*)?>/g, " ").replace(/^\s+|\s+$/g, ''), 2) return error('HTTP ERROR ' + HTTP.status, 2); } progt(5) var data = pr(all, opt) if (commonui.eval.call(window, data[0])) return error('parse data 0 error') progt(6) currentPage=parseInt(all.match(/,2:[0-9]+,3:/)[0].replace(",2:","").replace(",3:","")); //console.log(currentPage) __PAGE[2] = p if (opt & 1) { minp = maxp = p pageStat = {} count = 1 iPo = null for (var i = iPc.childNodes.length - 1; i >= 0; i--) { //if(ifp(iPc.childNodes[i], opt) || iPc.childNodes[i].nodeName=='SCRIPT') iPc.removeChild(iPc.childNodes[i]) } if (history.replaceState) history.replaceState('object or string', document.title, __PAGE[0] + '&page=' + p) } else if (opt & 6) { //count++ if (count > 10) { count-- if (opt & 2) tmp = minp, minp++ else if (opt & 4) tmp = maxp, maxp-- for (var i = 0; i < pageStat[tmp].length; i++) { pageStat[tmp][i].parentNode.removeChild(pageStat[p][i]) pageStat[tmp][i] = null } pageStat[tmp] = null delete pageStat[tmp] } if (opt & 2) maxp = p, iPo = null else if (opt & 4) iPo = pageStat[minp][0], minp = p commonui.topicArg.opt |= 1 //console.log('replacehis '+p) //if(history.replaceState) //history.replaceState('object or string', document.title, __PAGE[0]+'&page='+p) } progt(7) var c = data[1].match(/\s*<tbody/) ? $('/table') : $('/span') c.innerHTML = data[1] pageStat[p] = [] for (var i = 0; i < c.childNodes.length; i++) { if (ifp(c.childNodes[i], opt)) { pageStat[p].push(c.childNodes[i]) iPc.insertBefore(c.childNodes[i], iPo) } } progt(8) for (var i = 0; i < data[2].length; i++) { if (commonui.eval.call(window, data[2][i])) return error('parse data 2 error') } /*var c = document.getElementsByName('pageball') if (opt & 1) { commonui.pageBtn(c[0], { 0: __PAGE[0], 1: __PAGE[1], 2: p, 3: __PAGE[3] }, 16) commonui.pageBtn(c[1], { 0: __PAGE[0], 1: __PAGE[1], 2: p, 3: __PAGE[3] }, 8) } else { commonui.pageBtn(c[0], { 0: __PAGE[0], 1: __PAGE[1], 2: minp, 3: __PAGE[3] }, 4 | 16) commonui.pageBtn(c[1], { 0: __PAGE[0], 1: __PAGE[1], 2: maxp, 3: __PAGE[3] }, 2 | 8) }//*/ progt(9) if (window._czc) //cnzz统计 _czc.push(["_trackPageview", __PAGE[0] + '&page=' + p]); if(needScroll)window.scrollTo(0,getScrollHeight()); console.log(p); console.log(currentPage); if(p==currentPage && recursiveCount>1)setTimeout(()=>commonui.loadReadHiddenNS(currentPage+1,2,recursiveCount-1),500); } HTTP.overrideMimeType("text/html; charset=" + cs); progt(1) HTTP.send() } //fe commonui.loadReadHidden.reset = function() { tmp = null minp = null maxp = null iPo = null iPc = null ot = 0 count = 1 } // var error = function(e, a) { progt(10) console.log(e) } var cut = function(txt, match, offset, opt) { var m, n, r = [], start = match.shift(), end = match.shift() while (1) { m = txt.indexOf(start, offset) if (m == -1) break n = txt.indexOf(end, m) if (n == -1) break r.push(txt.substr(m + start.length, n - m - start.length)) offset = n + end.length if (opt & 1) { var start = match.shift() , end = match.shift() if (!start || !end) break } } return r } //fe } )(); jq("#pagebtop td a.invert").text("Auto").attr("href",jq("#pagebtop td a.invert").attr("href").replace(/\&page=[0-9]+/,"&page=9999")); jq("#pagebbtm td a.invert").text("Auto").attr("href",jq("#pagebbtm td a.invert").attr("href").replace(/\&page=[0-9]+/,"&page=9999")); jq("#fast_post_c>div>div>table>tbody").toggle(); jq("#footer").toggle(); jq("#fast_post_c>div>div>table>caption>h2").text("..:: 快速发贴(点我展开) ::.."); jq("#fast_post_c>div>div>table>caption").click(function(){ jq("#fast_post_c>div>div>table>tbody").toggle(); jq("#footer").toggle(); }); jq(":contains('>>>')").last().remove() setInterval(function(){ if((getScrollTop() + getWindowHeight()) == (getScrollHeight())){ needScroll=true }else needScroll=false; commonui.loadReadHiddenNS(currentPage,2,5); //setTimeout(()=>{commonui.loadReadHiddenNS(currentPage+1,2)},500) },10000)