NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name zhaishuyuan
// @namespace http://tampermonkey.net/
// @version 0.3
// @description load multile chapters
// @author clumsyman
// @copyright 2018, clumsyman (https://openuserjs.org//users/clumsyman)
// @license MIT
// @match https://www.shuchong.info/chapter/*
// @match https://www.shuchong.info/user/bookcase/*
// @match https://mp.weixin.qq.com/s/*
// @match https://sj.uukanshu.com/read.aspx
// @match https://m.readbook8.com/user/bookcase.php
// @match https://m.readbook8.com/*/*_*.html
// @match https://m.dushu8.com/user/bookcase.php
// @match https://m.dushu8.com/*/*.html
// @exclude /https?:\/\/m\.dushu8\.com\/.*/index_.*\.html/
// @grant none
// ==/UserScript==
javascript:(function () {
try {
function toRE(s) {
var i = s.indexOf('=');
return [new RegExp(i < 0 ? s : s.substring(0, i)), i < 0 ? '' : s.substring(i + 1)];
}
function parseReplacements(query, fn) {
return query.split('&')
.filter(s => s.length > 0)
.map(fn);
}
var replacements = parseReplacements('[?\?]=\u2047', toRE);
function toggleReplacementWrapper() {
this.classList.toggle('replaced');
}
function createReplacementInner(className, text) {
var span = document.createElement('span');
span.className = className;
span.textContent = text;
return span;
}
function createReplacementWrapper(original, replacer) {
var span = document.createElement('span');
span.className = 'replacement replaced';
span.appendChild(createReplacementInner('original', original));
span.appendChild(createReplacementInner('replacer', replacer));
span.addEventListener('click', toggleReplacementWrapper);
return span;
}
function createReplacementStyles() {
var style = document.body.querySelector('style#zhaishuyuan');
if (!style) {
style = document.body.appendChild(document.createElement('style'));
style.id = 'zhaishuyuan';
style.append(document.createTextNode([
'.replacement { border: #0099ff solid 1px; }',
'.replacer { color: #ff6600; }',
'.replacement.replaced .original { display: none; }',
'.replacement:not(.replaced) .replacer { display: none; }',
'.chapter_box { word-wrap: break-word; }',
'.chapter_title {',
' background: #ecfcfc;',
' border: solid 1px #e8e8e8;',
' color: #8dadad;',
' text-align: center;',
'}'
].join('\n')));
return style;
} else {
alert('found embedded <style>');
return null;
}
}
function getBody(content) {
var x = content.indexOf('<body');
x = content.indexOf('>', x);
var y = content.lastIndexOf('</body>');
return content.slice(x + 1, y);
}
function shuchong() {
var pathname = window.location.pathname;
if (pathname.startsWith('/user/bookcase/'))
shuchong_bookcase();
else if (pathname.startsWith('/chapter/'))
shuchong_chapter();
else
alert(pathname);
}
function shuchong_bookcase() {
var links = document.querySelectorAll('.booklist a[data-url][onclick]');
for (var i = 0; i < links.length; i++) {
var link = links[i];
link.href = link.getAttribute('data-url');
link.removeAttribute('data-url');
link.removeAttribute('onclick');
link.setAttribute('target', '_blank');
}
}
function shuchong_chapter() {
var global_find = $;
var prev_store = document.getElementById('prev_store');
if (!prev_store) {
prev_store = document.createElement('div');
prev_store.id = 'prev_store';
prev_store.style.display = 'none';
document.body.appendChild(prev_store);
}
function findPrev(a, b) {
return global_find(a, '#prev_store');
}
function loadPrev(body) {
prev_store.innerHTML = body;
var scripts = prev_store.querySelectorAll('#center script:not([src])');
for (var i = 0; i < scripts.length; i++)
eval(scripts[i].innerText);
return prev_store;
}
function updatePrevChapterLinks(prev_url) {
for (var i = 0; i < nr_pages.length; i++) {
nr_pages[i].firstElementChild.href = prev_url;
}
}
function getPrevUrl(container) {
return container.querySelector('.chapter-page').firstElementChild.href;
}
function invokeDecode(container) {
var scripts = container.querySelectorAll('script:not([src])');
for (var i = 0; i < scripts.length; i++) {
var idx = scripts[i].innerText.indexOf('function getDecode(){');
if (idx >= 0) {
eval(scripts[i].innerText.substring(idx));
getDecode();
}
}
}
function findContent(container) {
invokeDecode(container);
var content = container.querySelector('.chapter-name').nextElementSibling.nextElementSibling;
var a_c = content.querySelectorAll('a.c_red');
for (var i = 0; i < a_c.length; i++)
a_c[i].parentElement.removeChild(a_c[i]);
a_c = content.querySelectorAll('a.c_green');
for (var i = 0; i < a_c.length; i++)
a_c[i].parentElement.removeChild(a_c[i]);
return content;
}
function findTitle(container) {
var title = document.createElement('p');
title.className = 'chapter_title';
var nodes = container.querySelector('.chapter-name').childNodes;
for(var i = 0; i < nodes.length; i++)
title.appendChild(nodes[i]);
return title;
}
function loadPrevChapter() {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', getPrevUrl(document.body), false);
xhr.overrideMimeType('text\/plain; charset=gb2312');
xhr.send();
if (xhr.readyState == 4 && xhr.status == 200) {
var body = getBody(xhr.responseText);
$ = findPrev;
loadPrev(body);
var prev_content = findContent(prev_store);
$ = global_find;
for (var last; last = prev_content.lastElementChild; )
wap_content.insertBefore(last, wap_content.firstElementChild);
var prev_title = findTitle(prev_store);
wap_content.insertBefore(prev_title, wap_content.firstElementChild);
updatePrevChapterLinks(getPrevUrl(prev_store));
} else {
alert('readyState='+xhr.readyState+', status='+xhr.status+', statusText='+xhr.statusText);
}
} catch(e) {
alert(e + '\n' + e.stack);
} finally {
return false;
}
}
if (document.styleSheets.length > 0)
document.styleSheets[0].disabled = true;
var style = createReplacementStyles();
style.append(document.createTextNode('html { -webkit-touch-callout:default; -webkit-user-select:text; }\n'));
style.append(document.createTextNode('#loading, .show, .flt_setting, .copyright, .subhead, .book_clist, .layout-con { display: none; }\n'));
style.append(document.createTextNode('.search-btn {\n'
+' width: 22px;\n'
+' height: 22px;\n'
+' background: url(https:\/\/img.zhaishuyuan.com/zhai/img/sprites.png) -7px -77px no-repeat #49A9A9;\n'
+' border: 0;\n'
+' text-indent: -9999px;\n'
+'}\n'));
var wap_content = findContent(document.body);
wap_content.insertBefore(findTitle(document.body), wap_content.firstElementChild);
var nr_pages = document.querySelectorAll('.chapter-page');
for (var i = 0; i < nr_pages.length; i++) {
var nr_page = nr_pages[i];
nr_page.firstElementChild.onclick = loadPrevChapter;
}
var search = document.querySelector('#search>.search-text');
if (search)
search.removeAttribute('placeholder');
$(window).off('scroll');
var expires = new Date();
expires.setFullYear(expires.getFullYear()+10);
document.cookie = 'buy=1;expires='+expires.toGMTString()+';path=/;';
}
function uukanshu() {
var RE_uukanshu = /[uUuU][uUuU]看书[ ]?[wWwW][wWwW][wWwW][..][uUuU][uUuU][kKkK][aAaA][nNnN][sSsS][hHhH][uUuU][..][cCcC][oOoO][mMmM]/g;
var prev_store = document.getElementById('prev_store');
if (!prev_store) {
prev_store = document.createElement('div');
prev_store.id = 'prev_store';
prev_store.style.display = 'none';
document.body.appendChild(prev_store);
}
function findContent(container) {
var content = container.querySelector('#bookContent');
content.innerHTML = content.innerHTML.replace(RE_uukanshu, '');
var boxes = content.querySelectorAll('.box');
for (var i = 0; i < boxes.length; i++)
boxes[i].parentElement.removeChild(boxes[i]);
return content;
}
function findTitle(container) {
var title = container.querySelector('h3');
return title;
}
function getPrevUrl(container) {
return container.querySelector('.rp-switch #read_pre').href;
}
function loadPrev(body) {
prev_store.innerHTML = body;
return prev_store;
}
function updatePrevChapterLinks(prev_url) {
document.body.querySelector('.rp-switch #read_pre').href = prev_url;
}
function loadPrevChapter(event) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', getPrevUrl(document.body), false);
xhr.overrideMimeType('text/html; charset=utf-8');
xhr.send();
if (xhr.readyState == 4 && xhr.status == 200) {
var body = getBody(xhr.responseText);
loadPrev(body);
var prev_content = findContent(prev_store);
for (var last; last = prev_content.lastChild; )
wap_content.insertBefore(last, wap_content.firstChild);
var prev_title = findTitle(prev_store);
wap_content.insertBefore(prev_title, wap_content.firstChild);
updatePrevChapterLinks(getPrevUrl(prev_store));
} else {
alert('readyState='+xhr.readyState+', status='+xhr.status+', statusText='+xhr.statusText);
}
} catch(err) {
alert(err + '\n' + err.stack);
} finally {
event.stopPropagation();
return false;
}
}
var style = createReplacementStyles();
if (style) {
style.append(document.createTextNode([
'.samebooks1, .share { display: none; }',
'#read-page .rp-switch { padding: 0; }'
].join('\n')));
var wap_content = findContent(document.body);
wap_content.insertBefore(findTitle(document.body), wap_content.firstChild);
var navs = document.querySelectorAll('.rp-switch');
if (navs.length == 1) {
var nav_foot = navs[0];
var nav_head = nav_foot.cloneNode(true);
var nav_next = nav_head.querySelector('a:last-child');
if (nav_next)
nav_head.removeChild(nav_next);
var nav_prev = nav_foot.querySelector('#read_pre');
if (nav_prev)
nav_foot.removeChild(nav_foot.querySelector('#read_pre'));
wap_content.parentNode.insertBefore(nav_head, wap_content);
nav_prev = nav_head.querySelector('#read_pre');
nav_prev.ontouchend = loadPrevChapter;
nav_next = nav_foot.querySelector('#read_next');
}
}
}
function weixin() {
createReplacementStyles();
document.getElementById('meta_content').style.display = 'none';
}
function readbook8() {
var pathname = window.location.pathname;
if (pathname == '/user/bookcase.php')
readbook8_bookcase();
else if (/\/\w+\/\d+(_\d)?\.html/.test(pathname))
readbook8_chapter();
else
alert(pathname);
}
function createStore(id) {
var store = document.getElementById(id);
if (!store) {
store = document.createElement('div');
store.id = id;
store.style.display = 'none';
document.body.appendChild(store);
}
return store;
}
function readbook8_bookcase() {
}
function readbook8_chapter() {
var load_store = createStore('load_store');
function findContent(container) {
return container.querySelector('#chaptercontent');
}
function findNextLinks(container) {
return container.querySelectorAll('a#pb_next');
}
function findPrevLinks(container) {
return container.querySelectorAll('a#pb_prev');
}
function queryContent(url) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.overrideMimeType('text\/plain; charset=gb2312');
xhr.send();
if (xhr.readyState == 4 && xhr.status == 200) {
load_store.innerHTML = getBody(xhr.responseText);
var content = findContent(load_store);
trimContentFooter(content);
trimContentHeader(content);
var nextUrl = findNextLinks(load_store)[0].href;
var prevUrl = findPrevLinks(load_store)[0].href;
return [content.innerHTML, nextUrl, prevUrl];
} else {
alert('readyState='+xhr.readyState+', status='+xhr.status+', statusText='+xhr.statusText);
}
} catch(e) {
alert(e + '\n' + e.stack);
}
}
var RE_pagination = /^(.*)\(第(\d+)\/\d+页\)$/;
function trimContentHeader(content) {
if (content.firstChild.nodeName == '#text') {
var match = RE_pagination.exec(content.firstChild.nodeValue);
if (!match) {
alert('unexpected header: '+content.firstChild.nodeValue);
} else if (match[2] == 1) {
content.firstChild.nodeValue = match[1];
var node = content.firstChild.nextSibling;
while(node && (node.nodeName == 'BR' || node.nodeName == '#text' && /^\s*$/.test(node.nodeValue)))
node = node.nextSibling;
if (node && node.nodeName == '#text' && /^\s*您可以在百度里搜索“.*”查找最新章节!\s*$/.test(node.nodeValue)) {
var next = node.nextSibling;
node.remove();
node = next;
while(node && (node.nodeName == 'BR' || node.nodeName == '#text' && /^\s*$/.test(node.nodeValue))) {
next = node.nextSibling;
node.remove();
node = next;
}
}
} else {
content.removeChild(content.firstChild);
while(content.firstChild.nodeName == 'BR') {
content.removeChild(content.firstChild);
}
}
}
}
function trimContentFooter(content) {
if (content.lastChild.nodeName == '#text' &&
/^ 读书吧中文网阅读网址:[a-z0-9.]*$/.test(content.lastChild.nodeValue)) {
content.removeChild(content.lastChild);
}
while(content.lastChild.nodeName == 'BR') {
content.removeChild(content.lastChild);
}
}
function loadPrevChapter(event) {
try {
var prevLinks = findPrevLinks(document.body);
var page = queryContent(prevLinks[0].href);
if (page) {
var joined = page[0];
var nextUrl = page[1];
var prevUrl = page[2];
while(/\/\d+_\d+\.html/.test(nextUrl)) {
page = queryContent(nextUrl);
if (page) {
joined += page[0];
nextUrl = page[1];
}
}
content.innerHTML = joined + '<br><br>' + content.innerHTML;
for(var i = prevLinks.length; i-- > 0;) {
prevLinks[i].href = prevUrl;
}
}
} catch(err) {
alert(err + '\n' + err.stack);
} finally {
event.stopPropagation();
return false;
}
}
var style = document.body.querySelector('style#clumsyman');
if (style) {
alert('found embedded <style>');
/*return;*/
} else {
style = document.body.appendChild(document.createElement('style'));
style.id = 'clumsyman';
style.append(document.createTextNode([
'#g, #g + div, .layui-row, .addbook { display: none; }',
].join('\n')));
}
var content = findContent(document.body);
if (content) {
trimContentHeader(content);
trimContentFooter(content);
}
var prevLinks = findPrevLinks(document.body);
if (prevLinks.length) {
for(var i = prevLinks.length; i-- > 0;) {
prevLinks[i].onclick = loadPrevChapter;
}
}
var addBook = document.body.querySelector('div.addbook');
if (addBook) {
var addBookMark = addBook.firstElementChild;
if (addBookMark) {
for(var i = prevLinks.length; i-- > 0;) {
prevLinks[i].parentElement.appendChild(addBookMark.cloneNode(true));
}
}
}
var nextLinks = findNextLinks(document.body);
if (nextLinks.length) {
var joined = content.innerHTML;
var nextUrl = nextLinks[0].href;
while(/\/\d+_\d+\.html/.test(nextUrl)) {
var page = queryContent(nextUrl);
if (page) {
joined += page[0];
nextUrl = page[1];
}
}
for(var i = nextLinks.length; i-- > 0;) {
nextLinks[i].href = nextUrl;
}
content.innerHTML = joined;
}
}
function twokzw() {
var pathname = window.location.pathname;
if (/\/\d+\/\d+\/\d+(_\d)?\.html/.test(pathname))
twokzw_chapter();
else
alert(pathname);
}
function twokzw_chapter() {
var load_store = createStore('load_store');
function findContent(container) {
return container.querySelector('#nr1');
}
function findNextLinks(container) {
return container.querySelectorAll('a#pb_next');
}
function findPrevLinks(container) {
return container.querySelectorAll('a#pb_prev');
}
function queryContent(url) {
try {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.overrideMimeType('text\/html; charset=utf-8');
xhr.send();
if (xhr.readyState == 4 && xhr.status == 200) {
load_store.innerHTML = getBody(xhr.responseText);
var content = findContent(load_store);
trimTitle(content);
var nextUrl = findNextLinks(load_store)[0].href;
var prevUrl = findPrevLinks(load_store)[0].href;
return [content.innerHTML, nextUrl, prevUrl];
} else {
alert('readyState='+xhr.readyState+', status='+xhr.status+', statusText='+xhr.statusText);
}
} catch(e) {
alert(e + '\n' + e.stack);
} finally {
load_store.innerHTML = '';
}
}
function completeChapter(chapter) {
while(/\/\d+_\d+\.html/.test(chapter[1])) {
var sequent = queryContent(chapter[1]);
if (sequent) {
var matchE = /\S(<\/p>\s*)$/.exec(chapter[0]);
var matchS = /^(\s*<p>)\S/.exec(sequent[0]);
if (matchE && matchS) {
chapter[0] = chapter[0].slice(0, -matchE[1].length);
sequent[0] = sequent[0].substring(matchS[1].length);
}
chapter[0] += sequent[0];
chapter[1] = sequent[1];
}
}
}
function loadPrevChapter(event) {
try {
var prevLinks = findPrevLinks(document.body);
var chapter = queryContent(prevLinks[0].href);
if (chapter) {
completeChapter(chapter);
content.innerHTML = chapter[0] + content.innerHTML;
for(var i = prevLinks.length; i-- > 0;) {
prevLinks[i].href = chapter[2];
}
}
} catch(err) {
alert(err + '\n' + err.stack);
} finally {
event.stopPropagation();
return false;
}
}
var RE_pagination = /^[-\s]*(.*[^-\s])[-\s]*((\d+)\s*\/\s*\d+)\s*$/;
function trimTitle(content) {
var title = content.parentElement.parentElement.querySelector("H1");
if (title) {
var match = RE_pagination.exec(title.innerText);
if (!match) {
alert('unexpected title: '+title);
} else if (match[2] == 1) {
title.innerText = match[1];
content.insertBefore(title, content.firstChild);
}
}
return title;
}
var style = document.body.querySelector('style#clumsyman');
if (style) {
alert('found embedded <style>');
return;
} else {
style = document.body.appendChild(document.createElement('style'));
style.id = 'clumsyman';
style.append(document.createTextNode([
'#nr_title { font-size: 20px; font-weight: bold; }'
].join('\n')));
}
var content = findContent(document.body);
if (content) {
document.title = trimTitle(content).innerHTML;
}
var nextLinks = findNextLinks(document.body);
if (nextLinks.length) {
var tdNext = nextLinks[0].parentElement;
var tdMulu = tdNext.previousElementSibling;
if (tdMulu.className = 'mulu') {
tdMulu.querySelector('a').text = '返回目录';
var bookmark = document.body.querySelector('#shuqian');
if (bookmark) {
tdMulu.parentElement.insertBefore(shuqian.parentElement, tdMulu);
}
}
var table = tdNext;
while(table.tagName != 'TABLE') table = table.parentElement;
var nr_page = table.parentElement;
while(table.previousElementSibling)
nr_page.removeChild(table.previousElementSibling);
while(table.nextElementSibling)
nr_page.removeChild(table.nextElementSibling);
nr_page.innerHTML;
document.body.querySelector('.nr_page').innerHTML = nr_page.innerHTML;
nextLinks = findNextLinks(document.body);
var chapter = [content.innerHTML, nextLinks[0].href];
completeChapter(chapter);
content.innerHTML = chapter[0];
for(var i = nextLinks.length; i-- > 0;) {
nextLinks[i].text = '下一章';
nextLinks[i].href = chapter[1];
}
}
var prevLinks = findPrevLinks(document.body);
if (prevLinks.length) {
for(var i = prevLinks.length; i-- > 0;) {
prevLinks[i].onclick = loadPrevChapter;
}
}
}
function mismatch() {
alert(window.location.hostname);
}
var handlers = {
'www.shuchong.info': shuchong,
'mp.weixin.qq.com': weixin,
'sj.uukanshu.com': uukanshu,
'm.readbook8.com': readbook8,
'm.dushu8.com': readbook8,
'm.2kzw.cc': twokzw,
};
(handlers[window.location.hostname] || mismatch)();
} catch(e) {
alert(e + '\n' + e.stack);
}
})();