文獻互助小幫手:①讀秀PDF一鍵下載 ②圖書館聯盟、讀秀、超星、中美百萬顯示SSID等索書號 ③各文獻站、圖書電商站與豆瓣的互訪鏈接 ④一鍵複製元數據

①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。

目前為 2022-11-18 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/455011/1118359/nbsp%20test.js

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         nbsp test
// @name:zh-CN   文献互助小帮手:①读秀PDF一键下载 ②图书馆联盟、读秀、超星、中美百万显示SSID等索书号 ③各文献站、图书电商站与豆瓣的互访链接 ④一键复制元数据
// @name:zh-TW   文獻互助小幫手:①讀秀PDF一鍵下載 ②圖書館聯盟、讀秀、超星、中美百萬顯示SSID等索書號 ③各文獻站、圖書電商站與豆瓣的互訪鏈接 ④一鍵複製元數據
// @name:en      Literature mutual helper
// @name:ja      文献相互支援
// @namespace    ucdrs.superlib.net
// @version      1.10.4
// @update-note  修复:去除图书url中掺入的“多抓鱼”,去除一键复制元数据中的某些杂项
// @update-note  修复:cadal搜索页面上元素检测bug导致页面卡死,感谢bojack反馈 https://greasyfork.org/zh-CN/scripts/435569/discussions/157134#comment-343066
// @update-note  其它:跟进freembook新政策,获取图书秒传码不再限制次数(改为999次/日)
// @author       Theron
// @icon         data:image/png;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAACMuAAAjLgAAAAAAAAAAAAD///////////39///6+v//+/v///39//////////////7+///+/v///////////////////v7///////////////////z8///+/v////////7+////////4uL//0pJ//+wsP///////+np//9wb///vr7///////////////////////9ycf//Jyf//3h4//+np///4uL//+7u//9FRf//Cgn//+7u//+5uf//BQT//wAA//+jo/////////v7////////s7P//xoa//8XF///ISD//w4N//8tLP//f3///yoq//9YWP////////////8zMv//W1v////////7+////Pz///////89PP//hYT////////T0///Bgb//46O//+1tf//Bgb//+jo////////XFz//0tK////////+/v///z8////////ODf//4KB////////7u7//xUU///Pz////v7//w0M//+srP///////2Rk//9CQf////////z8///8/P///////0hI//8MC///NjX//yoq//8BAP//ysr///////8xMf//d3f///////9ubv//OTj////////8/P///Pz///////8+Pf//YWD//9nZ//+4t///Dg3//8fH////////VlX//1JS////////eHj//zEw/////////f3///z8////////Ojn//4SD////////7u7//xQT///Gxv///////29v//88O////////4GA//8qKf////////39///8/P///////0VF//8jIv//Y2L//1JR//8FBP//ysn///////+Fhf//Ly7///////+Skf//Jib////////+/v///Pz///////9CQv//PDv//5KS//95ef//Dw7//7Gx//9HRv//IyP//xEQ//9xcf//Ozr//yQk//////////////z8////////PDz//4aG////////7u7//xsa//+5uf//jY3//zw7//8NDP//ZWX//1VU//9vb////f3////////8/P///////0JC//85OP//j4///3h3//8HBv//x8f///////+NjP//Hx///////////////////////////////f3///////+Ghv//TEz//1NS//9TUv//VFP//9XV////////gYH//wAA///o6P////////v7///////////////////////////////////////////////////9/f///////7u7//+Ojv//6+v////////+/v////////////////////////39///7+///+/v///v7///7+////v7/////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
// @match        *://book.ucdrs.superlib.net/views/specific/*
// @match        *://book.ucdrs.superlib.net/search*
// @match        *://book.dglib.superlib.net/views/specific/*
// @match        *://book.dglib.superlib.net/search*
// @match        *://search.douban.com/book/subject_search*
// @match        *://book.douban.com/isbn/*
// @match        *://book.douban.com/subject_search*
// @match        *://book.douban.com/tag/*
// @match        *://book.douban.com/subject/*
// @match        *://book.douban.com/series/*
// @match        *://book.douban.com/works/*
// @match        *://book.douban.com/producers/*
// @match        *://book.douban.com/press/*
// @match        *://book.douban.com/author/*/books*
// @match        *://book.douban.com/people/*/wish*
// @match        *://book.douban.com/people/*/do*
// @match        *://book.douban.com/people/*/collect*
// @match        *://www.douban.com/doulist/*
// @match        *://book.douban.com/cart*
// @match        *://cadal.edu.cn/cadalinfo/search*
// @match        *://cadal.edu.cn/cardpage/bookCardPage?*ssno=*
// @match        *://fx.ccelib.com/detail_*
// @match        *://fx.ccelib.com/s?*
// @match        *://www.ncpssd.org/Literature/ancientbooklist.aspx*
// @match        *://www.ncpssd.org/Literature/articleinfo.aspx*
// @match        *://www.digital.archives.go.jp/DAS/meta/*
// @match        *://www.digital.archives.go.jp/file/*.html
// @match        *://e.jd.com/*.html*
// @match        *://item.jd.com/*.html*
// @match        *://e.dangdang.com/products/*.html*
// @match        *://product.dangdang.com/*.html*
// @match        *://read.douban.com/ebook/*/*
// @match        *://www.dedao.cn/ebook/detail?*
// @match        *://www.bookschina.com/*
// @match        *://citic.cmread.com/zxHtml/html/paperBookDetailShare.html?*
// @match        *://www.kongfz.com/publisher/*/*
// @match        *://www.kongfz.com/writer/*/*
// @match        *://shop.kongfz.com/*
// @match        *://book.kongfz.com/*/*/*
// @match        *://book.kongfz.com/C*/*
// @match        *://item.kongfz.com/*
// @match        *://search.kongfz.com/product_result/?*
// @match        *://search.kongfz.com/item_result/?*
// @match        */n/slib/book/slib/*
// @match        */n/jpgfs/book/base/*
// @require      https://greasyfork.org/scripts/450973-gb2312utf8/code/GB2312UTF8.js?version=1091107
// @require      https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/jszip/3.9.1/jszip.min.js
// @require      https://cdn.bootcdn.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// @include      */search?*
// @include      *bookDetail.jsp?*
// @include      *chapter.jsp?*
// @include      *book.do?*
// @exclude      *://*.google./*
// @exclude      *://*.bing./*
// @description  ①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。
// @description:zh-CN  ①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。
// @description:zh-tw ①讀秀試讀或者包庫全文、匯雅電子書的一鍵下載 ② 在圖書館參考諮詢聯盟(ucdrs)或讀秀(duxiu)以及他們鏡像站上顯示文獻的ssid或dxid,用於圖書文獻互助、羣組找書等場景;顯示大學數字圖書館國際合作計劃(cadal)的書號-ssno,用於查詢下載中美百萬書冊;顯示社科文獻中心、日本內閣文庫等文獻站點的索書號。 ③ 提供各文獻站點、圖書電商和豆瓣圖書的互訪鏈接。 ④ 一鍵複製各文獻站點的索書號、圖書元數據。 To搜索[紅太狼的平底鍋]的朋友:提供紅太狼的平底鍋的部分功能,如顯示ssid,但不提供售賣,下載請自行找百度網盤羣組;顯示dxid或其它索書號、雙向鏈接、一鍵複製等爲平底鍋沒有的新加功能。
// @description:en ①Show ssid/dxid from Library Reference Alliance (ucdrs) or Duxiu (duxiu) ②Show ssno from CADAL ③Provide links from ucdrs, duxiu, cadal to Douban Books
// @description:ja ①LibraryReference Alliance(ucdrs)またはDuxiu(duxiu)からssid / dxidを取得②ZhongmeiMillion(cadal)からssnoを取得③ucdrs、duxiu、cadalからDoubanBooksへのリンクを提供
// @grant       GM_registerMenuCommand
// @grant       GM_unregisterMenuCommand
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_xmlhttpRequest
// @grant       GM_addStyle
// @license     Copyright Theron
// ==/UserScript==

/* jslint esversion: 6 */
/*globals jQuery, GB2312UTF8, JSZip, saveAs */

function bookid2link(bookid) {
    var lib;
    if (bookid.match(/^\d{8}$/)) {
        bookid = bookid.slice(0, 7);
        lib = "duxiu";
    } else if (bookid.match(/^CD\d{8}$/i)) {
        bookid = bookid.slice(2, 9);
        lib = "cadal";
    } else if (bookid.match(/^BC\d{8}$/i)) {
        bookid = bookid.slice(2, 9);
        lib = "ncpssd";
    } else if (bookid.match(/^[MF]\d{19}$/i)) {
        bookid = bookid.slice(15, 20);
        lib = "najda";
    }
    return "https://pan.baidu.com/disk/home?from=newversion&stayAtHome=true&_at_=" + Date.now() + "#/all?vmode=list&path=%2Fyysk.org%2F" + lib + "%2F" + bookid.split("").join("%2F");
}

function showLink() {
    showlink = GM_getValue("showlink", "n");
    GM_setValue("showlink", showlink === "n" ? "y" : "n");
    showlink = GM_getValue("showlink", "n");
    GM_unregisterMenuCommand(menuid_showlink);
    menuid_showlink = GM_registerMenuCommand(showlink === "n" ? "改为显示链接" : "改为隐藏链接", showLink, "l");
    alert(showlink === "y" ? "将显示图书ID到百度网盘存储路径的链接,刷新页面生效" : "不再显示图书ID到百度网盘存储路径的链接,刷新页面生效");
}

var showlink = GM_getValue("showlink", "n");
var menuid_showlink = GM_registerMenuCommand(showlink === "n" ? "改为显示链接" : "改为隐藏链接", showLink, "l");
function ss2rc() {
    enablerc = GM_getValue("enablerc", "n");
    GM_setValue("enablerc", enablerc === "n" ? "y" : "n");
    enablerc = GM_getValue("enablerc", "n");
    GM_unregisterMenuCommand(menuid_enablerc);
    menuid_enablerc = GM_registerMenuCommand(enablerc === "n" ? "芝麻开门" : "芝麻关门", ss2rc, "z");
    alert(enablerc === "y" ? "将尝试获取ssid对应图书的秒传码,此为试验性功能,随时可能失效,请低调使用。使用方法:右键点击ssid右侧的📋,每日限3次。" : "不再尝试获取ssid对应图书的秒传码");
}

var enablerc = GM_getValue("enablerc", "n");
var menuid_enablerc = GM_registerMenuCommand(enablerc === "n" ? "芝麻开门" : "芝麻关门", ss2rc, "z");

var html = document.documentElement.innerHTML;
// 允许连续失败的最大次数
const max_failscnt = 5;
// 页面下载失败,下次尝试前等待的秒数
const gap_fails = 30;
// 页面下载间隔随机秒数的上限、下限
const sleep_max = 8;
const sleep_min = 3;
const fmblimits = 999;

