笔趣阁CC
https://www.bqgl.cc/
zpccool (13551) 1天前 下载:420
小说 novel free
bqgl.cc real parser
// @name 笔趣阁CC
// @version 1.0.2
// @uuid biqugelaile
// @author Ai
// @url https://www.bqgl.cc/
// @enabled true
// @tags novel,free
// @description bqgl.cc real parser
async function TEST(type) {
if (type === '__list__') return ['search', 'explore', 'bookInfo', 'chapterList', 'chapterContent'];
if (type === 'search') {
var r = await search('\u673a\u6b66', 1);
return { passed: r && r.length > 0, message: 'search results=' + (r ? r.length : 0) };
}
if (type === 'explore') {
var e = await explore(1, '\u6392\u884c');
return { passed: e && e.length > 0, message: 'explore results=' + (e ? e.length : 0) };
}
if (type === 'bookInfo') {
var b = await bookInfo(BASE + '/look/104952/');
return { passed: !!b.name, message: 'book=' + b.name + ' author=' + b.author };
}
if (type === 'chapterList') {
var cs = await chapterList(BASE + '/look/104952/');
return { passed: cs && cs.length > 20, message: 'chapters=' + (cs ? cs.length : 0) };
}
if (type === 'chapterContent') {
var text = await chapterContent(BASE + '/look/104952/1.html');
return { passed: text && text.length > 200 && text.indexOf('userverify') < 0, message: 'content len=' + (text ? text.length : 0) };
}
}
var BASE = 'https://www.bqgl.cc';
var UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36';
var HEADERS = { 'User-Agent': UA, 'Referer': BASE + '/', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' };
var CATS = { '玄幻': '/xuanhuan/', '武侠': '/wuxia/', '都市': '/dushi/', '历史': '/lishi/', '网游': '/wangyou/', '科幻': '/kehuan/', '女生': '/mm/', '排行': '/top/', '完本': '/finish/' };
function abs(href) {
if (!href) return '';
if (href.indexOf('//') === 0) return 'https:' + href;
return href.indexOf('http') === 0 ? href : BASE + (href.charAt(0) === '/' ? href : '/' + href);
}
function clean(s) {
return (s || '').replace(/<script[\s\S]*?<\/script>/gi, '').replace(/<style[\s\S]*?<\/style>/gi, '').replace(/<[^>]+>/g, '').replace(/ /g, ' ').replace(/\s+/g, ' ').trim();
}
function cleanContentHtml(html) {
var text = (html || '')
.replace(/<p class="readinline"[\s\S]*?<\/p>/gi, '')
.replace(/<script[\s\S]*?<\/script>/gi, '')
.replace(/<style[\s\S]*?<\/style>/gi, '')
.replace(/<br\s*\/?>/gi, '\n')
.replace(/<\/p>\s*<p[^>]*>/gi, '\n')
.replace(/<[^>]+>/g, '')
.replace(/ /g, ' ')
.replace(/&/g, '&')
.replace(/(本章未完,请翻页)/g, '')
.replace(/\(本章未完,请翻页\)/g, '')
.replace(/请收藏本站:[\s\S]*$/g, '')
.replace(/请收藏:https:\/\/m\.bqgl\.cc[\s\S]*$/g, '')
.replace(/『点此报错』[\s\S]*$/g, '')
.replace(/\n\s*\n+/g, '\n')
.replace(/[ \t]+/g, ' ')
.trim();
if (text.indexOf('加载中') >= 0 || text.indexOf('userverify') >= 0) return '';
return text;
}
function readableUrl(url) {
url = abs(url);
if (url.indexOf('?') >= 0) return url;
return url + '?1';
}
async function getHtml(url) {
return '' + await legado.http.get(url, HEADERS);
}
function parseBooks(html, kind) {
var doc = legado.dom.parse('' + html);
var out = [], seen = {};
function pushFromLink(a, author, intro, cover, itemKind) {
var href = legado.dom.attr(a, 'href') || '';
if (href.indexOf('/look/') === -1) return;
var url = abs(href);
var name = clean(legado.dom.text(a));
if (!name || seen[url]) return;
seen[url] = true;
out.push({ name: name, author: clean(author), bookUrl: url, tocUrl: url, intro: clean(intro), coverUrl: abs(cover || ''), kind: itemKind || kind || '' });
}
var items = legado.dom.selectAll(doc, '.item');
for (var i = 0; i < items.length; i++) {
var a = legado.dom.select(items[i], 'dt a[href*="/look/"]') || legado.dom.select(items[i], 'a[href*="/look/"]');
if (!a) continue;
var author = legado.dom.selectText(items[i], 'dt span') || '';
var intro = legado.dom.selectText(items[i], 'dd') || '';
var img = legado.dom.select(items[i], 'img');
var cover = img ? (legado.dom.attr(img, 'src') || '') : '';
pushFromLink(a, author, intro, cover, kind);
}
var rows = legado.dom.selectAll(doc, 'ul.lis li, .up li, .blocks li');
for (var j = 0; j < rows.length; j++) {
var a2 = legado.dom.select(rows[j], 'span.s2 a[href*="/look/"]') || legado.dom.select(rows[j], 'a[href*="/look/"]');
var au = legado.dom.selectText(rows[j], 'span.s3') || legado.dom.selectText(rows[j], 'span.s5') || '';
var kd = legado.dom.selectText(rows[j], 'span.s1') || kind || '';
if (a2 && !au) {
var rowText = clean(legado.dom.text(rows[j]));
var linkText = clean(legado.dom.text(a2));
if (rowText.indexOf(linkText + '/') === 0) au = rowText.substring(linkText.length + 1);
}
if (a2) pushFromLink(a2, au, '', '', kd);
}
legado.dom.free(doc);
return out;
}
async function search(keyword, page) {
if (page > 1 || !keyword) return [];
var paths = ['/', '/xuanhuan/', '/wuxia/', '/dushi/', '/lishi/', '/wangyou/', '/kehuan/', '/mm/', '/top/'];
var lower = (keyword || '').toLowerCase();
var pool = [];
for (var p = 0; p < paths.length; p++) {
try { pool = pool.concat(parseBooks(await getHtml(BASE + paths[p]), '')); } catch (e) {}
}
var seen = {}, matched = [];
for (var k = 0; k < pool.length; k++) {
var b = pool[k];
if (seen[b.bookUrl]) continue;
seen[b.bookUrl] = true;
var hay = (b.name + ' ' + b.author + ' ' + b.intro).toLowerCase();
if (hay.indexOf(lower) >= 0) matched.push(b);
}
return matched;
}
async function bookInfo(bookUrl) {
bookUrl = abs(bookUrl);
var html = await getHtml(bookUrl);
var doc = legado.dom.parse(html);
var name = legado.dom.selectAttr(doc, 'meta[property="og:novel:book_name"]', 'content') || legado.dom.selectText(doc, 'h1') || '';
var author = legado.dom.selectAttr(doc, 'meta[property="og:novel:author"]', 'content') || '';
var cover = legado.dom.selectAttr(doc, 'meta[property="og:image"]', 'content') || legado.dom.selectAttr(doc, '.image img', 'src') || '';
var intro = legado.dom.selectAttr(doc, 'meta[name="description"]', 'content') || legado.dom.selectText(doc, '.intro dd') || '';
var kind = legado.dom.selectAttr(doc, 'meta[property="og:novel:category"]', 'content') || '';
var latest = legado.dom.selectAttr(doc, 'meta[property="og:novel:latest_chapter_name"]', 'content') || '';
var latestUrl = legado.dom.selectAttr(doc, 'meta[property="og:novel:latest_chapter_url"]', 'content') || '';
legado.dom.free(doc);
return { name: clean(name), author: clean(author), bookUrl: bookUrl, tocUrl: bookUrl, coverUrl: abs(cover), intro: clean(intro), kind: clean(kind), lastChapter: clean(latest), latestChapter: clean(latest), latestChapterUrl: abs(latestUrl) };
}
async function chapterList(tocUrl) {
tocUrl = abs(tocUrl);
var html = await getHtml(tocUrl);
var doc = legado.dom.parse(html);
var links = legado.dom.selectAll(doc, '.listmain a[href*="/look/"], #list a[href*="/look/"]');
var out = [], seen = {};
for (var i = 0; i < links.length; i++) {
var href = legado.dom.attr(links[i], 'href') || '';
if (!/\/look\/\d+\/\d+\.html$/.test(href)) continue;
var url = abs(href);
var name = clean(legado.dom.text(links[i]));
if (name && !seen[url]) {
seen[url] = true;
out.push({ name: name, url: url });
}
}
legado.dom.free(doc);
return out;
}
async function chapterContent(chapterUrl) {
var html = await getHtml(readableUrl(chapterUrl));
var doc = legado.dom.parse(html);
var el = legado.dom.select(doc, '#chaptercontent') || legado.dom.select(doc, '#content') || legado.dom.select(doc, '.content');
var content = el ? cleanContentHtml(legado.dom.html(el)) : '';
legado.dom.free(doc);
return content;
}
async function explore(page, category) {
if (!category || category === 'GETALL') return Object.keys(CATS);
if (page > 1) return [];
var path = CATS[category] || CATS['玄幻'];
return parseBooks(await getHtml(BASE + path), category);
}