// ==UserScript==
// @name 起点小说vip自动换源
// @namespace http://tampermonkey.net/
// @version 1.0
// @description 对起点的vip小说自动搜索笔趣阁,要设置滚动模式,自动加载形式,支持手机和网页
// @author JucyZhu
// @match https://m.qidian.com/book/*
// @match https://read.qidian.com/chapter/*
// @match https://vipreader.qidian.com/chapter/*
// @require https://cdn.bootcss.com/jquery/1.9.0/jquery.min.js
// @connect www.xbiquge.la
// @connect m.xbiquge.la
// @run-at document-end
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
//'use strict';
// Your code here...
// 声明全局参数
var data = {
book: {},
currentChapter: {},
chapters: [],
isApp: false
},
chapterNum = 0,
first_time = true,
lock = false,
show = false,
searchurl = "http://www.xbiquge.la/modules/article/waps.php";
getBookChapterInfor();
if ($(".j_subscribeBtn").length > 0 || $(".btn-primary").length > 0) {
getBookContents()
}
$(window).scroll(function() {
if (data.isApp) {
show = ($(".read-article .read-section").last().offset().top - $(document).scrollTop() < $(
window).height());
} else {
show = ($("#j_chapterBox .text-wrap:last").offset().top - $(document).scrollTop() < $(window)
.height());
}
updata();
if (($(window).scrollTop() * 1.05 > $(document).height() - $(window).height()) && show && lock) {
lock = false;
loadbook();
}
});
//统一事件执行
function updata() {
//有没有到vipstate==0 &&(登录按钮,订阅按钮长度大于0(有.btn-primary)
//或者.j_subscribeBtn vip章节全部订阅和订阅本章按钮长度大于0
//或者发现.w-all前往vip章节长度大于0)
getBookContents()
if (data.currentChapter.vipState == 0) {
if ($(".btn-primary").length > 0) {
//手机版
data.currentChapter.vipState = 1;
data.currentChapter.chapterName = $(".read-article .read-section h3").last().text();
$(".btn-primary").remove();
findLastChapter()
data.currentChapter.id = data.currentChapter.id + 1
} else if ($(".j_subscribeBtn").length > 0 || $(".w-all").length > 0) {
//网页版
data.currentChapter.vipState = 1;
data.currentChapter.chapterName = $(".text-head:last h3 span:last").text()
findLastChapter()
$(".w-all").remove();
data.currentChapter.id = data.currentChapter.id + 1
}
//findLastChapter()
} else if (data.currentChapter.vipState == 1) {
if (data.isApp) {
chapterNum = $(".read-section").length
} else {
chapterNum = $(".text-wrap").length
}
}
};
function loadbook() {
//updata();
//更新data
if (chapterNum > 3) {
if (data.isApp) {
$(".read-section").first().remove()
chapterNum = $(".read-section").length
} else {
$(".text-wrap").first().remove()
chapterNum = $(".text-wrap").length
}
}
if (data.currentChapter.vipState == 1 && chapterNum <= 3) {
insertCurrentVipContents();
//console.log(data);
}
};
function findLastChapter() {
//遍历目录找到当前目录的url
var chapter = "";
var current_chapter = data.currentChapter.chapterName;
if (data.chapters.length > 0) {
console.log("------已获取《" + data.book.bookName + "》的目录------")
for (var i = 0, len = data.chapters.length; i < len; i++) {
chapter = data.chapters[i].text;
if (current_chapter == chapter || current_chapter.indexOf(chapter) != -1 ||
chapter
.indexOf(current_chapter) != -1) {
data.currentChapter.id = i;
break;
}
}
} else {
console.log("章节目录没有解析到");
first_time = true;
//return getBookContents();
}
};
function getBookChapterInfor() {
if (typeof(g_data.book) == "undefined") {
//说明是电脑网页端
data.book.bookName = g_data.bookInfo.bookName;
data.book.authorName = g_data.bookInfo.authorName;
data.currentChapter.chapterName = $(".j_chapterName:last span:first").text();
data.currentChapter.vipState = g_data.chapter.vipStatus;
//data.currentChapter.content = [];
data.currentChapter.id = 0;
data.isApp = false;
} else {
//手机网页端
data.book.bookName = g_data.book.bookName;
data.book.authorName = g_data.book.authorName;
data.currentChapter.chapterName = g_data.chapter.chapterName;
data.currentChapter.vipState = g_data.chapter.vipStatus;
//data.currentChapter.content = [];
data.currentChapter.id = 0;
data.isApp = true;
}
//data = tmp_data;
//console.log(tmp_data);
//return new Promise((resolve) => setTimeout(resolve, time));
return data;
};
//根据章节名获取笔趣阁的目录列表,并赋值给data.chapters
function getBookContents() {
//从当前页面获取小说名称和当前章节
//getBookChapterInfor();
//仅第一次运行
if (first_time) {
first_time = false;
//console.log(data.book.booName);
console.log("------开始加载VIP章节信息------");
//根据bookname搜索书籍,返回response
runAsync(searchurl, "POST", "searchkey=" + data.book.bookName).then((result) => {
//根据搜索结果 解析出符合要求的书籍url
//根据搜索结果解析小说网址
function parseURL(result) {
//console.log(result.responseText);
var responseText = result.responseText;
// 解析笔趣阁标题和内容
var $html = $('<div></div>').html(responseText);
var $table = $("tbody tr", $html);
//console.log($table.text())
var title = "",
author = "",
href = "";
//console.log(data);
for (var i = 0, len = $table.length; i < len; i++) {
title = $(".even a", $table[i]).text();
author = $(".even:last", $table[i]).text();
//console.log(title+" "+author)
if (title == data.book.bookName && author == data.book.authorName) {
href = $(".even a", $table[i]).attr("href");
break;
}
}
return runAsync(href, "GET", "")
}
// 根据小说网址请求获取小说章节信息
return parseURL(result);
//console.log(url);
}).then((response) => {
//根据请求结果response 解析 目录查找到适合当前及下一章的url,并请求获得promise结果
function parseChaptersURL(response) {
var responseText = response.responseText;
//console.log(responseText);
// 解析笔趣阁的小说目录
var $html = $('<div></div>').html(responseText);
data.chapters = $("#list dl a", $html);
//初始化当前章节id序号
//遍历目录找到当前目录的url
if(data.currentChapter.vipState == 1){
findLastChapter();
insertCurrentVipContents();
}
return response
};
return parseChaptersURL(response);
})
}
};
//根据当前章节名称,如果是vip则从笔趣阁获取内容资源并插入
function insertCurrentVipContents() {
//根据找到的当前章节url获取说内容并解析
console.log("------正在请求《" + data.currentChapter.chapterName + "》的内容------")
var href = "http://www.xbiquge.la" + $(data.chapters[data.currentChapter.id]).attr("href")
GM_xmlhttpRequest({
method: "GET",
url: href,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
},
data: "",
onload: function(response) {
//console.log("请求成功");
function parseChaptersContent(response) {
var responseText = response.responseText;
// 解析笔趣阁的小说目录
var $html = $('<div></div>').html(responseText);
var contents = $("#content", $html).text().replace($(
"#content p", $html)
.text(), "").split("\n\n");
//插入网页
insertChapter(contents);
}
parseChaptersContent(response);
},
onerror: function(response) {
console.log("请求失败: href: " + href);
}
})
};
// 插入文章
function insertChapter(contents) {
var section, paragraph, p = "",
i = 0,
mlen = -1;
//contents = data.currentChapter.content;
//console.log("------开始插入" + data.currentChapter.chapterName + "------")
//console.log(data)
if (data.isApp) {
//console.log("------开始加载下一章1------");
//手机中插入
chapterNum = $(".read-section").length
section = $(".read-article .read-section").last();
//$(".btn-primary", section).remove();
$(".read-article").append(section.clone());
section = $(".read-article .read-section").last();
paragraph = $("p", section).first();
$(".btn-primary", section).remove();
$("p", section).remove();
$("h3", section).text(data.currentChapter.chapterName);
for (i = 0, mlen = contents.length; i < mlen; i++) {
p = contents[i];
paragraph.text(p);
section.append(paragraph.clone());
}
//$(".read-article .read-section").eq(-2).remove();
} else {
chapterNum = $(".text-wrap").length
//web中插入
section = $("#j_chapterBox .text-wrap:last");
$("#j_chapterBox").append(section.clone());
section = $("#j_chapterBox .text-wrap:last");
//$("#j_chapterBox .text-wrap").eq(-2).remove()
//section = $("#j_chapterBox .text-wrap:last");
paragraph = $(".read-content p:first", section);
$(".vip-limit-wrap", section).remove();
$(".admire-wrap", section).remove();
$(".read-content p", section).remove();
$("h3:first span:first", section).text(data.currentChapter.chapterName);
for (i = 0, mlen = contents.length; i < mlen; i++) {
p = contents[i];
paragraph.text(p);
$(".read-content", section).append(paragraph.clone());
}
}
data.currentChapter.id = data.currentChapter.id + 1;
data.currentChapter.chapterName = data.chapters[data.currentChapter.id].text;
console.log("------已经插入<<" + data.chapters[data.currentChapter.id - 1].text + ">>------")
lock = true;
};
function runAsync(url, send_type, data_ry) {
console.log("请求数据: url: " + url + " method: " + send_type + " data: " + data_ry);
var p = new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: send_type,
url: url,
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
},
data: data_ry,
onload: function(response) {
//console.log("请求成功");
//console.log(response.responseText);
//resolve(response.responseXML);
resolve(response);
},
onerror: function(response) {
console.log("请求失败: url: " + url + " method: " + send_type +
" data: " +
data_ry);
reject("请求失败: url = " + url);
}
});
})
return p;
};
//截取str中startStr和endStr之间的元素
function stringBetween(str, startStr, endStr) {
var start = str.indexOf(startStr),
end = str.indexOf(endStr);
console.log("start = " + start + ";end = " + end)
var doc = str.substring(start, end) + endStr;
return doc;
}
})();