11// ==UserScript==
22// @name 吾爱破解论坛增强 - 自动签到、翻页
3- // @version 1.0.5
3+ // @version 1.0.6
44// @author X.I.U
5- // @description 吾爱破解论坛自动签到、自动翻页
5+ // @description 自动签到、自动无缝翻页
66// @match *://www.52pojie.cn/*
77// @icon https://www.52pojie.cn/favicon.ico
8+ // @grant GM_xmlhttpRequest
89// @license GPL-3.0 License
910// @run -at document-end
1011// @namespace https://greasyfork.org/scripts/412680
1112// ==/UserScript==
1213
1314( function ( ) {
14- qianDaoBack ( ) ;
15- qianDao ( ) ;
16- pageLoading ( ) ;
15+ // 默认 ID 为 0
16+ var curSite = { SiteTypeID : 0 } ;
17+
18+ // 自动翻页规则
19+ let DBSite = {
20+ forum : {
21+ SiteTypeID : 1
22+ } ,
23+ thread : {
24+ SiteTypeID : 2 ,
25+ pager : {
26+ nextLink : '//div[@id="pgt"]//a[contains(text(),"下一页")][@href]' ,
27+ pageElement : 'css;div#postlist > div[id^="post_"]' ,
28+ HT_insert : [ 'css;div#postlist' , 2 ] ,
29+ replaceE : '//div[@class="pg"] | //div[@class="pgbtn"]' ,
30+ }
31+ } ,
32+ guide : {
33+ SiteTypeID : 3 ,
34+ pager : {
35+ nextLink : '//div[@id="pgt"]//a[contains(text(),"下一页")][@href]' ,
36+ pageElement : 'css;div#threadlist div.bm_c table > tbody[id^="normalthread_"]' ,
37+ HT_insert : [ 'css;div#threadlist div.bm_c table' , 2 ] ,
38+ replaceE : 'css;div.pg' ,
39+ }
40+ }
41+ } ;
42+
43+ // 用于脚本内部判断当前 URL 类型
44+ let SiteType = {
45+ FORUM : DBSite . forum . SiteTypeID ,
46+ THREAD : DBSite . thread . SiteTypeID ,
47+ GUIDE : DBSite . guide . SiteTypeID
48+ } ;
49+
50+ // URL 匹配正则表达式
51+ var patt_forum = / \/ f o r u m - \d + - \d + \. h t m l / ,
52+ patt_forum_2 = / m o d \= f o r u m d i s p l a y / ,
53+ patt_thread = / \/ t h r e a d - \d + - \d + \- \d + .h t m l / ,
54+ patt_thread_2 = / m o d \= v i e w t h r e a d / ,
55+ patt_guide = / m o d \= g u i d e \& v i e w \= ( h o t | d i g e s t ) /
56+
57+ // URL 判断
58+ if ( patt_thread . test ( location . pathname ) || patt_thread_2 . test ( location . search ) ) {
59+ curSite = DBSite . thread ;
60+ } else if ( patt_forum . test ( location . pathname ) || patt_forum_2 . test ( location . search ) ) {
61+ curSite = DBSite . forum ;
62+ } else if ( patt_guide . test ( location . search ) ) {
63+ curSite = DBSite . guide ;
64+ }
65+ curSite . pageUrl = "" ; // 下一页URL
66+
67+
68+ qianDaoBack ( ) ; // 先看看是不是签到跳转页面,如果是则返回
69+ qianDao ( ) ; // 看看有没有签到
70+ pageLoading ( ) ; // 自动翻页
71+
72+
73+ // 自动翻页
74+ function pageLoading ( ) {
75+ if ( curSite . SiteTypeID > 0 ) {
76+ windowScroll ( function ( direction , e ) {
77+ if ( direction === "down" ) { // 下滑才准备翻页
78+ var scrollTop = document . documentElement . scrollTop || window . pageYOffset || document . body . scrollTop ;
79+ let scrollDelta = 666 ;
80+ if ( document . documentElement . scrollHeight <= document . documentElement . clientHeight + scrollTop + scrollDelta ) {
81+ if ( curSite . SiteTypeID === SiteType . FORUM ) { // 如果是原创、精品等版块则直接点下一页就行了
82+ var autopbn = document . querySelector ( '#autopbn' ) ;
83+ if ( autopbn && autopbn . innerText == "下一页 »" ) { // 如果已经在加载中了,就忽略
84+ autopbn . click ( ) ;
85+ }
86+ } else {
87+ ShowPager . loadMorePage ( ) ;
88+ }
89+ }
90+ }
91+ } ) ;
92+ }
93+ }
94+
1795
1896 // 自动签到
1997 function qianDao ( ) {
26104 }
27105 }
28106
107+
29108 // 签到后立即返回
30109 function qianDaoBack ( ) {
31110 var qiandaoback = document . querySelector ( '#messagetext p.alert_btnleft a' ) ;
37116 }
38117 }
39118
40- // 自动翻页
41- function pageLoading ( ) {
42- var patt1 = / \/ f o r u m - \d + - \d + \. h t m l /
43- var patt2 = / m o d \= f o r u m d i s p l a y /
44- if ( patt1 . test ( location . pathname ) || patt2 . test ( location . search ) ) {
45- windowScroll ( function ( direction , e ) {
46- if ( direction === "down" ) { // 下滑才准备翻页
47- var scrollTop = document . documentElement . scrollTop || window . pageYOffset || document . body . scrollTop ;
48- let scrollDelta = 666 ;
49- if ( document . documentElement . scrollHeight <= document . documentElement . clientHeight + scrollTop + scrollDelta ) {
50- var autopbn = document . querySelector ( '#autopbn' ) ;
51- if ( autopbn && autopbn . innerText == "下一页 »" ) { // 如果已经在加载中了,就忽略
52- autopbn . click ( ) ;
53- }
54- }
55- }
56- } ) ;
57- }
58- }
59119
60120 // 滚动条事件
61121 function windowScroll ( fn1 ) {
71131 } , false ) ;
72132 } , 1000 )
73133 }
134+
135+
136+ var ShowPager = { // 修改自 https://greasyfork.org/scripts/14178
137+ getFullHref : function ( e ) {
138+ if ( e == null ) return '' ;
139+ "string" != typeof e && ( e = e . getAttribute ( "href" ) ) ;
140+ var t = this . getFullHref . a ;
141+ return t || ( this . getFullHref . a = t = document . createElement ( "a" ) ) , t . href = e , t . href ;
142+ } ,
143+ createDocumentByString : function ( e ) {
144+ if ( e ) {
145+ if ( "HTML" !== document . documentElement . nodeName ) return ( new DOMParser ) . parseFromString ( e , "application/xhtml+xml" ) ;
146+ var t ;
147+ try {
148+ t = ( new DOMParser ) . parseFromString ( e , "text/html" ) ;
149+ } catch ( e ) {
150+ }
151+ if ( t ) return t ;
152+ if ( document . implementation . createHTMLDocument ) t = document . implementation . createHTMLDocument ( "ADocument" ) ; else try {
153+ ( t = document . cloneNode ( ! 1 ) ) . appendChild ( t . importNode ( document . documentElement , ! 1 ) ) ,
154+ t . documentElement . appendChild ( t . createElement ( "head" ) ) , t . documentElement . appendChild ( t . createElement ( "body" ) ) ;
155+ } catch ( e ) {
156+ }
157+ if ( t ) {
158+ var r = document . createRange ( ) ;
159+ r . selectNodeContents ( document . body ) ;
160+ var n = r . createContextualFragment ( e ) ;
161+ t . body . appendChild ( n ) ;
162+ for ( var a , o = {
163+ TITLE : ! 0 ,
164+ META : ! 0 ,
165+ LINK : ! 0 ,
166+ STYLE : ! 0 ,
167+ BASE : ! 0
168+ } , i = t . body , s = i . childNodes , c = s . length - 1 ; c >= 0 ; c -- ) o [ ( a = s [ c ] ) . nodeName ] && i . removeChild ( a ) ;
169+ return t ;
170+ }
171+ } else console . error ( "没有找到要转成DOM的字符串" ) ;
172+ } ,
173+ loadMorePage : function ( ) {
174+ if ( curSite . pager ) {
175+ let curPageEle = getElementByXpath ( curSite . pager . nextLink ) ;
176+ var url = this . getFullHref ( curPageEle ) ;
177+ //console.log(`${url} ${curPageEle} ${curSite.pageUrl}`);
178+ if ( url === '' ) return ;
179+ if ( curSite . pageUrl === url ) return ; // 不会重复加载相同的页面
180+ curSite . pageUrl = url ;
181+ // 读取下一页的数据
182+ curSite . pager . startFilter && curSite . pager . startFilter ( ) ;
183+ GM_xmlhttpRequest ( {
184+ url : url ,
185+ method : "GET" ,
186+ timeout : 5000 ,
187+ onload : function ( response ) {
188+ try {
189+ var newBody = ShowPager . createDocumentByString ( response . responseText ) ;
190+ let pageElems = getAllElements ( curSite . pager . pageElement , newBody , newBody ) ;
191+ let toElement = getAllElements ( curSite . pager . HT_insert [ 0 ] ) [ 0 ] ;
192+ if ( pageElems . length >= 0 ) {
193+ let addTo = "beforeend" ;
194+ if ( curSite . pager . HT_insert [ 1 ] == 1 ) addTo = "beforebegin" ;
195+ // 插入新页面元素
196+ pageElems . forEach ( function ( one ) {
197+ toElement . insertAdjacentElement ( addTo , one ) ;
198+ } ) ;
199+ // 替换待替换元素
200+ try {
201+ let oriE = getAllElements ( curSite . pager . replaceE ) ;
202+ let repE = getAllElements ( curSite . pager . replaceE , newBody , newBody ) ;
203+ if ( oriE . length === repE . length ) {
204+ for ( var i = 0 ; i < oriE . length ; i ++ ) {
205+ oriE [ i ] . outerHTML = repE [ i ] . outerHTML ;
206+ }
207+ }
208+ } catch ( e ) {
209+ console . log ( e ) ;
210+ }
211+ }
212+ } catch ( e ) {
213+ console . log ( e ) ;
214+ }
215+ }
216+ } ) ;
217+ }
218+ } ,
219+ } ;
220+
221+
222+ function getElementByXpath ( e , t , r ) {
223+ r = r || document , t = t || r ;
224+ try {
225+ return r . evaluate ( e , t , null , XPathResult . FIRST_ORDERED_NODE_TYPE , null ) . singleNodeValue ;
226+ } catch ( t ) {
227+ return void console . error ( "无效的xpath" ) ;
228+ }
229+ }
230+
231+
232+ function getAllElements ( e , t , r , n , o ) {
233+ let getAllElementsByXpath = function ( e , t , r ) {
234+ return r = r || document , t = t || r , r . evaluate ( e , t , null , XPathResult . ORDERED_NODE_SNAPSHOT_TYPE , null ) ;
235+ }
236+
237+ var i , s = [ ] ;
238+ if ( ! e ) return s ;
239+ if ( r = r || document , n = n || window , o = o || void 0 , t = t || r , "string" == typeof e ) i = 0 === e . search ( / ^ c s s ; / i) ? function getAllElementsByCSS ( e , t ) {
240+ return ( t || document ) . querySelectorAll ( e ) ;
241+ } ( e . slice ( 4 ) , t ) : getAllElementsByXpath ( e , t , r ) ; else {
242+ if ( ! ( i = e ( r , n , o ) ) ) return s ;
243+ if ( i . nodeType ) return s [ 0 ] = i , s ;
244+ }
245+ return function makeArray ( e ) {
246+ var t , r , n , o = [ ] ;
247+ if ( e . pop ) {
248+ for ( t = 0 , r = e . length ; t < r ; t ++ ) ( n = e [ t ] ) && ( n . nodeType ? o . push ( n ) : o = o . concat ( makeArray ( n ) ) ) ;
249+ return a ( ) ( o ) ;
250+ }
251+ if ( e . item ) {
252+ for ( t = e . length ; t ; ) o [ -- t ] = e [ t ] ;
253+ return o ;
254+ }
255+ if ( e . iterateNext ) {
256+ for ( t = e . snapshotLength ; t ; ) o [ -- t ] = e . snapshotItem ( t ) ;
257+ return o ;
258+ }
259+ } ( i ) ;
260+ }
74261} ) ( ) ;
0 commit comments