(function () {
    'use strict';
    function ogetk(object, key, default_value) {
        var result = object[key];
        return (typeof result !== "undefined") ? result : default_value;
    }
    function slim(s) {
        return s.replaceAll(/  +/g, "").trim();
    }
    function showbid(bookid, idtype, p=1) {
        var title = "";
        var rate = "";
        var prefix = "";
        if (idtype == "SS号") {
            prefix = bookid.slice(0, 4);
            rate = ogetk(rate_ssid, prefix, "-");
            title = rate === "-" ? "库存无此书-灰色" : prefix + "号段库存率为" + rate + "%";
        } else if (idtype == "DX号") {
            title = "此为下架书,命中几率低,须先查得对应的SSID";
        } else if (idtype == "SSNO<br>") {
            prefix = bookid.replace(/CD/, "").slice(0, 4);
            rate = ogetk(rate_ssno, prefix, "-");
            title = rate === "-" ? "库存无此书-灰色" : prefix + "号段库存率为" + rate + "%";
        }
        var title_type = {"SS号": "ssid / SuperStar ID", "DX号": "dxid / Duxiu ID", "SSNO<br>": "CADAL用于编目的SSNO", "BCID": "社科院文献中心编目的barcodenum", "DAID": "日本国立公文书馆内阁文库文献编号,有F和M开头两类,分别为辑合/单本的ID"}[idtype];
        var color = rate === "-" ? "grey" : "blue";
        var opacity = rate === "-" ? 1 : (parseFloat(rate) / 100 + 0.2);
        var bookid_snippet = `<span style="color: red; padding-right: 3px;" title="${title_type}">${idtype}</span><span class="bid" style="color: ${color}; font-weight: bold; opacity: ${opacity}">${bookid}</span>`;
        if (showlink === "y") {
            var link = bookid2link(bookid);
            bookid_snippet = `<a href="${link}" target="_blank" style="text-decoration: none;">${bookid_snippet}</a>`;
        }
        if (p !== 1) {
            return bookid_snippet;
        }
        return `<p title="${title}" style="width: 120%; margin-left: -20px; font-size: 85%; text-align: center; margin-top: 5px; margin-bottom: 5px; clear:both;">${bookid_snippet}</p>`;
    }
    function sepit(s, sep) {
        if (sep === "|") {
            s = " | " + s;
        } else if (sep === "br") {
            s = s + "<br>";
        } else if (sep === "p") {
            s = `<p style="text-align: center">${s}</p>`;
        } else if (sep) {
            s = sep + s;
        }
        return s;
    }
    function shortenbkn(s) {
        s = s.trim().replace(/(.)[\[【\((].*/, "$1");
        while (s.includes(" ") && s.replace(/[A-z0-9]{2}/g, "的").length > 20) {
            s = s.replace(/ [^ ]*$/, "");
        }
        return s;
    }
    function ucdrslink(bookname, isbn = "", args = {}) {
        var args0 = {"sep": "", text: "参考联盟", cls: "", style: ""};
        args = args === {} ? args0 : Object.assign({}, args0, args);
        var sep = args.sep;
        var text = args.text;
        var cls = args.cls;
        var style = args.style;
        if (!style.includes("font-size")) style += "font-size: 90%;";
        if (text === "") text = "参考联盟";
        var r = sepit(`<a href="http://book.ucdrs.superlib.net/search?sw=${isbn ? isbn : bookname.replace(/^\[.*?\]/, "")}&bCon=&ecode=utf-8&channel=search&Field=${isbn ? "All" : "1"}" target="_blank" class="${cls}" style="${style}" title="参考联盟">${text}</a>`, sep);
        return r.replace(' class=""', '').replace(' style=""', '');
    }
    function ucdrslink4db(bookname, args = {"sep": "|"}) {
        args.style = "font-size: 80%; color: orange;";
        return ucdrslink(bookname, "", args);
    }
    function dzylink(key, args = {}) {
        var args0 = {"sep": "|", text: "多抓鱼", cls: "", style: ""};
        args = args === {} ? args0 : Object.assign({}, args0, args);
        var sep = args.sep;
        var text = args.text;
        var cls = args.cls;
        var style = args.style;
        if (!style.includes("font-size")) style += "font-size: 90%;";
        if (text === "") text = "多抓鱼";
        var r = sepit(`<a href="https://www.duozhuayu.com/search/book/${key.replace(/\//g, '')}" target="_blank" class="${cls}" style="${style}" title="多抓鱼">${text}</a>`, sep);
        return r.replace(' class=""', '').replace(' style=""', '');
    }
    function dblink(bookname, isbn = "", args = {}) {
        var args0 = {"sep": "|", "text": "", "cls": "", "style": ""};
        args = args === {} ? args0 : Object.assign({}, args0, args);
        var sep = args.sep;
        var text = args.text;
        var cls = args.cls;
        var style = args.style;
        if (!style.includes("font-size")) style += "font-size: 90%;";

        // color: blue
        var dbname = isbn === "" ? "豆瓣搜索" : "豆瓣直达";
        if (text === "") text = dbname;
        if (pageurl.includes("://www.ncpssd.org/")) {
            text = "豆瓣";
        }
        var href = isbn === "" ? "https://search.douban.com/book/subject_search?search_text=" + bookname.trim() : `https://book.douban.com/isbn/${isbn.trim()}/?bookname=${bookname.trim()}`;
        return sepit(`<a href="${href}" target="_blank" class="${cls}" style="${style}" title="${dbname}">${text}</a>`, sep).replace(' class=""', '').replace(' style=""', '');
    }
    function dxtoc(url) {
        url = url.replace("bookDetail.jsp", "chapter.jsp").replace(/sw=[^/&]*/, "sw=1 2 3 中 4 5 6 7 8 大 参考 9 是 人 上 附 不 小 从 之 下 有 用 以 多 后 表 什么 十 10 部分 前 到 图 我 如何 要 可 内 里 记 区 外 天 来 你 西 再 序 南 步骤 同 录 附 去 女 篇 开 文 都 题 东 就 节 他 也 公 北 结 右 又 少 百 那 这 关 没 千 表格 个 男 章 0 论 几 今 左 万");
        return ` | <a href="${url}" target="_blank" style="font-size: 90%;">目录</a>`;
    }
    function dedao() {
        bookname = document.querySelector("figure.ebook-detail-header > figcaption.detail > h3.title").textContent.trim().split("(")[0];
        m_isbn = html.match(/"href":"isbn(\d+)/);
        isbn = m_isbn ? m_isbn[1] : "";
        let link = document.createElement("p");
        link.innerHTML = ucdrslink(bookname, isbn) + dblink(bookname, isbn);
        document.querySelector("figure.ebook-detail-header > figcaption.detail > h3.title").after(link);
    }
    function iid2bookid(iid) {
        // 2022年9月初,ucdrs和duxiu的封面iid参数都启用了v3,之前的算法无法从iid推导ssid了。ucdrs源码中包含了ssid,无需计算,duxiu的源码中ssid字段都为空,因此只能返回dxid
        if (iid.length >= 112) return "00000000";
        var bookid = "";
        var part = "";
        var tailhex = parseInt(iid.substring(iid.length - 2), 16);
        var encoded = iid.substring(0, iid.length - 32);
        var i;
        for (i = 0; i < encoded.length; i = i + 2) {
            part = encoded.substring(i, i + 2);
            bookid += String.fromCharCode(parseInt(part, 16) - tailhex);
        }
        console.log(bookid);
        return bookid.match(/^\d/) ? bookid.replace(/\//g, "").match(/^\d{8,}/)[0] : "00000000";
    }
    function copybid(bookid, bidtype) {
        return ` <a href="#" style="color: grey; text-decoration: none;" title="点击复制${bidtype}" class="copybid" data-text="${bookid}">📋</a><span class="copy_status" style="color:red; display:none;"></span></p>`;
    }
    function copymeta(bookid) {
        return ` <a href="#" style="color: grey; text-decoration: none;" title="点击复制完整元信息" class="copymeta" data-text="${bookid}">📋</a> <span class="copy_status" style="color:red; display:none;"></span>`;
    }
    function copyText(text) {
        // 复制相关代码参考 https://greasyfork.org/zh-CN/scripts/437492
        if (navigator.clipboard) {
            navigator.clipboard.writeText(text);
        } else {
            let textarea = document.createElement("textarea");
            document.body.appendChild(textarea);
            textarea.style.position = "absolute";
            textarea.style.clip = "rect(0 0 0 0)";
            textarea.value = text;
            textarea.select();
            document.execCommand("copy", true);
            textarea.remove();
        }
    }
    function nes(s) {
        return s === "" ? "-" : s;
    }
    function hsize(i) {
        let k = 1024;
        let m = k * 1024;
        let g = m * 1024;
        if (i >= g) return Math.round(i / g * 100, 2) / 100 + "G";
        if (i >= m) return Math.round(i / m * 100, 2) / 100 + "M";
        if (i >= k) return Math.round(i / k * 100, 2) / 100 + "K";
        return i + "bytes";
    }
    function fmb_clicked(event) {
        let ele = event.target;
        if (jQuery(ele).attr("href") !== "#") {
            return;
        }
        event.preventDefault();
        // 先看看有没有缓存
        let fmbid = jQuery(ele).attr("data-fmbid");
        let md5_cache = GM_getValue("fmb" + fmbid, "");
        let ele_status = jQuery(ele).next();
        let filename = jQuery(ele).prev().prev().prev().text();
        let filesize = jQuery(ele).prev().prev().attr("title").split(" ")[1];
        if (md5_cache !== "") {
            let [cmd5, smd5] = md5_cache;
            if (smd5 !== "") {
                jQuery(ele).attr("href", `https://pcs.baidu.com/rest/2.0/pcs/file?app_id=266719&method=rapidupload&ondup=overwrite&content-length=${filesize}&content-md5=${cmd5}&slice-md5=${smd5}&path=/${filename}`);
                jQuery(ele).attr("title", "点击此链接,尝试直接转存,如失败需使用秒传连接脚本转存");
                ele_status.html("缓存命中,秒传码已复制,点击🔗也可直接转存");
            } else {
                ele_status.html("缓存命中,秒传码已复制");
            }
            return;
        }
        // 超额不再查询
        let today = new Date().toLocaleDateString('sv').replaceAll('-', '');
        let cnts = GM_getValue("ss2rc_cnt", {});
        let cnt = cnts[today] === undefined ? 0 : cnts[today];
        if (cnt >= fmblimits) return;
        //jQuery(".getfmb").unbind("click").bind("click", fmb_clicked);
        GM_xmlhttpRequest({
            method: "GET",
            //url: `https://api.freembook.com/acquire?book_id=${fmbid}&tk=${cnt <= 2 ? "" : (cnt <= 5 ? "freembook" : "freemdict")}`,
            url: `https://api.freembook.com/acquire?book_id=${fmbid}`,
            headers: {
                "referer": "https://api.freembook.com"
            },
            timeout: 10000,
            onload(res) {
                let rdata = JSON.parse(res.responseText);
                if (rdata.code !== 0) {
                    if (rdata.code === 1005) {
                        // if (cnt <= 2) cnt = 3;
                        // if (cnt <= 5) cnt = 6;
                        // if (cnt <= 8) cnt = 9;
                        // cnts[today] = cnt;
                        GM_setValue("ss2rc_cnt", cnts);
                        jQuery(".fmbquota").each(function(i, el) {
                            jQuery(el).text(cnt + 1);
                        });
                        ele_status.html(`获取秒传码失败,错误码 ${rdata.code} - ${rdata.message}${cnt === fmblimits ? " - 额度用完了,请明天再试(自行通过freembook查询或同IP的其他人查询也会消耗额度)" : " - 请重试"}`);
                    } else {
                        ele_status.html(`获取秒传码失败,错误码 ${rdata.code} - ${rdata.message}`);
                    }
                    return;
                }
                cnts[today] = cnt + 1;
                GM_setValue("ss2rc_cnt", cnts);
                let [cmd5, smd5] = rdata.book_baidu;
                GM_setValue("fmb" + fmbid, rdata.book_baidu);
                if (smd5 !== "") {
                    jQuery(ele).attr("href", `https://pcs.baidu.com/rest/2.0/pcs/file?app_id=266719&method=rapidupload&ondup=overwrite&content-length=${filesize}&content-md5=${cmd5}&slice-md5=${smd5}&path=/${filename}`);
                    jQuery(ele).attr("title", "点击此链接,尝试直接转存,如失败需使用秒传连接脚本转存");
                    copyText(`${cmd5}#${smd5}#${filesize}#${filename}`);
                    ele_status.html("秒传码已复制,点击🔗也可直接转存");
                } else {
                    copyText(`${cmd5}#${filesize}#${filename}`);
                    ele_status.html("秒传码已复制");
                }
            },
            onerror(res) {
                ele_status.html(`查询秒传码时发生错误,请稍后重试`);
            },
            onabort(res) {
                ele_status.html(`查询秒传码的任务被取消,请稍后重试`);
            },
            ontimeout(res) {
                ele_status.html(`查询秒传码的任务超时,请稍后重试`);
            },
        });
        jQuery(".fmbquota").each(function(i, el) {
            jQuery(el).text(cnt + 1);
        });
    }
    function copybid_clicked(event) {
        let ele = event.target;
        let bid = jQuery(ele).attr("data-text");
        jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked);
        let bidtype = bid.length === 8 ? "SSID" : "DXID";
        if (bid.length === 10) bidtype = bid[0] === "B" ? "BCID" : "SSNO";
        if (bid.length === 20) bidtype = "DAID";
        if ((bidtype === "SSID" || bidtype === "DXID") && enablerc === "y" && event.type === "contextmenu" && !pageurl.includes("/s?")) {
            let today = new Date().toLocaleDateString('sv').replaceAll('-', '');
            let cnts = GM_getValue("ss2rc_cnt", {});
            let cnt = cnts[today] === undefined ? 0 : cnts[today];
            let tip = cnt <= (fmblimits - 1) ? `正在查询${bid}的秒传码......请耐心等待` : `根据ssid/dxid获取秒传链接为试验性功能,请低调使用。获取秒传码每日每IP限额${fmblimits}次,你已用完额度,只能查看资源列表。要获得秒传码,请明天再尝试!(自行通过freembook查询或同IP的其他人查询也会消耗额度,因此已用额度可能与你印象中不一致。)`;
            let nostock = jQuery(ele).prev().find("span.bid").attr("style").includes("color: grey;");
            if (nostock) tip = "灰色SSID的书无库存,请不要查询!";
            let snippet = `<div class="rcresult">${tip}</div><div class="tgresult"></div>`;
            let isdx = html.includes("/views/specific/") ? false : true;
            let block = isdx ? jQuery(ele).parent().parent().parent() : jQuery(ele).parent().parent();
            let bookname = pageurl.includes("/search?") ? block.find("input[id^='title']").val().replace(/<.*?>/g, "") : jQuery(isdx ? "div.card_text > dl > dt" : "div.tutilte").text();
            let rcresult = pageurl.includes("/search?") ? block.find("div.rcresult") : jQuery("div.rcresult");
            let tgresult = pageurl.includes("/search?") ? block.find("div.tgresult") : jQuery("div.tgresult");
            if (rcresult.length === 0) {
                // 参考联盟详情页,元信息很少而封面很大时,避免查询结果被遮蔽
                if (!isdx && pageurl.includes("/views/specific/")) jQuery("div.leftnav_tu > div:last").css({"height": "", "min-height": "265px"});
                (pageurl.includes("/search?") ? block.find(isdx ? "dl" : "div.get") : jQuery(isdx ? "div.card_text > dl" : "div.leftnav_tu").children().last()).after(snippet);
                rcresult = pageurl.includes("/search?") ? block.find("div.rcresult") : jQuery("div.rcresult");
                tgresult = pageurl.includes("/search?") ? block.find("div.tgresult") : jQuery("div.tgresult");
            } else {
                rcresult.text(tip);
            }
            GM_xmlhttpRequest({
                method: "GET",
                url: `https://api.freembook.com/search?category=tg&q=${bookname}`,
                headers: {
                    "referer": "https://api.freembook.com"
                },
                timeout: 10000,
                onload(res) {
                    console.log(res.responseText);
                    let rdata = JSON.parse(res.responseText);
                    if (rdata.code !== 0) {
                        tgresult.html(`在tg库查询【${bookname}】时发生错误,错误码 ${rdata.code} - ${rdata.message}`);
                        return;
                    }
                    let books = rdata.books;
                    if (books.length === 0) {
                        tgresult.html(`在tg库查询【${bookname}】无结果`);
                        return;
                    }
                    let r = "";
                    let seq = 0;
                    for (let book of books) {
                        let [bookname, author, language, pubdate, isbn, fids] = book;
                        seq += 1;
                        r += `<p class="rcitem"><span class="seq">${seq}.</seq> <span title="书名">${nes(bookname)}</span>, <span title="作者">${nes(author)}</span>, <span title="书号">${nes(isbn)}</span>`;
                        fids = fids.split("|");
                        for (let i = 0; i < fids.length; i++) {
                            let fid = fids[i];
                            if (fid !== "") {
                                let ftype = ["mobi", "epub", "azw3", "pdf"][i];
                                r += `, <a href="https://t.me/freembook_channel/${fid}" target="_blank" title="跳转到telegram客户端完成下载。">${ftype}</a>`;
                            }
                        }
                        r += "</p>";
                    }

                    if (r) {
                        r = `以下为检索书名获得的telegram 群组文件,请自行辨别是否所需图书。数据来源<a href="https://freembook.com/" target="_blank">freembook</a>。` + r;
                        tgresult.html(r);
                    }
                },
                onerror(res) {
                    tgresult.html(`在tg库查询【${bookname}】时发生错误,请稍后重试:<br>${res.responseText}`);
                },
                onabort(res) {
                    tgresult.html(`在tg库查询【${bookname}】的任务被取消,请稍后重试:<br>${res.responseText}`);
                },
                ontimeout(res) {
                    tgresult.html(`tg库查询${bookname}的任务超时,请稍后重试:<br>${res.responseText}`);
                },
            });
            GM_xmlhttpRequest({
                method: "GET",
                url: `https://api.freembook.com/search?category=duxiu&q=${bid}`,
                headers: {
                    "referer": "https://api.freembook.com"
                },
                timeout: 10000,
                onload(res) {
                    let rdata = JSON.parse(res.responseText);
                    if (rdata.code !== 0) {
                        rcresult.html(`查询${bid}秒传码发生错误,错误码 ${rdata.code} - ${rdata.message}`);
                        return;
                    }
                    let books = rdata.books;
                    if (books.length === 0) {
                        rcresult.html(`查询${bid}秒传码无结果`);
                        return;
                    }
                    let books_filter = {};
                    for (let book of books) {
                        let [bidx, ssid, filename, filesize, dxid, bookname, pubdate, page, isbn, rctype] = book;
                        let key = filesize + "-" + rctype;
                        if (books_filter[key] !== undefined) continue;
                        books_filter[key] = bidx;
                    }
                    let r = "";
                    let seq = 0;
                    for (let book of books) {
                        let [bidx, ssid, filename, filesize, dxid, bookname, pubdate, page, isbn, rctype] = book;
                        if (books_filter[filesize + "-32"] !== undefined && books_filter[filesize + "-32"] !== bidx) continue;
                        if (books_filter[filesize + "-32"] === undefined && books_filter[filesize + "-0"] !== undefined && books_filter[filesize + "-0"] !== bidx) continue;
                        seq += 1;
                        r += `<p class="rcitem"><span class="seq">${seq}.</span> <span title="SSID">${nes(ssid)}</span>, <span title="DXID">${nes(dxid)}</span>, <span title="文件名">${nes(filename)}</span>, <span title="文件体积 ${nes(filesize)}">${hsize(filesize)}</span>, <span title="秒传码类型,长码比短码成功率高">${rctype === 32 ? "长码" : "短码"}</span> <a href="#" target="_blank" class="getfmb" title="点此获取秒传码" data-fmbid="${bidx}">🔗</a> <span class="cpstatus"></span></p>`;
                    }

                    if (r) {
                        r = `<p>今日已使用 <span class="fmbquota">${cnt}</span> / ${fmblimits},点击🔗可获取${bid}的秒传码。使用<a href="https://greasyfork.org/zh-CN/scripts/424574" target="_blank">秒传链接脚本</a>可提取文件。数据来源<a href="https://freembook.com/" target="_blank">freembook</a>。</p>` + r;
                        rcresult.html(r);
                        jQuery(".getfmb").unbind("click").bind("click", fmb_clicked);
                    } else {
                        rcresult.html(`${bid}暂无秒传链接,库存率为0的书请不要尝试。本次查询不计用量,今日额度已使用 <span class="fmbquota">${cnt}</a> / ${fmblimits}。`);
                    }
                },
                onerror(res) {
                    rcresult.html(`查询${bid}的秒传码时发生错误,请稍后重试:<br>${res.responseText}`);
                },
                onabort(res) {
                    rcresult.html(`查询${bid}秒传码的任务被取消,请稍后重试:<br>${res.responseText}`);
                },
                ontimeout(res) {
                    rcresult.html(`查询${bid}秒传码的任务超时,请稍后重试:<br>${res.responseText}`);
                },
            });
        }
        copyText(bid);
        jQuery(ele).siblings(".copy_status").text("已复制" + bidtype).show().delay(1000).hide(0);
        return false;
    }
    function copymeta_clicked(event) {
        let ele = event.target;
        let bid = jQuery(ele).attr("data-text");
        let bidtype = bid.length === 8 ? "SSID" : "DXID";
        let meta;
        let bookname;
        let score;
        let popularity;
        let ele_title;
        let libscnt;
        let idx;
        if (pageurl.includes("superlib.net/search")) {
            meta = jQuery(ele).parent().parent().parent().parent().parent().text();
            meta = meta.replace(/\s+《(.*?)》.*\s+/, "【书名】$1");
            meta = meta.replace(/(作者|页数|出版社|出版日期|丛书名称|简介|主题词):/g, "\n【$1】");
            meta = meta.replace(/\meta+/g, "");
            meta = meta.trim() + `\n【链接】${pageurl.split("/search")[0] + jQuery(ele).prev().prev().prev().attr("href")}`;
        } else if (pageurl.includes("/views/specific/")) {
            meta = jQuery(ele).parent().parent().next().text();
            meta += jQuery(".tu_content").text().replace("内容提要:", "【内容提要】");
            meta = meta.replace(/\n\s+/g, "\n").replace("【作 者】", "【作者】");
            meta = meta.replace(/\n([^【])/g, "$1");
            bookname = jQuery(".tutilte").text();
            meta = `【书名】${bookname}\n` + meta + `\n【链接】${pageurl}`;
        } else if (pageurl.includes("://book.douban.com/subject")) {
            bidtype = "DBID";
            bookname = jQuery("h1")[0].textContent.trim();
            score = jQuery(".rating_people").text() === "" ? jQuery(".rating_sum").text().trim() : jQuery(".rating_num").text().trim() + "分 / " + jQuery(".rating_people").text();
            popularity = jQuery("div#collector > p.pl > a").text().replace(/([读过])(\d+)/g, "$1 / $2") + jQuery(".mod-hd > h2 > span.pl > a").text().replace("全部", ",短评") + jQuery("header > h2 > span.pl > a").text().replace("全部", ",书评");
            meta = jQuery("#info").text();
            meta = `【书名】${bookname}\n【评分】${score}\n【热度】${popularity}` + meta;
            meta = meta.replace(/\n\s+/g, "\n").replace(/:\n+/g, ": ").replace(" ", " ").replace(/(作者|出版社|出品方|副标题|原作名|译者|出版年|页数|定价|装帧|丛书|ISBN): */g, "【$1】").replace(/\n([^【])/g, "$1").replace(/【热度】\n/, "");
            meta += `\n【链接】https://book.douban.com/subject/${bid}/`;
        } else if (pageurl.includes("://www.ncpssd.org/Literature/articleinfo.aspx")) {
            bidtype = "BCID";
            meta = jQuery(ele).parent().parent().text().replace(/\n\s+/g, "\n").replace(/(.*)古籍 📋 /, "【书名】$1").replace(/(阅读全文|全文下载)/g, "").replace(/(分类|条码号|责任者|出版者|出版时间|版本|索书号|备注):/g, "【$1】").trim() + `\n【链接】${pageurl}`;
        } else if (pageurl.includes("://cadal.edu.cn/cardpage/bookCardPage")) {
            bidtype = "SSNO";
            meta = jQuery(ele).parent().parent().text().replace(/\n\s+/g, "\n").replace(/(.*) \| 豆瓣(搜索|直达) 📋 /, "【书名】$1").replace(/(添加标签|试读|章节阅读)\n/g, "").replace(/(作者|出版社|馆藏单位|出版时间|ISBN|资源类型|标签|主题|说明):/g, "【$1】").replace(/[\n\r]([^【])/, "$1").trim() + `\n【链接】${pageurl}`;
        } else if (pageurl.includes("://cadal.edu.cn/cadalinfo/search")) {
            bidtype = "SSNO";
            bookname = jQuery(ele).prev().prev().text().trim();
            meta = `【书名】${bookname}\n` + jQuery(ele).parent().parent().find("dd").text().replace(/\n\s+/g, "\n").replace(/(详情|阅读)\n/g, "").replace(/(作者|出版社|馆藏单位|出版时间|ISBN|资源类型|标签|主题|说明):/g, "\n【$1】").trim().replace("作者】\n", "作者】").replace(/图书列表\(\d+\)/, "").replace(/[\n\r]+([^【])/g, "$1") + `\n【链接】https://cadal.edu.cn/cardpage/bookCardPage?ssno=${bid.replace("CD", "")}`;
        } else if (pageurl.includes("/search?sw=")) {
            ele_title = jQuery(ele).prev().prev().prev();
            bookname = jQuery(ele).prev().prev().prev().text().trim().match("^《(.*)》$")[1];
            meta = `【书名】${bookname}\n` + jQuery(ele).parent().parent().find("dd").text().replace(/\n\s+/g, "\n").replace(/(\n(馆藏纸本|包库全文|部分阅读|试读|汇雅电子书))+\n/g, "\n").replace(/\s*(总被引:|被图书引:)/g, ",$1").replace("收藏馆:", "【热度】收藏馆:").replaceAll(" ", "").replace(/(作者|出版社|出版日期|页数|丛书名|简介|ISBN|主题词|分类) : /g, "\n【$1】").trim() + `\n【链接】${pageurl.split("/search")[0] + "/" + ele_title.attr("href").split("&fenlei")[0]}`;
        } else if (pageurl.includes("/bookDetail.jsp?")) {
            libscnt = jQuery("div#otherlib > a:last").text();
            libscnt = libscnt.match(/>>更多\(收藏馆:\d+\)/) ? libscnt.match(/>>更多\(收藏馆:(\d+)\)/)[1] : 0;
            idx = jQuery("div#bookphoto > p").text().match(/.*(被引用指数.*)/);
            idx = idx ? idx[1].replace("被图书", ",被图书").replaceAll("数", "数 ") : "";
            popularity = (libscnt ? "收藏馆 " + libscnt : "") + (idx ? "," + idx : "");
            meta = "【书名】" + jQuery("div.card_text").text().replace(/\n\s+/g, "\n").replace(/\n(馆藏纸本|包库全文|部分阅读|图书馆文献传递)\n/g, "\n").replace(/(作  者|ISBN号|页  数|出版发行|中图法分类号|参考文献格式|内容提要|原书定价|开本|主题词|丛书名) ?[::] ?/g, "\n【$1】").replace("【作  者】", "【作者】").replace("【页  数】", "【页数】").trim().replace(/\n([^【])/g, "$1") + (popularity ? `\n【热度】${popularity}` : "") + `\n【链接】${pageurl.split("&fenlei=")[0]}`;
        } else if (pageurl.includes("://fx.ccelib.com/detail_")) {
            libscnt = jQuery("div.titStyle > em").text();
            libscnt = libscnt ? "馆藏 " + libscnt.match(/(\d+)/)[1] : "";
            meta = "【书名】" + jQuery("h4.falv_tit").text().trim() + jQuery(ele).parent().parent().text().replace(/.*豆瓣直达 📋 \n/, "").replace(/\n\s+/g, "\n").replace(/\n([^【])/g, "$1").replace(/全部展开\n【摘要】.*收起\n/, "\n").replace(/【获取途径】.*\n/, "\n") + (libscnt ? `\n【热度】${libscnt}` : "") + `\n【链接】${pageurl.split("&fenlei=")[0]}`;
        } else if (pageurl.includes("/s?")) {
            meta = "【书名】" + jQuery(ele).parent().parent().text().replace("[图书]", "").replace(/.*豆瓣直达 📋 \n/, "").replace(/\n\s+/g, "\n").replace(/\n获得途径[^\a]*/g, "").replace(/(作者|出处|ISBN|丛书名|主题词|摘要) ?[::] ?/g, "\n【$1】").replace(/\n([^【])/g, "$1") + `\n【链接】${pageurl.split("/s?")[0] + jQuery(ele).parent().find("a:eq(1)").attr("href")}`;
        }

        meta = `【${bidtype}】${bid}\n` + meta.replace(" ,", ",").replace(/,([A-z0-9])/g, ", $1");
        meta = meta.replace(/^【DBID】.*\n/, "");
        meta = meta.replace(/\n+/g, "\n");
        meta = meta.replace(/\s+$/g, "");
        copyText(meta);
        jQuery(ele).siblings(".copy_status").text("已复制图书元数据").show().delay(1000).hide(0);
        return false;
    }
    function gettoc() {
        if (document.querySelector("ul#ztree").textContent === "") {
            alert("本书无目录数据可用");
            return false;
        }
        var tocurl = "http://path.sslibrary.com" + html.match(/<ul id="ztree" param="(.*?)" class="ztree">/)[1].replace(/amp;/g, "");
        GM_xmlhttpRequest({
            method: "GET",
            url: tocurl,
            timeout: 10000,
            onload(res) {
                var toc = "";
                console.log(res.responseText);
                const nodes = res.responseText.matchAll(/<(?:tree|node) id="(.*?)" Caption="(.*?)" PageNumber="(\d+)"/g);
                for (const node of nodes) {
                    let nodeid = node[1];
                    let tabs = (nodeid.match(/-/g) || []).length;
                    let caption = node[2].trim();
                    let pagenum = node[3];
                    toc += `${"\t".repeat(tabs)}${caption}\t${pagenum}\n`;
                }
                var pagesum = 0;
                if (pages[4][1] > 0) {pagesum += pages[4][1]; toc = `目录\t-${pagesum}\n` + toc;}
                if (pages[3][1] > 0) {pagesum += pages[3][1]; toc = `前言\t-${pagesum}\n` + toc;}
                if (pages[2][1] > 0) {pagesum += pages[2][1]; toc = `版权\t-${pagesum}\n` + toc;}
                if (pages[1][1] > 0) {pagesum += pages[1][1]; toc = `书名\t-${pagesum}\n` + toc;}
                if (pages[0][1] > 0) {pagesum += pages[0][1]; toc = `封面\t-${pagesum}\n` + toc;}
                if (pages[6][1] > 0) toc += `附录\t${pages[5][1] + 1}\n`;
                if (pages[7][1] > 0) toc += `封底\t${pages[5][1] + 1 + pages[6][1]}\n`;
                copyText(toc);
                alert("目录已复制到剪切板上,可在 PdgCntEditor 中直接粘贴使用");
            },
            onerror(res) {
                alert(`获取目录时发生错误,请稍后重试:${res.responseText}`);
            },
            onabort(res) {
                alert(`获取目录的任务被取消,请稍后重试。`);
            },
            ontimeout(res) {
                alert(`获取目录的任务超时,请稍后重试,如提示跨域权限请允许。`);
            },
        });
        return false;
    }
    function pad(num, n) {
        // https://bbs.csdn.net/topics/390547495
        var s = '000000000000000000000000000000' + num;
        return s.substr(s.length - n);
    }
    function genpages(pe, prefix, ps=1) {
        let spages = [];
        for (var i = ps; i <= pe; i++) {
            spages.push(prefix + pad(i, 6 - prefix.length));
        }
        return spages;
    }
    function tipspage(spage) {
        var prefix;
        if (spage === "cov001") prefix = "封面";
        else if (spage === "cov002") prefix = "封底";
        else prefix = {"!": "目录页", "b": "书名页", "f": "前言页", "a": "附录页", "l": "版权页", "0": "正文页"}[spage[0]];
        return prefix + " " + spage;
    }
    function gen_spages_list() {
        var download_start = parseInt(document.querySelector("input#download_start").value);
        var download_end = parseInt(document.querySelector("input#download_end").value);
        if (download_end < 1 || download_end > pages[5][1]) download_end = pages[5][1];
        if (download_start < 1) download_start = 1;
        if (download_start > download_end) download_start = download_end;
        var download_all = document.querySelector("input#download_all").checked;
        var spages_all = (pages[0][0] > 0) ? ['cov001'] : []; // 封面
        if (pages[1][1] > 0) spages_all = spages_all.concat(genpages(pages[1][1], 'bok')); // 书名
        if (pages[2][1] > 0) spages_all = spages_all.concat(genpages(pages[2][1], 'leg')); // 版权
        if (pages[3][1] > 0) spages_all = spages_all.concat(genpages(pages[3][1], 'fow')); // 前言
        if (pages[4][1] > 0) spages_all = spages_all.concat(genpages(pages[4][1], '!')); // 目录
        var spages = download_all ? spages_all : [];
        spages_all = spages_all.concat(genpages(pages[5][1], '', 1)); // 正文
        spages = spages.concat(genpages(download_end, '', download_start)); // 正文
        var tails = (pages[6][1] > 0) ? genpages(pages[6][1], 'att') : []; // 附录
        if (pages[7][1] > 0) tails.push('cov002'); // 封底
        spages_all = spages_all.concat(tails);
        if (download_all) spages = spages.concat(tails);
        return [spages_all, spages, download_start, download_end, download_all];
    }
    function download_spages_list() {
        var list = gen_spages_list()[0].join("\n");
        list = list.replace("cov001", "封面页\tcov001").replace("cov002", "封底页\tcov002").replace(/^0/gm, "正文页\t0").replace(/l/g, "版权页\tl").replace(/b/g, "书名页\tb").replace(/!/g, "目录页\t!").replace(/a/g, "附录页\ta").replace(/f/g, "前言页\tf");
        var bookname = html.match(/<title>(.*?)<\/title>/)[1];
        var ssid = pageurl.match(/\b(\d{8})\b/)[1];
        saveAs(new Blob([list], {type: "text/plain;charset=utf-8"}), `${bookname}_${ssid}_pages.txt`);
        return false;
    }
    function appendlog(log) {
        //jQuery("textarea#helperlog").val(`${now} 已连续5次失败,将自动中断任务,请耐心等待下载\n` + jQuery("textarea#helperlog").val());
        var ele = jQuery("textarea#helperlog");
        var now = new Date().toLocaleString('en-US', {hour12: false}).split(" ")[1];
        ele.val(`${now} ${log}\n` + ele.val());
    }
    function show_failtip(failscnt, errorline) {
        console.log(errorline);
        if (failscnt === max_failscnt) {
            appendlog(`已连续${max_failscnt}次失败,将自动中断任务,请耐心等待下载`);
        } else {
            appendlog(`已失败${failscnt}次,${gap_fails}秒后将重试,请立即处理验证码`);
            alert("下载页面错误,请滚动页面查看是否需要过反爬虫验证,如多个页面加载失败,大概率是会话过期,请重新打开页面重试!");
        }
    }
    function okdownload() {
        if (downloading) {
            document.getElementById("okdownload").innerText = "一键下载";
            downloading = false;
            return false;
        }
        document.getElementById("okdownload").innerText = "停止下载";
        downloading = true;
        //var jpgPath = document.querySelector("div.reader > div.readerPager > input.readerImg[src^='/n/']").getAttribute("src");
        var jpgPath = html.match(/jpgPath: *"(.*?)",/)[1];
        var zoomvalue = document.querySelector("select#zoomvalue").value;
        var download_format = document.querySelector("select#download_format").value;
        var [spages_all, spages, download_start, download_end, download_all] = gen_spages_list();
        var temp = document.getElementById("spageslist").value.replace(/\s+/g, "\n").trim().split("\n").filter(function(s){
            return s.length === 6 && s.match(/^(cov|bok|leg|fow|!|att)?\d{3,}$/);
        });
        if (temp.length > 0) spages = temp;
        var maintip = temp.length > 0 ? `开始下载列表中的${spages.length}个页面` : `开始下载P${download_start}-P${download_end},${download_all ? "附带非正文页" : "跳过非正文页"}`;
        jQuery("textarea#helperlog").val(`-----\n${maintip},zoom值为${zoomvalue},目标格式为${{"pdf": "PDF", "zip": "ZIP", "page": "分页图片"}[download_format]}\n-----\n1、为了避免频繁触发验证码,下载过程中不要滚动页面,出现弹窗时则要立即向下滚动页面或打开新的阅读页面,触发验证码并通过验证,超时${max_failscnt}次会中断下载。\n2、点击停止下载可中断任务,下载任务完成或被中断后,浏览器会保存剩余文件并导出下载日志,若pdf/zip文件生成慢暂时没反应,请耐心等待,不要关闭页面`);
        //console.log(spages);
        //console.log(jpgPath);
        //var bookname = html.match(/<input type="hidden" name="BookName" value="(.*?)" *\/?>/)[1];
        var bookname = html.match(/<title>(.*?)<\/title>/)[1];
        //var ssid = html.match(/<input type="hidden" name="ssid" value="(.*?)" *\/?>/)[1];
        var ssid = pageurl.match(/\b(\d{8})\b/)[1];
        var jsPDF = window.jspdf.jsPDF;
        if(jsPDF && jsPDF.version) {
            console.log('jsPDF version: ' + jsPDF.version);
        }
        var pages_success = [];
        var pagescnt = spages.length;
        var imgsData = {};
        var imgsSize = {};
        var imgsExt = {};
        var maxwidth = 0;
        var maxheight = 0;
        var failscnt = 0;
        var page = 0;
        var timeout = 0;
        var now;
        var releasemem = function() {
            pages_success = [];
            imgsData = {};
            imgsSize = {};
            imgsExt = {};
            appendlog(`内存已释放`);
        };
        var savefiles = function() {
            if (download_format !== "page") appendlog(`正在保存${download_format}文件,请耐心等待!\n-----`);
            var zip = new JSZip();
            var doc = new jsPDF({
                orientation: 'p',
                unit: 'px',
                format: [imgsSize[pages_success[0]][0], imgsSize[pages_success[0]][1]],
                putOnlyUsedFonts:true
            });
            doc.setFontSize(72);
            var txt_download_done = "";
            var txt_download_fails = "";
            // var d_spages = spages.reduce((ac,a) => ({...ac,[a]:''}),{});
            var log = "";
            var emptypages = 0;
            var firstpage_used = false;
            for (var i = 0; i < spages_all.length; i++) {
                let spage = spages_all[i];
                // if (d_spages[spage] === undefined) {
                if (!spages.includes(spage)) {
                    log += `skip\t${spage}\n`;
                    continue;
                }
                let imgData = imgsData[spage];
                if (imgData === undefined) {
                    if (firstpage_used && (download_format === "pdf")) doc.addPage([imgsSize[pages_success[0]][0], imgsSize[pages_success[0]][1]], "p");
                    if (download_format === "pdf") doc.text(spage, 100, 100);
                    emptypages += 1;
                    log += `fail\t${spage}\n`;
                    txt_download_fails += (spage + "\n");
                    continue;
                }
                log += `ok\t${spage}\n`;
                // [Javascript - get extension from base64 image - Stack Overflow](https://stackoverflow.com/questions/27886677/javascript-get-extension-from-base64-image)
                let imgExt = imgsExt[spage];
                txt_download_done += (spage + "\n");
                //if (download_format === "zip") zip.file(`${spage}.${imgExt}`, imgData.split(",")[1], {base64: true});
                // zip blob is faster than base64
                if (download_format === "zip") zip.file(`${spage}.${imgExt}`, imgData, {blob: true});
                if (firstpage_used && (download_format === "pdf")) doc.addPage([imgsSize[spage][0], imgsSize[spage][1]], "p");
                //doc.addImage(imageData, imgExt, x, y, width, height, alias, compression, rotation);
                if (download_format === "pdf") {
                    doc.addImage(imgData, imgExt, 0, 0, imgsSize[spage][0], imgsSize[spage][1]);
                    firstpage_used = true;
                }
            }
            if (download_format === "zip") {
                console.log("zipping");
                zip.file("done.txt", txt_download_done);
                zip.file("fails.txt", txt_download_fails);
                let progress = 0;
                let progress_prev = 0;
                zip.generateAsync({type:"blob"}, function updateCallback(metadata) {
                    progress = Math.round(metadata.percent * 10) / 10;
                    if (progress !== progress_prev) appendlog(`zip打包进度 ${progress}%'`);
                    progress_prev = progress;
                }).then(function(content) {
                    saveAs(content, `${bookname}_${ssid}.zip`);
                    appendlog(`zip文件完成打包,将自动保存到本地`);
                    releasemem();
                }).catch(function(err) {
                    appendlog(`zip文件打包出错,${err}`);
                    releasemem();
                });
            }
            if (download_format === "pdf") {
                doc.save(`${bookname}_${ssid}.pdf`);
                appendlog(`pdf文件保存完毕,${emptypages === 0 ? "无缺页" : "有" + emptypages + "张缺页,已标注"}`);
            }
            if (download_format !== "zip") releasemem();
            saveAs(new Blob([log], {type: "text/plain;charset=utf-8"}), `${bookname}_${ssid}_log.txt`);
            document.getElementById("okdownload").innerText = "一键下载";
            downloading = false;
        };
        var getpage = function () {
            page += 1;
            timeout = getRndInteger(sleep_min, sleep_max);
            let spage = spages[page - 1];
            console.log(`will download page ${spage}`);
            now = new Date().toLocaleString('en-US', {hour12: false}).split(" ")[1];
            GM_xmlhttpRequest({
                method: "GET",
                url: `https://${pageurl.split("/")[2]}${jpgPath}${spage}?zoom=${zoomvalue}`,
                headers: {referer: pageurl},
                timeout: 5000,
                responseType: "blob",
                onload: function (res) {
                    console.log(`${res.status} ${res.statusText}`);
                    if (res.statusText !== "OK") {
                        // fail 1
                        console.log(res.responseText);
                        failscnt += 1;
                        show_failtip(failscnt, "statusText_not_OK");
                        timeout = (failscnt === max_failscnt) ? 0 : gap_fails;
                        appendlog(`${tipspage(spage)} 状态码错误`);
                        page -= 1;
                        if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
                        return;
                    }
                    let blob = res.response;
                    let oFileReader = new FileReader();
                    oFileReader.onloadend = function (e) {
                        let imageData = e.target.result;
                        console.log(`image loaded, ${imageData.substring(0, 100)}`);
                        let image = new Image();
                        image.src = imageData;
                        image.onload = function() {
                            console.log(`page ${spage} dimension is w${image.width} x h${image.height}`);
                            // 检测是否图片:【数据加载失败,请稍后重试!】
                            console.log(imageData);
                            if (!imageData.startsWith("data:image") || (image.width === 994 && image.height === 1455 && imageData.startsWith("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+IAAAWvCAIAAACkbtyUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw"))) {
                                // fail 2
                                failscnt += 1;
                                show_failtip(failscnt, "fail_image_shown");
                                timeout = (failscnt === max_failscnt) ? 0 : gap_fails;
                                appendlog(`${tipspage(spage)} 数据加载失败`);
                                page -= 1;
                                if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
                                return;
                            }
                            // reset counter
                            failscnt = 0;
                            pages_success.push(spage);
                            imgsSize[spage] = [image.width, image.height];
                            imgsExt[spage] = imageData.split(';')[0].split('/')[1];
                            if (download_format === "page") {
                                saveAs(blob, `${spage}.${imgsExt[spage]}`);
                            } else if (download_format === "pdf") {
                                imgsData[spage] = imageData;
                            } else if (download_format === "zip") {
                                //imgsData[spage] = imageData;
                                // zip blob is faster than base64
                                imgsData[spage] = blob;
                            }
                            appendlog(`${tipspage(spage)} 已下载`);
                            console.log(`page ${spage} download ok: success - ${pages_success.length} / tried - ${page} / all - ${pagescnt} / flag - ${downloading}`);
                            document.querySelector("span#download_status").innerText = `下载进度:${pages_success.length} / ${page} / ${pagescnt}`;
                            if (!downloading || page === pagescnt) timeout = 0;
                            if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
                        };
                        image.onerror = function() {
                            // fail 3
                            failscnt += 1;
                            show_failtip(failscnt, "image_load_error");
                            timeout = (failscnt === max_failscnt) ? 0 : gap_fails;
                            appendlog(`${tipspage(spage)} 未知原因,图片无法加载`);
                            page -= 1;
                            if (!downloading) timeout = 0;
                            if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
                        };
                    };
                    oFileReader.readAsDataURL(blob);
                },
                onerror, onabort, ontimeout: function (res) {
                    // fail 4
                    console.log(`${res.status} ${res.statusText}`);
                    console.log(res.responseText);
                    console.warn(`page ${spage} download fail: success - ${pages_success.length} / tried - ${page} / all - ${pagescnt} / flag - ${downloading}`);
                    document.querySelector("span#download_status").innerText = `下载进度:${pages_success.length} / ${page} / ${pagescnt}`;
                    timeout = gap_fails;
                    appendlog(`${tipspage(spage)} 下载失败: ${res.statusText}`);
                    page -= 1;
                    if (!downloading) timeout = 0;
                    if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
                }
            }); // GM_xmlhttpRequest end
        };
        getpage();
        return false;
    }
    function getRndInteger(min, max) {
        return Math.floor(Math.random() * (max - min + 1) ) + min;
    }
    function funcinterval(func, interval = 3000) {
        func();
        setInterval(func, interval);
    }
    var pageurl = window.location.href;
    console.log(pageurl);
    var bookid;
    var bookname;
    var author;
    var press;
    var ssid;
    var dxid;
    var img;
    var m_isbn;
    var isbn;
    var m_ssn;
    var m_dxid;
    var m_iid;
    var copys;
    var bidtype;
    var rate_ssno = {"0102":"6.78", "0103":"61.39", "0104":"13.44", "0105":"21.79", "0106":"5.95", "0200":"8.76", "0201":"14.58", "0202":"60.94", "0203":"99.75", "0204":"97.9", "0205":"100", "0206":"99.94", "0207":"32.44", "0208":"99.03", "0209":"96.05", "0210":"92.26", "0211":"72.13", "0212":"14.35", "0300":"54.5", "0301":"99.9", "0302":"98.44", "0303":"100", "0600":"50.14", "0601":"74.62", "0603":"10.05", "0604":"98.32", "0605":"98.83", "0606":"98.36", "0607":"17.15", "0610":"9.73", "0620":"12.67", "0621":"20.87", "0630":"71.93", "0631":"99.41", "0632":"99.97", "0633":"99.88", "0634":"23.53", "0635":"99.87", "0636":"86.49", "0637":"93.95", "0638":"52.87", "0639":"41.99", "0640":"9.92", "0650":"4.16", "0651":"0.06", "0655":"59.33", "0700":"91.92", "0701":"99.77", "0702":"16", "0709":"0.01", "0800":"12.82", "0801":"87.75", "0802":"32.89", "0803":"16.25", "0900":"99.29", "0901":"44.39", "0902":"0.15", "0903":"0.01", "0904":"0.01", "0905":"0.01", "0909":"0.04", "0920":"0.02", "0940":"0.01", "0981":"0.01", "1100":"0.05", "1101":"0.02", "1110":"99.94", "1111":"8.91", "1120":"28.99", "1140":"79.28", "1141":"24.02", "1300":"41.64", "1302":"4.5", "1303":"9.29", "1305":"0.02", "1390":"1.52", "1400":"13.6", "1401":"9.96", "1402":"5.71", "1501":"0.03", "1502":"0.02", "1503":"0.01", "1504":"0.01", "1600":"62.07", "1601":"53.61", "1602":"42.82", "1604":"97.75", "1605":"41.48", "1607":"5.59", "2100":"0.2", "2101":"53.79", "2102":"1.92", "2103":"0.97", "2300":"15.42", "2500":"54.85", "3200":"65.76", "3201":"88.28", "3202":"88.15", "3203":"78.57", "3204":"35.68", "3300":"97.61", "3301":"99.06", "3302":"97.91", "3303":"98.63", "3304":"97.11", "3305":"95.62", "3306":"89.35", "3307":"96.42", "3308":"87.63", "3309":"94.43", "3310":"92.08", "3311":"93.46", "3312":"94.49", "3313":"83.21", "3314":"93.99", "3315":"92.2", "3316":"90.44", "3317":"90.86", "3318":"85.25", "3319":"73.38", "3320":"23.49", "7700":"67.84", "9900":"4.15"};
    var rate_ssid = {"1000":"71.71","1001":"68.23","1002":"74.22","1003":"76.48","1004":"33.54","1005":"24.57","1006":"77.02","1007":"79.33","1008":"62.93","1009":"80.42","1010":"78.69","1011":"82.3","1012":"84.34","1013":"13.81","1014":"32.16","1015":"73.28","1016":"87.19","1017":"68.41","1018":"53.02","1019":"90.8","1020":"79.03","1021":"67.56","1022":"65.6","1023":"80.18","1024":"60.03","1025":"65.67","1026":"84.78","1027":"88.63","1028":"76.94","1029":"88.01","1030":"89.35","1031":"83.21","1032":"85.73","1033":"94.67","1034":"94.9","1035":"56.94","1036":"0.36","1037":"0.39","1038":"77.56","1039":"68.37","1040":"96.51","1041":"89.93","1042":"96.53","1043":"93.44","1044":"79.85","1045":"78.8","1046":"85.47","1047":"74.65","1048":"73.18","1049":"60.75","1050":"91.74","1051":"79.96","1052":"70.93","1053":"52.37","1054":"11.47","1055":"2.86","1056":"2.08","1057":"2.28","1058":"2.55","1059":"2.73","1060":"2.91","1061":"3.03","1062":"3.02","1063":"2.75","1064":"24.09","1065":"72.48","1066":"38.47","1067":"41.97","1068":"47.14","1069":"46.96","1070":"48.12","1071":"41.39","1072":"44.49","1073":"47.84","1074":"46.49","1075":"45.14","1076":"47.27","1077":"47.06","1078":"77.98","1079":"81.71","1080":"81.97","1081":"82.3","1082":"81.47","1083":"82.87","1084":"61.22","1085":"81.93","1086":"52.22","1087":"59.38","1088":"72.63","1089":"77.22","1090":"50.5","1091":"56.33","1092":"26.83","1093":"41.35","1094":"75.03","1095":"68.18","1096":"70.67","1097":"94.62","1098":"92.99","1099":"66.97","1100":"93.63","1101":"92.93","1102":"93.74","1103":"89.08","1104":"92.15","1105":"90.58","1106":"69.55","1107":"57.18","1108":"78.82","1109":"78.7","1110":"94.88","1111":"95.86","1112":"94.64","1113":"94.09","1114":"94.11","1115":"94.87","1116":"92.94","1117":"93.18","1118":"94.53","1119":"93.38","1120":"93.68","1121":"93.92","1122":"85.44","1123":"92.02","1124":"93.3","1125":"92.02","1126":"92.04","1127":"88.15","1128":"91.51","1129":"92.07","1130":"93.48","1131":"89.15","1132":"89.33","1133":"90.77","1134":"95.18","1135":"91.75","1136":"92.5","1137":"93.44","1138":"96.09","1139":"94.78","1140":"93.76","1141":"93.31","1142":"94.48","1143":"94.7","1144":"95.4","1145":"95.64","1146":"95.79","1147":"95.14","1148":"93.93","1149":"95.13","1150":"67.93","1151":"77.19","1152":"93.33","1153":"90.43","1154":"93.48","1155":"93.72","1156":"92.46","1157":"92.6","1158":"88.82","1159":"91.74","1160":"78.63","1161":"83.73","1162":"88.36","1163":"82.68","1164":"84.41","1165":"55.92","1166":"65.95","1167":"87.33","1168":"88.11","1169":"85.21","1170":"82.67","1171":"84.5","1172":"85.67","1173":"81.19","1174":"83.12","1175":"90.12","1176":"89.58","1177":"93.29","1178":"93.65","1179":"92.51","1180":"91.77","1181":"92.64","1182":"87.4","1183":"93.49","1184":"96.37","1185":"93.88","1186":"90.17","1187":"93.81","1188":"93.68","1189":"94.7","1190":"91.54","1191":"91.58","1192":"93.5","1193":"91.46","1194":"92.97","1195":"91.86","1196":"93.19","1197":"91.79","1198":"95.45","1199":"91.65","1200":"91.28","1201":"90.54","1202":"90.66","1203":"88.47","1204":"93.36","1205":"94.78","1206":"94.58","1207":"95.26","1208":"94.86","1209":"91.52","1210":"86.56","1211":"88.15","1212":"92.45","1213":"87.64","1214":"87.78","1215":"93.35","1216":"92.12","1217":"91.43","1218":"93.53","1219":"91.21","1220":"92.4","1221":"89.44","1222":"91.68","1223":"89.25","1224":"89","1225":"89.65","1226":"88.46","1227":"86.29","1228":"87.33","1229":"86.77","1230":"93.06","1231":"88.67","1232":"91.45","1233":"93.18","1234":"91.72","1235":"90.73","1236":"91.67","1237":"90.49","1238":"91.1","1239":"91.05","1240":"93.37","1241":"89.77","1242":"90.11","1243":"89.63","1244":"94.38","1245":"81.23","1246":"81.62","1247":"79.38","1248":"74.55","1249":"81.85","1250":"47.91","1251":"89.17","1252":"93.62","1253":"91.82","1254":"89.49","1255":"89.37","1256":"85.65","1257":"90.62","1258":"91.42","1259":"88.33","1260":"84.46","1261":"91.09","1262":"92.65","1263":"81.34","1264":"89.74","1265":"90.45","1266":"88.23","1267":"91.34","1268":"88.63","1269":"89.52","1270":"80.56","1271":"90.32","1272":"93.36","1273":"92.85","1274":"93.15","1275":"95.42","1276":"93.33","1277":"92.04","1278":"91.23","1279":"88.29","1280":"84.29","1281":"88.02","1282":"84.27","1283":"73.43","1284":"86.68","1285":"79.91","1286":"82.33","1287":"84.47","1288":"75.75","1289":"74.47","1290":"77.19","1291":"75.9","1292":"74.32","1293":"80","1294":"83.02","1295":"76.56","1296":"75.25","1297":"80.92","1298":"82.73","1299":"86.3","1300":"93.41","1301":"90.68","1302":"87.51","1303":"84.51","1304":"90.62","1305":"77.34","1306":"72.41","1307":"73.89","1308":"79.56","1309":"91.46","1310":"78.15","1311":"80.02","1312":"78.14","1313":"77.43","1314":"68.21","1315":"63.73","1316":"76.78","1317":"95.88","1318":"90.39","1319":"77.2","1320":"82.85","1321":"89.47","1322":"82.44","1323":"89.09","1324":"79.95","1325":"71.54","1326":"84.11","1327":"80.28","1328":"77.42","1329":"86.19","1330":"82.69","1331":"85.89","1332":"92.11","1333":"95.03","1334":"89.69","1335":"95.05","1336":"93.12","1337":"81.98","1338":"81.13","1339":"92.26","1340":"89.55","1341":"93.02","1342":"90.73","1343":"94.82","1344":"95.46","1345":"88.61","1346":"89.42","1347":"93.85","1348":"94.69","1349":"90.46","1350":"86.58","1351":"91.11","1352":"85.56","1353":"84.05","1354":"80.7","1355":"82.1","1356":"83.34","1357":"82.31","1358":"93.03","1359":"90","1360":"87.67","1361":"83.16","1362":"81.77","1363":"76.46","1364":"88.29","1365":"92.85","1366":"90.96","1367":"93.5","1368":"91.41","1369":"88.88","1370":"91.68","1371":"84.52","1372":"79.57","1373":"76.3","1374":"85.47","1375":"79.57","1376":"80.01","1377":"72.61","1378":"78.69","1379":"69.11","1380":"73.96","1381":"53.4","1382":"72.78","1383":"67.52","1384":"79.51","1385":"78.44","1386":"66.38","1387":"69.57","1388":"71.11","1389":"73.01","1390":"72.68","1391":"75.59","1392":"84.39","1393":"85.84","1394":"79.67","1395":"84.44","1396":"76.67","1397":"67.46","1398":"53.76","1399":"58.62","1400":"79.04","1401":"89.36","1402":"57.92","1403":"69.58","1404":"64.65","1405":"60.51","1406":"57.08","1407":"73.35","1408":"75.29","1409":"81.62","1410":"90.98","1411":"73.41","1412":"62.47","1413":"66.23","1414":"57.71","1415":"63.76","1416":"78.32","1417":"79.53","1418":"79.21","1419":"54.85","1420":"77.7","1421":"70.08","1422":"72.47","1423":"47.21","1424":"40.38","1425":"71.44","1426":"74.41","1427":"77.15","1428":"67.71","1429":"61.79","1430":"58.39","1431":"69.31","1432":"70.5","1433":"52.64","1434":"68.87","1435":"79.04","1436":"66.34","1437":"67.72","1438":"60.88","1439":"73.41","1440":"58.54","1441":"55.88","1442":"67.17","1443":"63.31","1444":"71.51","1445":"60.61","1446":"54.52","1447":"38.98","1448":"53.54","1449":"56.14","1450":"38.41","1451":"72.05","1452":"63.03","1453":"62.69","1454":"60.31","1455":"41.46","1456":"41.82","1457":"29.09","1458":"31.62","1459":"34.15","1460":"55.93","1461":"61.57","1462":"53.19","1463":"45.06","1464":"49.22","1465":"37.63","1466":"28.52","1467":"60.48","1468":"40.21","1469":"39.4","1470":"5","1471":"4.98","1472":"4.26","1473":"4.75","1474":"4.7","1475":"5.79","1476":"14.37","1477":"6.12","1478":"4.97","1479":"6.2","1480":"1.35","1481":"0.5","1482":"0.55","1483":"0.26","1484":"0.03","1485":"0.05","1486":"0.03","1487":"0.03","1488":"0.01","1489":"0.01","1490":"0.01","1491":"0.03","1492":"0.06","1494":"0.01","1500":"0.02","1501":"0.04","1502":"0.02","1503":"0.01","1504":"0.09","1511":"0.01","1513":"0.01","1514":"0.02","1521":"0.01","1527":"0.02","1529":"0.01","1533":"0.01","1540":"0.01","1541":"0.01","1544":"0.01","1556":"0.01","1562":"0.01","1565":"0.01","1569":"0.01","1570":"0.01","1579":"0.02","1580":"0.01","1584":"0.01","1588":"0.01","1590":"0.01","1592":"0.01","1593":"0.01","1594":"0.02","1596":"0.01","1599":"0.01","1600":"0.76","1601":"0.33","1602":"0.36","1603":"0.01","1604":"2.61","1605":"1.57","1606":"0.02","1607":"0.25","1610":"0.03","1612":"0.04","1613":"0.01","1615":"0.01","1620":"0.03","1622":"0.01","1623":"0.01","1624":"0.01","1633":"0.01","1641":"0.01","1642":"0.01","1644":"0.02","1645":"0.01","1651":"0.01","1654":"0.01","1658":"0.01","1662":"0.01","1664":"0.01","1665":"0.01","1672":"0.01","1673":"0.01","1682":"0.01","1683":"0.01","1684":"0.02","1688":"0.01","1691":"0.02","1692":"0.01","1694":"0.02","1698":"0.01","1700":"0.6","1710":"0.01","1712":"0.01","1713":"0.02","1714":"0.01","1717":"0.01","1722":"0.02","1723":"0.01","1726":"0.01","1728":"0.01","1729":"0.01","1730":"0.01","1733":"0.01","1738":"0.01","1740":"0.01","1743":"0.01","1749":"0.01","1756":"0.01","1757":"0.01","1759":"0.01","1761":"0.01","1763":"0.01","1778":"0.02","1779":"0.01","1783":"0.01","1785":"0.01","1788":"0.01","1789":"0.03","1794":"0.01","1795":"0.02","1797":"0.01","1800":"0.01","1805":"0.01","1812":"0.03","1813":"0.01","1816":"0.02","1820":"0.01","1822":"0.01","1828":"0.01","1840":"0.05","1842":"0.02","1847":"0.01","1848":"0.01","1852":"0.01","1853":"0.01","1858":"0.01","1860":"0.01","1866":"0.02","1868":"0.03","1869":"0.01","1870":"0.01","1871":"0.03","1876":"0.01","1879":"0.01","1883":"0.01","1890":"0.02","1893":"0.02","1894":"0.01","1895":"0.05","1896":"0.02","1898":"0.04","1899":"0.01","1900":"0.06","1901":"0.04","1902":"0.02","1903":"0.02","1905":"0.01","1906":"0.01","1907":"0.02","1908":"0.02","1909":"0.01","1910":"0.02","1911":"0.05","1912":"0.07","1913":"0.02","1914":"0.03","1916":"0.01","1917":"0.02","1918":"0.01","1919":"0.05","1921":"0.05","1922":"0.02","1923":"0.02","1924":"0.03","1925":"0.01","1926":"0.02","1927":"0.07","1928":"0.02","1929":"0.06","1930":"0.02","1931":"0.04","1932":"0.02","1933":"0.01","1934":"0.04","1936":"0.02","1937":"0.09","1938":"0.01","1939":"0.06","1940":"0.04","1941":"0.03","1942":"0.02","1944":"0.01","1945":"0.13","1946":"0.01","1947":"0.02","1948":"0.02","1949":"0.25","1950":"0.03","1951":"0.01","1952":"0.03","1953":"0.01","1954":"0.01","1955":"0.01","1956":"0.02","1957":"0.03","1958":"0.08","1959":"0.01","1960":"0.02","1961":"0.01","1962":"0.01","1963":"0.01","1964":"0.01","1965":"0.03","1966":"0.04","1967":"0.02","1968":"0.01","1969":"0.01","1970":"0.01","1971":"0.01","1973":"0.03","1974":"0.03","1975":"0.01","1976":"0.06","1977":"0.05","1978":"0.08","1979":"0.02","1980":"0.05","1981":"0.04","1982":"0.04","1983":"0.01","1984":"0.02","1985":"0.07","1986":"0.04","1987":"0.04","1988":"0.04","1989":"0.02","1990":"0.03","1991":"0.01","1992":"0.04","1993":"0.06","1994":"0.05","1995":"0.05","1996":"0.03","1997":"0.05","1998":"0.08","1999":"0.14","2000":"3.82","2001":"5.5","2002":"3.26","2003":"3.35","2004":"3.18","2005":"5.87","2006":"3.72","2007":"11.02","2008":"8","2009":"5.41","2010":"2.5","2011":"0.13","2012":"10.46","2013":"4.6","2014":"7.92","2015":"13.44","2016":"1.74","2017":"0.17","2018":"0.2","2019":"0.04","2020":"0.03","2021":"0.01","2023":"1.8","2024":"9.18","2030":"0.01","2033":"0.02","2037":"0.01","2042":"0.02","2047":"1.94","2048":"0.08","2051":"0.01","2060":"0.01","2065":"0.01","2068":"2.54","2069":"4.36","2070":"4.21","2071":"4.15","2072":"3.06","2073":"3.36","2074":"3.62","2075":"2.35","2076":"4.47","2077":"3.46","2078":"0.47","2081":"0.29","2083":"0.01","2084":"0.01","2086":"0.01","2090":"0.01","2100":"0.05","2101":"0.97","2102":"0.02","2103":"0.03","2105":"0.02","2109":"0.02","2110":"0.02","2111":"0.02","2112":"0.04","2113":"0.02","2114":"0.07","2115":"0.03","2116":"0.05","2118":"0.02","2119":"0.05","2120":"0.03","2121":"0.05","2122":"0.03","2123":"0.08","2124":"0.03","2125":"0.05","2126":"0.19","2127":"0.06","2128":"0.05","2129":"0.06","2130":"0.03","2131":"0.06","2132":"0.08","2133":"0.09","2134":"0.07","2135":"0.12","2136":"0.09","2137":"0.04","2138":"0.13","2139":"0.03","2140":"0.03","2142":"0.03","2143":"0.02","2146":"0.01","2155":"0.57","2156":"0.08","2161":"0.01","2165":"0.01","2167":"0.04","2168":"0.01","2200":"0.01","2212":"0.01","2222":"0.01","2225":"0.01","2226":"0.01","2255":"0.02","2270":"0.01","2271":"0.01","2300":"0.01","2304":"0.01","2312":"0.02","2330":"0.01","2332":"0.01","2344":"0.01","2348":"0.01","2372":"0.01","2402":"0.01","2412":"0.02","2413":"0.01","2500":"0.03","2512":"0.01","2548":"0.01","2555":"0.01","2561":"0.01","2600":"0.01","2611":"0.01","2612":"0.02","2623":"0.01","2640":"0.34","2641":"0.17","2642":"0.02","2683":"0.01","2693":"0.01","2725":"0.01","2729":"0.44","2762":"0.16","2765":"0.83","2800":"0.01","2843":"0.01","2846":"0.64","2847":"1.39","2848":"0.34","2849":"0.72","2850":"0.22","2851":"0.01","2852":"0.01","2853":"0.01","2855":"0.01","2863":"0.01","2869":"0.08","2875":"0.27","2876":"0.06","2879":"0.03","2885":"0.02","2890":"0.01","2891":"0.29","2892":"0.24","2893":"0.17","2910":"0.01","2912":"0.02","2913":"0.01","2960":"0.01","2961":"0.01","3000":"0.36","3001":"0.01","3011":"0.01","3012":"0.02","3031":"0.01","3040":"0.01","3053":"0.01","3064":"0.01","3100":"0.06","3101":"0.01","3102":"0.01","3104":"0.01","3109":"0.01","3111":"0.02","3112":"0.01","3113":"0.01","3114":"0.06","3115":"0.01","3116":"0.06","3117":"0.01","3118":"0.02","3119":"0.01","3120":"0.01","3121":"0.05","3122":"0.01","3123":"0.01","3124":"0.05","3125":"0.03","3126":"0.09","3127":"0.05","3128":"0.03","3129":"0.04","3130":"0.02","3131":"0.06","3132":"0.03","3133":"0.06","3134":"0.04","3135":"0.06","3136":"0.05","3137":"0.03","3138":"0.08","3139":"0.01","3144":"0.02","3145":"0.01","3160":"0.01","3187":"0.01","3200":"0.43","3201":"0.47","3202":"0.15","3203":"0.18","3204":"0.06","3210":"0.01","3300":"0.36","3301":"0.37","3302":"0.55","3303":"0.31","3304":"0.8","3305":"0.37","3306":"0.89","3307":"0.56","3308":"1.17","3309":"0.91","3310":"0.26","3311":"0.55","3312":"0.22","3313":"0.86","3314":"0.2","3315":"0.29","3316":"0.71","3317":"0.64","3318":"0.91","3319":"0.87","3320":"0.6","3331":"0.01","3435":"0.01","3651":"0.03","3691":"0.01","3792":"0.01","3801":"0.01","3804":"0.02","3813":"0.01","3839":"0.01","3864":"0.01","3872":"0.01","3903":"0.01","3981":"0.01","3995":"0.01","4000":"10.2","4001":"13.14","4002":"8.12","4003":"34.11","4004":"36.7","4005":"17.67","4006":"13.62","4007":"24.39","4008":"8.95","4009":"17.27","4010":"31.8","4011":"20.85","4012":"6.37","4013":"11.94","4014":"2.74","4015":"0.73","4016":"28.34","4017":"17.31","4018":"27.41","4019":"30.6","4020":"19.22","4021":"50.35","4022":"18.92","4023":"20.27","4024":"22.97","4025":"31.72","4026":"16.91","4027":"18.71","4028":"23.09","4029":"23.81","4030":"31.29","4031":"21.63","4032":"26.24","4033":"7.55","4034":"30.95","4035":"49.71","4036":"61.66","4037":"67.6","4038":"62.33","4039":"51.71","4040":"40.88","4041":"48.32","4042":"28.93","4043":"31.41","4044":"65.45","4045":"53.63","4046":"75.73","4047":"79.22","4048":"13.58","4049":"11.2","4050":"18.36","4051":"7.87","4052":"5.03","4053":"10.99","4054":"18.51","4055":"8.9","4056":"12.11","4057":"4.61","4058":"4.84","4059":"3.19","4060":"17.41","4061":"16.06","4062":"9.1","4063":"15.63","4064":"16.48","4065":"3.99","4066":"14.9","4067":"8.74","4068":"18.55","4069":"50.98","4070":"22.31","4071":"46.8","4072":"36.8","4073":"53.15","4074":"22.96","4075":"57.71","4076":"13.31","4077":"9.28","4078":"24.13","4079":"14.02","4080":"20.98","4081":"3.78","4082":"13.78","4083":"12.67","4084":"13.65","4085":"15.82","4086":"40.5","4087":"41.84","4088":"71.96","4089":"42.68","4090":"6.78","4091":"3.38","4092":"19.95","4093":"19.69","4094":"7.75","4095":"17.87","4096":"0.37","4097":"0.02","4098":"7.07","4099":"0.01","4101":"0.09","4102":"0.01","4103":"0.01","4106":"0.01","4109":"0.01","4112":"0.02","4113":"0.02","4114":"0.01","4115":"0.01","4116":"0.01","4118":"0.01","4120":"0.01","4121":"0.03","4122":"0.02","4124":"0.01","4125":"0.02","4126":"0.13","4127":"0.03","4128":"0.02","4130":"0.02","4131":"0.02","4132":"0.01","4133":"0.07","4134":"0.02","4135":"0.06","4136":"0.03","4138":"0.04","4139":"0.03","4141":"0.01","4145":"0.01","4401":"0.01","4469":"0.01","4510":"0.11","4524":"0.01","4562":"0.01","4566":"0.01","4581":"0.01","4612":"0.01","4653":"0.15","4655":"0.01","4715":"0.01","4717":"0.01","4745":"0.01","4772":"0.02","4773":"0.03","4780":"0.01","4781":"0.1","4794":"0.18","4820":"0.18","4821":"0.01","4834":"0.04","4835":"0.02","4849":"0.07","4850":"0.14","4999":"0.01","5000":"2.32","5001":"0.02","5002":"4.96","5003":"2.42","5004":"1.49","5005":"0.49","5009":"0.22","5011":"0.01","5014":"0.22","5019":"0.01","5021":"0.01","5023":"0.2","5024":"0.86","5030":"0.01","5036":"0.07","5037":"11.16","5038":"3.98","5071":"0.01","5100":"0.07","5108":"0.01","5112":"0.01","5114":"0.05","5115":"0.01","5116":"0.02","5118":"0.02","5120":"0.05","5121":"0.02","5122":"0.01","5123":"0.02","5124":"0.02","5125":"0.02","5126":"0.08","5127":"0.02","5129":"0.01","5131":"0.01","5132":"0.01","5133":"0.05","5135":"0.02","5136":"0.02","5140":"0.02","5159":"0.01","5164":"0.01","5168":"0.01","5201":"0.01","5218":"0.01","5220":"0.01","5268":"0.01","5297":"0.01","5300":"0.03","5371":"0.01","5411":"0.01","5424":"0.01","5465":"0.01","5481":"0.01","5554":"0.01","5555":"0.01","5594":"0.01","5611":"0.01","5668":"0.01","5700":"0.01","5873":"0.01","5923":"0.01","5939":"0.01","5945":"0.01","5966":"0.01","5991":"0.01","5998":"0.01","6000":"0.33","6001":"0.05","6025":"0.01","6088":"0.01","6100":"0.29","6101":"0.1","6103":"0.01","6110":"0.01","6112":"0.03","6113":"0.02","6114":"0.02","6115":"0.01","6116":"0.01","6121":"0.02","6122":"0.01","6125":"0.02","6126":"0.08","6127":"0.02","6129":"0.01","6130":"0.01","6131":"0.01","6132":"0.01","6133":"0.02","6134":"0.01","6135":"0.04","6200":"0.16","6276":"0.01","6295":"0.01","6300":"0.19","6301":"0.22","6410":"0.01","6418":"0.01","6420":"0.01","6426":"0.01","6510":"0.01","6666":"0.01","6801":"0.02","6836":"0.01","6870":"0.01","6871":"0.01","6912":"0.01","6934":"0.01","7000":"0.01","7002":"0.01","7020":"0.01","7104":"0.01","7113":"0.01","7114":"0.03","7115":"0.01","7118":"0.01","7122":"0.01","7124":"0.02","7126":"0.07","7127":"0.01","7129":"0.01","7132":"0.01","7133":"0.05","7134":"0.01","7136":"0.01","7143":"0.01","7152":"0.02","7200":"0.01","7300":"0.16","7303":"0.01","7488":"0.01","7500":"0.01","7512":"0.01","7524":"0.01","7547":"0.01","7690":"0.01","7700":"0.43","7711":"0.01","7777":"0.02","7801":"0.01","7805":"0.01","7873":"0.01","7889":"0.01","7972":"0.01","8000":"0.01","8012":"0.01","8013":"0.01","8029":"0.01","8038":"0.02","8040":"77.34","8041":"20.93","8053":"0.01","8061":"0.01","8080":"0.01","8086":"0.01","8088":"0.01","8113":"0.01","8114":"0.01","8116":"0.01","8121":"0.01","8123":"12.65","8124":"0.01","8125":"0.01","8126":"0.08","8132":"0.01","8133":"0.02","8134":"0.02","8135":"0.02","8136":"0.01","8137":"0.01","8139":"0.01","8140":"0.01","8210":"0.01","8301":"0.01","8311":"0.01","8351":"0.01","8400":"0.01","8549":"0.01","8645":"0.01","8811":"0.02","8812":"0.75","8813":"1.35","8839":"0.01","8888":"0.08","8896":"0.06","9000":"0.02","9001":"0.03","9004":"0.01","9006":"1.65","9007":"0.74","9008":"0.96","9009":"0.16","9010":"0.01","9011":"1.34","9012":"1.65","9014":"0.68","9015":"0.11","9029":"0.01","9041":"0.01","9102":"0.11","9113":"0.01","9121":"0.01","9124":"0.01","9125":"0.02","9126":"0.03","9130":"0.01","9131":"0.02","9132":"0.02","9133":"0.02","9134":"0.01","9135":"0.01","9137":"0.01","9139":"0.01","9152":"0.01","9210":"0.02","9212":"0.01","9313":"0.01","9331":"0.01","9570":"0.05","9572":"0.08","9574":"0.02","9575":"0.01","9576":"0.02","9577":"0.03","9578":"0.05","9579":"0.02","9600":"26.79","9601":"33.79","9602":"26.23","9603":"43.98","9604":"36.66","9605":"22.85","9606":"16.56","9607":"34.08","9608":"49.26","9609":"32.73","9610":"39.96","9611":"20.51","9612":"50.22","9613":"47.02","9614":"7.45","9615":"27.36","9616":"9.24","9617":"34.62","9618":"51.17","9619":"14.95","9620":"14.98","9621":"7.23","9622":"6.83","9623":"20.63","9624":"11.55","9625":"0.04","9626":"0.17","9629":"0.01","9740":"0.01","9780":"0.01","9781":"0.03","9787":"0.02","9789":"0.64","9800":"0.02","9861":"0.01","9866":"0.01","9867":"0.12","9868":"0.02","9869":"0.01","9900":"0.03","9999":"0.02"};
    if (pageurl.includes("://search.douban.com/book/subject_search") || pageurl.includes("://book.douban.com/subject_search")) {
        jQuery("div.item-root > div.detail > div.title").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).find("a").after(ucdrslink4db(bookname));
        });
    } else if (pageurl.includes("://book.douban.com/works")) {
        // 无分页设计
        jQuery("div.bkdesc > a.pl2").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink4db(bookname));
        });
    } else if (pageurl.includes("://book.douban.com/producers") || pageurl.includes("://book.douban.com/press")) {
        jQuery("div.info > h2 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink4db(bookname));
        });
    } else if (pageurl.includes("://book.douban.com/cart")) {
        jQuery("td.book_title > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink4db(bookname, {sep: "|", text: "参"}));
        });
    } else if (pageurl.includes("://www.douban.com/doulist")) {
        jQuery("div.title > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            var src = slim(jQuery(el).parent().prev().prev().text());
            if (src === "来自:豆瓣读书") {
                jQuery(el).after(ucdrslink4db(bookname));
            }
        });
    } else if (pageurl.match("book.douban.com.*/(series|tag|do|wish|collect)")) {
        jQuery("div.info > h2 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink4db(bookname));
        });
    } else if (pageurl.includes("://book.douban.com/author")) {
        jQuery("h6 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink4db(bookname));
        });
    } else if (pageurl.includes("://book.douban.com/subject")) {
        bookid = pageurl.match(/book.douban.com\/subject\/(\d+)/)[1];
        var json = jQuery('script[type="application/ld+json"]').text();
        bookname = json.match(/"name" : "(.*?)",/)[1];
        m_isbn = json.match(/"isbn" : "(.*?)",/);
        isbn = m_isbn ? m_isbn[1] : "";
        jQuery("div#mainpic > a.nbg").after("<br>" + ucdrslink(bookname, isbn) + copymeta(bookid));
    } else if (pageurl.includes("://book.douban.com/isbn")) {
        var error = jQuery("div#exception").text().trim();
        if (error === "豆瓣评论暂时没有收录此书,请原谅。" || error === "您提供的ISBN号码不正确,请校正后再试。谢谢。") {
            var m_bookname = pageurl.match(/\?bookname=(.+)/);
            if (m_bookname) {
                bookname = m_bookname[1];
                document.location = "https://search.douban.com/book/subject_search?search_text=" + bookname;
            }
        }
    } else if (pageurl.includes(".kongfz.com/")) {
        // 孔书网
        // 组件或模板
        setTimeout(function() {
            jQuery("div.book > a > p.money, div.book_list_box > ul.clearfix > li > div.price, ul.clearfix > li > div.price_box").each(function (i, el) {
                var bnele = {"money": "p.name", "price": "div.book_name", "price_box": "div.text_height > div.book_name"}[jQuery(el).attr("class")];
                bookname = shortenbkn(jQuery(el).parent().find(bnele).text());
                jQuery(el).append(ucdrslink(bookname, "", {sep: "|", text: "参", cls: "link"}) + dblink(bookname, "", {"text": "豆", cls: "link"}));
            });
            jQuery("div.item-info > div.title > a.link").each(function (i, el) {
                bookname = shortenbkn(jQuery(el).text());
                jQuery(el).after(ucdrslink(bookname, "", {sep: "|", cls: "link"}) + dblink(bookname, "", {"cls": "link"}));
            });
        }, 1000);
        // 两个详情页
        if (pageurl.match(/book.kongfz.com\/\d+\/\d+\//)) {
            bookname = shortenbkn(jQuery("h1.title").text());
            m_isbn = html.match(/ISBN:\s*<span>&nbsp;(.*?)<\/span>/);
            if (!m_isbn) m_isbn = html.match(/<span class="keywords-define-txt" itemprop="isbn">\s*(.*?)\s*<\/span>/);
            isbn = m_isbn ? m_isbn[1] : "";
            jQuery("h1.title").after(ucdrslink(bookname, isbn, {sep: "|", cls: "link"}) + dblink(bookname, isbn));
        } else if (pageurl.match(/item.kongfz.com\/book\/\d+\.html/)) {
            bookname = shortenbkn(jQuery("h1.detail-title").text());
            m_isbn = html.match(/var isbn = "(.*?)",/);
            isbn = m_isbn ? m_isbn[1] : "";
            jQuery("h1.detail-title").after(ucdrslink(bookname, isbn, {"style": "color: #365899;"}) + dblink(bookname, isbn, {"style": "color: #365899;"}));
        }
    } else if (pageurl.match(/e.jd.com\/\d+\.html/)) {
        // 京东电子书详情页
        bookname = jQuery("div.itemInfo-wrap > div.sku-name").text().trim();
        m_isbn = html.match(/<div class="dt">I S B N<\/div>\s*<div class="dd">(.*?)<\/div>/);
        isbn = m_isbn ? m_isbn[1] : "";
        jQuery("div.itemInfo-wrap > div.sku-name").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
    } else if (pageurl.match(/item.jd.com\/\d+\.html/) && jQuery("div.crumb > div.first > a").text() === "图书") {
        // 京东纸书详情页
        bookname = jQuery("div.itemInfo-wrap > div.sku-name").text().trim();
        m_isbn = html.match(/ISBN:([\d\-]*)/);
        isbn = m_isbn ? m_isbn[1] : "";
        jQuery("div.itemInfo-wrap > div.sku-name").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
    } else if (pageurl.match(/e.dangdang.com\/products\/\d+\.html/)) {
        // 当当电子书详情页
        setTimeout(function() {
            bookname = shortenbkn(jQuery("h1.bookname_box > span.title_words").text());
            m_isbn = html.match(/ISBN:([\d-]*)/);
            isbn = m_isbn ? m_isbn[1] : "";
            jQuery("h1.bookname_box").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
        }, 2000);
    } else if (pageurl.match(/product.dangdang.com\/\d+\.html/) && jQuery("div#breadcrumb > a.domain:eq(0)").text()=== "图书") {
        // 当当纸书详情页
        bookname = shortenbkn(jQuery("div.name_info > h1").text());
        m_isbn = html.match(/<li>国际标准书号ISBN:(.*?)<\/li>/);
        isbn = m_isbn ? m_isbn[1] : "";
        jQuery("div.name_info > h1").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
    } else if (pageurl.includes("www.bookschina.com")) {
        // 中图网
        // 组件-编辑推荐:有购物车按钮,添加文字链接
        jQuery("div.siteHotPannel > ul > li > h3.bookName").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            bookname = GB2312UTF8.GB2312ToUTF8(bookname);
            jQuery(el).parent().find("div.priceWrap > del.price").after(ucdrslink(bookname, "", {text: "参", sep: "&nbsp;| "}) + dblink(bookname, "", {"text": "豆"}));
        });
        // 页面-特惠/9块9:全页ajax
        if (pageurl.includes("www.bookschina.com/tejia/NewTeHui.aspx")) {
            funcinterval(function() {
                jQuery("div.bookLIst > ul > li > div.text > div.priceWrap > span.dPrcie").each(function (i, el) {
                    if (jQuery(el).text().match(/:\d+(\.\d+)?元$/)) {
                        bookname = slim(jQuery(el).parent().parent().find("div.bookName").text());
                        bookname = GB2312UTF8.GB2312ToUTF8(bookname);
                        jQuery(el).append(ucdrslink(bookname, "", {text: "参", sep: "&nbsp;| "}) + dblink(bookname, "", {"text": "豆"}));
                    }
                });
            });
        } else if (pageurl.includes("www.bookschina.com/books/9kuai9/")) {
            funcinterval(function() {
                jQuery("div.freeShipFloor > ul#ulList > li.default > div.bookInfor > div.authorPublisher > b.author").each(function (i, el) {
                    var p = jQuery(el).parent().parent().find("div.priceWrap > div.sellPrice");
                    if (jQuery(el).text() !== "暂无" && !p.text().match(/参 \| 豆$/)) {
                        bookname = slim(jQuery(el).parent().parent().find("h3.bookName").text());
                        bookname = GB2312UTF8.GB2312ToUTF8(bookname);
                        p.append(ucdrslink(bookname, "", {text: "参", sep: "&nbsp;| "}) + dblink(bookname, "", {"text": "豆"}));
                    }
                });
            });
        }
        // 模板-详情页和各类列表页
        if (pageurl.match(/www.bookschina.com\/\d+\.htm/)) {
            // 详情页
            bookname = shortenbkn(jQuery("h1").text());
            m_isbn = html.match(/<li>ISBN:(.*?)<\/li>/);
            isbn = m_isbn ? m_isbn[1] : "";
            jQuery("h1").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
        } else {
            // 各种有购物车和收藏按钮的列表页、大图页
            jQuery("a.collectBtn").each(function (i, el) {
                jQuery(el).css("margin-right", "3px");
                bookname = slim(jQuery(el).parent().parent().find("h2.name").text());
                bookname = GB2312UTF8.GB2312ToUTF8(bookname);
                jQuery(el).after(ucdrslink(bookname, "", {text: "参", cls: "collectBtn", style: "margin-right: 3px; width: 30px;"}) + dblink(bookname, "", {"sep": "", "text": "豆", "cls": "collectBtn", "style": "margin-right: 3px; width: 30px;"}));
            });
        }
        return;
    } else if (pageurl.includes("citic.cmread.com")) {
        // 咪咕云书店
        setTimeout(function() {
            bookname = jQuery("div.book-name").text().trim();
            jQuery("div.book-name").after(ucdrslink(bookname, "", {"style": "font-size: 12px; display: inline-block; margin-left: 10px; cursor: pointer;"}) + dblink(bookname, "", {"sep": " ", "style": "font-size: 12px; display: inline-block; cursor: pointer;"}));
        }, 1000);
    } else if (pageurl.match(/www.dedao.cn\/ebook\/detail\?/)) {
        // 得到电子书
        setTimeout(dedao, 1000);
        // [There is no JavaScript event for a URL change | Today I Learned](https://todayilearned.net/2021/03/no-javascript-event-url-change)
        let currentUrl = location.href;
        setInterval(() => {
            if (location.href !== currentUrl) {
                currentUrl = location.href;
                setTimeout(dedao, 1000);
            }
        }, 3000);
        return;
    } else if (pageurl.match(/read.douban.com\/ebook\/\d+\//)) {
        // 豆瓣阅读详情页
        setTimeout(function(){
            bookname = jQuery("h1.article-title").text().trim();
            m_isbn = html.match(/itemprop="isbn">(.*?)<\/a>/);
            isbn = m_isbn ? m_isbn[1] : "";
            jQuery("h1.article-title").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
        }, 1000);
    } else if (pageurl.includes("superlib.net/search")) {
        // ucdrs搜索页-支持自动翻页
        // 脚本域名匹配只匹配到yyy.xxx,不理会zzz.yyy.xxx,因此此规则可使用superlib.net下的各种镜像站,只要没有页面UI与主站显著差异的镜像站,就无需修改
        funcinterval(function() {
            jQuery('td[id="b_img"]').each(function (i, el) {
                if (jQuery(el).parent("tr").find("p > a > span.bid").length === 1 || jQuery(el).parent("tr").find("p > span.bid").length === 1) return;
                bookid = jQuery(el).parent("tr").find('input[name*="ssid"]').val();
                if (bookid) {
                    jQuery(el).after(showbid(bookid, "SS号").replace("</p>", copybid(bookid, "SS号")));
                } else {
                    bookid = jQuery(el).find("a[href]").attr("href").match(/dxNumber=(\d+)/);
                    if (bookid) {
                        bookid = bookid[1];
                        jQuery(el).after(showbid(bookid, "DX号").replace("</p>", copybid(bookid, "DX号")));
                    }
                }
                bookname = jQuery(el).parent("tr").find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
                let meta = jQuery(el).parent("tr").find('span.fc-green').text();
                author = meta.match(/作者:\s*(.*?) /);
                author = author ? author[1].replace(/[\(\[(【].*?[\)\])】]/g, "").trim().replace(/[ \/;;,,::].*/g, "").replace(/等?(主?编|编?著)?$/, "") : "";
                press = meta.match(/出版社:\s*(.*?) /);
                press = press ? press[1].replace(/.*:/, "") : "";
                if (bookname) jQuery(el).parent().children().last().find("a").after(dzylink(bookname + " " + author + " " + press) + dblink(bookname) + copymeta(bookid));
            });
            jQuery(".copybid").unbind("click").bind("click", copybid_clicked);
            jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked);
            jQuery(".copymeta").unbind("click").bind("click", copymeta_clicked);
        }, 5000);
    } else if (pageurl.includes("://www.digital.archives.go.jp")) {
        // 内阁文库-暂无自动翻页
        jQuery("div.list_ti_box > h4.list_ti > a.list_ti_txt").each(function (i, el) {
            bookid = jQuery(el).attr("onclick").match(/(submitHierarchy|submitDetail)\('(\w+)'/)[2];
            bookname = jQuery(el).text();
            jQuery(el).after(dblink(bookname));
            jQuery(el).after(" | " + showbid(bookid, "DAID", 0));
        });
        var bknameele;
        if (pageurl.includes("/listPhoto")) {
            var m_bookid = pageurl.match(/\bID=(\w+)/);
            if (m_bookid === null) {
                m_bookid = pageurl.match(/\bBID=(\w+)/);
            }
            bookid = m_bookid[1];
            bknameele = jQuery(jQuery("div.view_ti > h1 > a")[0]);
            bookname = bknameele.text();
        } else {
            bknameele = jQuery(jQuery("dl.detail_tb > dd")[0]);
            bookname = bknameele.text();
            var ptitle;
            ptitle = jQuery(jQuery("div.page_ti > h2")[0]).text().trim();
            if (ptitle.indexOf("情報") > 0) {
                // ptitle === "簿冊情報" || ptitle === "資料群情報"
                bookid = pageurl.match(/IS_KEY_S51=(\w+)/)[1];
            } else if (ptitle.indexOf("詳細") > 0) {
                if (pageurl.includes("/file/")) {
                    // https://www.digital.archives.go.jp/file/1069939.html
                    bookid = html.match(/var mid = '(\w+)';/)[1];
                } else {
                    // ptitle === "資料群詳細" || ptitle === "簿冊詳細" || ptitle === "件名・細目詳細"
                    bookid = pageurl.match(/IS_KEY_S16=(\w+)/)[1];
                }
            }
        }
        bknameele.after(dblink(bookname));
        bknameele.after(showbid(bookid, "DAID", 0));
    } else if (pageurl.includes("://www.ncpssd.org/Literature/ancientbooklist.aspx")) {
        // ncpssd的列表页-暂无自动翻页
        jQuery("div.jour-pic > ul.clr > li > a").each(function (i, el) {
            bookid = atob(jQuery(el).attr("href").match(/barcodenum=(.*)/)[1]);
            bookname = jQuery(el).next().attr("title").replace(/(第?[一二三四五六七八九十百千]+|不分)卷.*/, "");
            jQuery(el).next().after(dblink(bookname));
            jQuery(el).next().after(showbid("BC" + bookid, "BCID", 0));
        });
    } else if (pageurl.includes("://www.ncpssd.org/Literature/articleinfo.aspx")) {
        // ncpssd的详情页
        bookid = jQuery("p#p_institutions").text().replace("条码号:", "");
        bookname = jQuery("h2#h2_title_c").text().replace(/(第?[一二三四五六七八九十百千]+|不分)卷.*/, "");
        jQuery("img#img").after(dblink(bookname) + copybid("BC" + bookid, "BCID").replace("</p>", ""));
        jQuery("img#img").after(showbid("BC" + bookid, "BCID", 0));
        jQuery("h2#h2_title_c > i").after(copymeta("BC" + bookid));
    } else if (pageurl.includes("://cadal.edu.cn/cadalinfo/search")) {
        // cadal的搜索页-暂无自动翻页
        funcinterval(function() {
            jQuery("a.title").each(function (i, el) {
                if (jQuery(el).parent().parent().prev().find("span.bid").length === 1) return;
                bookid = jQuery(el).attr("onclick").match(/'\w+'/)[0].replace(/'/g, "").replace("hj", "");
                jQuery(el).parent().parent().prev().find("a").after(showbid("CD" + bookid, "SSNO<br>").replace("</p>", copybid("CD" + bookid, "SSNO").replace("</a>", "</a><br>")));
                bookname = jQuery(el).text().trim();
                jQuery(el).after(dblink(bookname) + copymeta("CD" + bookid));
            });
        });
    } else if (pageurl.includes("/search?") && (typeof jQuery !== "undefined") && jQuery("#dxid0").val()) {
        // duxiu搜索页-暂无自动翻页
        funcinterval(function() {
            jQuery('div[class="divImg"]').each(function (i, el) {
                if (jQuery(el).find("span.bid").length === 1) return;
                ssid = jQuery(el).prev().val();
                dxid = jQuery(el).prev().prev().val();
                bookid = ssid ? ssid : dxid;
                bidtype = bookid.length === 8 ? "SSID" : "DXID";
                bookname = jQuery(el).parent().find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
                m_isbn = jQuery(el).next().text().match(/ISBN : ([\d-]+)\n/);
                isbn = m_isbn ? m_isbn[1] : "";
                var ele_title = jQuery(el).next().find("dt").find("a");
                ele_title.after(dxtoc(ele_title.attr("href")) + dblink(bookname, isbn) + copymeta(bookid));
                jQuery(el).children().first().after(showbid(bookid, bidtype.replace("ID", "号")).replace("</p>", copybid(bookid, bidtype)));
            });
        });
    } else if (pageurl.includes("://fx.ccelib.com/s?")) {
        // duxiu的ccelib镜像站搜索页-暂无自动翻页
        funcinterval(function() {
            jQuery('div[class="savelist clearfix"]').each(function (i, el) {
                if (jQuery(el).find("span.bid").length === 1) return;
                var ele_ul = jQuery(el).find("div.savelist_con > div.savelist_box > ul");
                if (ele_ul.find("li.biaoti > a:first").text() === "[图书]") {
                    bookname = ele_ul.find("li.biaoti > a:eq(1)").text().trim();
                    var ele_input = jQuery(el).find("div.save_img > input");
                    bookid = iid2bookid(ele_input.attr("img").match(/iid=(\w+)/)[1]);
                    if (bookid === "00000000") bookid = ele_ul.prev().find("div.favorite > span").attr("dxid");
                    bidtype = bookid.length == 8 ? "SS号": "DX号";
                    jQuery(el).find("div.save_img > a").after(showbid(bookid, bidtype).replace("</p>", copybid(bookid, bidtype)));
                    var m_isbn = ele_ul.text().match(/ISBN:([\d-]+)\n/);
                    isbn = m_isbn ? m_isbn[1] : "";
                    ele_ul.find("li.biaoti > a:last").after(dblink(bookname, isbn, {"sep": "", "style": "float: none;"}) + copymeta(bookid).replace(';" title', '; float: none;" title'));
                }
            });
        });
    } else if (pageurl.includes("/views/specific/")) {
        // ucdrs详情页
        m_ssn = jQuery("script:contains(send_requestajax)").text().match(/ssn=(\d{3,})/);
        m_dxid = pageurl.match(/dxNumber=(\d+)/);
        bookid = m_ssn ? m_ssn[1] : m_dxid[1];
        bidtype = bookid.length === 8 ? "SSID" : "DXID";
        img = jQuery("div.tubookimg>img");
        img.after(showbid(bookid, bidtype).replace("</p>", copybid(bookid, bidtype)));
        bookname = jQuery("div.tutilte").text();
        m_isbn = jQuery("div.tubox").find("dl").text().match(/【ISBN号】(.*?)\n/);
        isbn = m_isbn ? m_isbn[1] : "";
        img.after(`<p style="text-align: center">${dblink(bookname, isbn, {"sep": ""}) + copymeta(bookid)}</p>`);
        jQuery("body").children().last().append('<script type="text/javascript">function hasLogin(url){window.open(url);return;}</script>');
    } else if (pageurl.includes("bookDetail.jsp?") && (typeof jQuery !== "undefined") && jQuery("input#dxid").val()) {
        // duxiu详情页
        m_iid = jQuery("div#bookphoto").html().match(/CoverNew.dll\?iid=(\w{40,56}\b)/);
        m_ssn = jQuery("script:contains(send_requestlib)").text().match(/ssn=(\d{3,})/);
        m_dxid = pageurl.match(/dxNumber=(\d+)/);
        bookid = m_iid ? iid2bookid(m_iid[1]) : (m_ssn? m_ssn[1] : m_dxid[1]);
        bidtype = bookid.length == 8 ? "SS号": "DX号";
        img = jQuery("#grade1").prev();
        img.after(showbid(bookid, bidtype).replace("</p>", copybid(bookid, bidtype)));
        bookname = jQuery("input#dxid").prev().text();
        m_isbn = jQuery("div.card_text").find("dl").text().match(/ISBN号 :(.*?)\n/);
        isbn = m_isbn ? m_isbn[1] : "";
        img.after(`<p style="text-align: center">${dxtoc(pageurl)} | ${dblink(bookname, isbn, {"sep": ""})}${copymeta(bookid)}</p>`);
    } else if (pageurl.includes("://cadal.edu.cn/cardpage/bookCardPage?")) {
        // cadal详情页
        bookid = pageurl.match(/ssno=(\w+)/)[1];
        jQuery("div.title_img").each(function (i, el) {
            bookname = jQuery("span.title").text().trim();
            m_isbn = jQuery(el).next().text().match(/ISBN:(.*?)\n/);
            isbn = m_isbn ? m_isbn[1] : "";
            jQuery("span.title").after(dblink(bookname, isbn) + copymeta("CD" + bookid));
            jQuery(el).find("a").after(showbid("CD" + bookid, "SSNO<br>").replace("</p>", copybid("CD" + bookid, "SSNO").replace("</a>", "</a><br>")));
        });
        jQuery("#menu_area").show();
    } else if (pageurl.includes("://fx.ccelib.com/detail_")) {
        // duxiu的ccelib镜像详情页
        jQuery('div[class="savelist clearfix"]').each(function (i, el) {
            img = jQuery(el).find("div.save_img > img:first");
            if (img.next().text() === "【图书】") {
                bookname = jQuery("h4.falv_tit").text().trim();
                var ele_ul = jQuery(el).find("div.savelist_con > ul.infolist");
                var ele_headline = ele_ul.find("li.biaoti").children().last();
                bookid = iid2bookid(img.attr("src").match(/iid=(\w+)/)[1]);
                if (bookid === "00000000") bookid = jQuery("div.sharediv > div.bdsharebuttonbox").attr("data-tag").replace("share_", "");
                bidtype = bookid.length == 8 ? "SS号": "DX号";
                img.after(showbid(bookid, bidtype).replace("-20px", "0px").replace("</p>", copybid(bookid, bidtype)));
                m_isbn = ele_ul.text().match(/【ISBN】([\d-]+)\n/);
                isbn = m_isbn ? m_isbn[1] : "";
                ele_headline.after(dblink(bookname, isbn, {"sep": "", "style": "float: none;"}) + copymeta(bookid));
            }
        });
    } else if (pageurl.includes("chapter.jsp?") && pageurl.includes("dxNumber=")) {
        // duxiu目录页
        jQuery("#also").after('<p style="color: orange; font-size: 120%;">以下目录非完整版,由于读秀限制,仅展示匹配了 <a href="https://greasyfork.org/zh-CN/scripts/435569/" target="_blank">文献互助小帮手</a> 脚本内置关键词的条目。</p>');
    } else if (pageurl.includes("/n/slib/book/slib/") || pageurl.includes("/n/jpgfs/book/base/")) {
        var downloading = false;
		let tip_fomrat = "设定下载格式:PDF方便,失败页会留空,适合成功率高、不易触发验证码的场景;ZIP包生成速度可能较慢,配置低的电脑慎用;分页下载节省内存,但频繁下载可能干扰你使用浏览器,下载完成后请手动将全部图片收集到一个文件夹,否则多个下载任务的文件会因自动命名难以辨别";
		let tip_zoom = "设定zoom值:值越大越清晰,文件体积也越大;本页面阅读器zoom值为0,若清晰度可用,无需调整";
        var pages = JSON.parse(html.match(/var pages = (\[.*?\]);/)[1]);
        var logarea = `<div id="helperdiv"><a style="display: block; color: #333;" href="#" onclick="(function(){jQuery('textarea#spageslist').toggle()})()">显示/隐藏 页面ID输入区域</a><textarea id="spageslist" rows="12" placeholder="如需指定待下载页面,请在此处输入页面ID列表,每行一个。页面ID为6位长度的字符串,如cov001、!00012、000123等,可点“获取页面列表”获取,也可参考之前的下载log。此功能适用于补下部分失败页面等场景,工具条上设定的页面范围将被忽略。"></textarea><hr><span id="download_status" title="成功页数 / 完成页数 / 全部页数">下载进度</span><hr><textarea id="helperlog" rows="30" placeholder="下载功能使用提示:\n\n顶部工具条上添加的下拉框、输入框、链接、按钮各有其用,鼠标移动到上面会显示提示;\n\n${tip_fomrat};\n\n${tip_zoom};"></textarea></div>`;
        var toolbar = `<a href="#" id="downloadlist" class="dtool" title="获取页面列表">页面列表</a><select id="download_format" class="dtool w50px" title="${tip_fomrat}"><option value="pdf">PDF</option><option value="zip">ZIP</option><option value="page">分页</option></select><select id="zoomvalue" class="dtool w35px" title="${tip_zoom}"><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><input type="text" id="download_start" class="dtool w35px" value="1" title="设定下载范围-起始页"><input type="text" id="download_end" class="dtool w35px" value="${pages[5][1]}" title="设定下载范围-终止页"><input type="checkbox" id="download_all" checked="checked" class="dtool" title="是否下载封面目录等非正文页"><a href="#" id="okdownload" class="dtool">一键下载</a>`;
        // wait until jQuery loaded
        setTimeout(function() {
            if (pageurl.includes("/n/slib/book/slib/")) {
                // 全文阅读url:https://img.sslibrary.com/n/slib/book/slib/\d+/*
                jQuery("div.ToolsBar > ul").css({"width": "96%"});
                jQuery("div.ToolsBar > ul > li.ssbook").css({"width": "160px"});
                jQuery("div.ToolsBar").children().last().after(`<a href="#" id="gettoc" class="dtool">获取目录</a>` + toolbar);
            } else {
                // 部分试读url:https://img.duxiu.com/n/jpgfs/book/base/\d+/*
                jQuery("div#t_content").css({"margin-left": "150px", "width": "100%"});
                jQuery("div#tc_right").after(`<div style="float: left; height: 23px; margin-top: 2px;">${toolbar}</div>`);
            }
            jQuery("div#reader").after(logarea);
            jQuery("select#pagejump > option").each(function(i, el){
                if (jQuery(this).val() != 5) jQuery(this).text(jQuery(this).text().replace("页", pages[jQuery(this).val()][1] + "页"));
            });
            jQuery("#downloadlist").unbind("click").bind("click", download_spages_list);
            jQuery("#okdownload").unbind("click").bind("click", okdownload);
            jQuery("#gettoc").unbind("click").bind("click", gettoc);
        }, 1000);
    }
    GM_addStyle('#helperlog::-webkit-scrollbar {display: none;} #helperlog {scrollbar-width: none; -ms-overflow-style: none; overflow-x: hidden; overflow-y: auto;} #helperdiv {text-align: center; position: fixed; right: 30px; top: 60px; width: 250px; min-height:500px; background-color: #bfbfbf; border: 1px solid grey;} #helperdiv > hr {margin: 1px 0 1px 0;} #spageslist {padding: 3px; width: 95%; display: none;} #helperlog {background-color: #cecece; padding: 3px; width: 95%;} .dtool {margin-right: 10px; float: left;} .w35px {width: 35px;} .w50px {width: 50px;} div.ToolsBar > ul > li {margin: 0 10px 0 0} span.cpstatus {font-size: 0.8em; color: gray;} .rcresult, .tgresult {width: 100%; background-color: #efefef; padding: 10px;} .rcitem {border-bottom: 1px dotted #ababab}');
    if (typeof jQuery === "undefined" || jQuery === null) return;
    jQuery(".copybid").unbind("click").bind("click", copybid_clicked);
    jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked);
    jQuery(".copymeta").unbind("click").bind("click", copymeta_clicked);
})();