Skip to content

Commit 64c04f2

Browse files
committed
自动无缝翻页
1 parent 5d4b7ab commit 64c04f2

4 files changed

Lines changed: 439 additions & 47 deletions

File tree

52pojie-Beautification.user.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// ==UserScript==
2-
// @name 吾爱破解论坛美化 - 精简多余内容
2+
// @name 吾爱破解论坛美化
33
// @version 1.0.1
44
// @author X.I.U
55
// @description 精简多余内容

52pojie-Enhanced.user.js

Lines changed: 211 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,97 @@
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 = /\/forum-\d+-\d+\.html/,
52+
patt_forum_2 = /mod\=forumdisplay/,
53+
patt_thread = /\/thread-\d+-\d+\-\d+.html/,
54+
patt_thread_2 = /mod\=viewthread/,
55+
patt_guide = /mod\=guide\&view\=(hot|digest)/
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() {
@@ -26,6 +104,7 @@
26104
}
27105
}
28106

107+
29108
// 签到后立即返回
30109
function qianDaoBack() {
31110
var qiandaoback = document.querySelector('#messagetext p.alert_btnleft a');
@@ -37,25 +116,6 @@
37116
}
38117
}
39118

40-
// 自动翻页
41-
function pageLoading() {
42-
var patt1 = /\/forum-\d+-\d+\.html/
43-
var patt2 = /mod\=forumdisplay/
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) {
@@ -71,4 +131,131 @@
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(/^css;/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
})();

Zhiyoo-Beautification.user.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// ==UserScript==
2-
// @name 智友邦论坛美化 - 精简多余内容、宽屏显示
2+
// @name 智友邦论坛美化
33
// @version 1.0.0
44
// @author X.I.U
55
// @description 精简多余内容、宽屏显示

0 commit comments

Comments
 (0)