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

①讀秀試讀或者包庫全文、匯雅電子書的一鍵下載 ② 在圖書館參考諮詢聯盟(ucdrs)或讀秀(duxiu)以及他們鏡像站上顯示文獻的ssid或dxid,用於圖書文獻互助、羣組找書等場景;顯示大學數字圖書館國際合作計劃(cadal)的書號-ssno,用於查詢下載中美百萬書冊;顯示社科文獻中心、日本內閣文庫等文獻站點的索書號。 ③ 提供各文獻站點、圖書電商和豆瓣圖書的互訪鏈接。 ④ 一鍵複製各文獻站點的索書號、圖書元數據。 To搜索[紅太狼的平底鍋]的朋友:提供紅太狼的平底鍋的部分功能,如顯示ssid,但不提供售賣,下載請自行找百度網盤羣組;顯示dxid或其它索書號、雙向鏈接、一鍵複製等爲平底鍋沒有的新加功能。

目前為 2022-10-19 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name 文献互助小帮手:①读秀PDF一键下载 ②图书馆联盟、读秀、超星、中美百万显示SSID等索书号 ③各文献站、图书电商站与豆瓣的互访链接 ④一键复制元数据
  3. // @name:zh-CN 文献互助小帮手:①读秀PDF一键下载 ②图书馆联盟、读秀、超星、中美百万显示SSID等索书号 ③各文献站、图书电商站与豆瓣的互访链接 ④一键复制元数据
  4. // @name:zh-TW 文獻互助小幫手:①讀秀PDF一鍵下載 ②圖書館聯盟、讀秀、超星、中美百萬顯示SSID等索書號 ③各文獻站、圖書電商站與豆瓣的互訪鏈接 ④一鍵複製元數據
  5. // @name:en Literature mutual helper
  6. // @name:ja 文献相互支援
  7. // @namespace ucdrs.superlib.net
  8. // @version 1.10.3
  9. // @update-note 修复:试读、全文下载功能,无封底时误认为有封底,以及判断是否触发验证码时函数typo
  10. // @update-note 优化:试读、全文下载功能,在placeholder中添加了一些提示
  11. // @author Theron
  12. // @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==
  13. // @match *://book.ucdrs.superlib.net/views/specific/*
  14. // @match *://book.ucdrs.superlib.net/search*
  15. // @match *://book.dglib.superlib.net/views/specific/*
  16. // @match *://book.dglib.superlib.net/search*
  17. // @match *://search.douban.com/book/subject_search*
  18. // @match *://book.douban.com/isbn/*
  19. // @match *://book.douban.com/subject_search*
  20. // @match *://book.douban.com/tag/*
  21. // @match *://book.douban.com/subject/*
  22. // @match *://book.douban.com/series/*
  23. // @match *://book.douban.com/works/*
  24. // @match *://book.douban.com/producers/*
  25. // @match *://book.douban.com/press/*
  26. // @match *://book.douban.com/author/*/books*
  27. // @match *://book.douban.com/people/*/wish*
  28. // @match *://book.douban.com/people/*/do*
  29. // @match *://book.douban.com/people/*/collect*
  30. // @match *://www.douban.com/doulist/*
  31. // @match *://book.douban.com/cart*
  32. // @match *://cadal.edu.cn/cadalinfo/search*
  33. // @match *://cadal.edu.cn/cardpage/bookCardPage?*ssno=*
  34. // @match *://fx.ccelib.com/detail_*
  35. // @match *://fx.ccelib.com/s?*
  36. // @match *://www.ncpssd.org/Literature/ancientbooklist.aspx*
  37. // @match *://www.ncpssd.org/Literature/articleinfo.aspx*
  38. // @match *://www.digital.archives.go.jp/DAS/meta/*
  39. // @match *://www.digital.archives.go.jp/file/*.html
  40. // @match *://e.jd.com/*.html*
  41. // @match *://item.jd.com/*.html*
  42. // @match *://e.dangdang.com/products/*.html*
  43. // @match *://product.dangdang.com/*.html*
  44. // @match *://read.douban.com/ebook/*/*
  45. // @match *://www.dedao.cn/ebook/detail?*
  46. // @match *://www.bookschina.com/*
  47. // @match *://citic.cmread.com/zxHtml/html/paperBookDetailShare.html?*
  48. // @match *://www.kongfz.com/publisher/*/*
  49. // @match *://www.kongfz.com/writer/*/*
  50. // @match *://shop.kongfz.com/*
  51. // @match *://book.kongfz.com/*/*/*
  52. // @match *://book.kongfz.com/C*/*
  53. // @match *://item.kongfz.com/*
  54. // @match *://search.kongfz.com/product_result/?*
  55. // @match *://search.kongfz.com/item_result/?*
  56. // @match */n/slib/book/slib/*
  57. // @match */n/jpgfs/book/base/*
  58. // @require https://gf.qytechs.cn/scripts/450973-gb2312utf8/code/GB2312UTF8.js?version=1091107
  59. // @require https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js
  60. // @require https://cdn.bootcdn.net/ajax/libs/jszip/3.9.1/jszip.min.js
  61. // @require https://cdn.bootcdn.net/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
  62. // @include */search?*
  63. // @include *bookDetail.jsp?*
  64. // @include *chapter.jsp?*
  65. // @include *book.do?*
  66. // @exclude *://*.google./*
  67. // @exclude *://*.bing./*
  68. // @description ①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。
  69. // @description:zh-CN ①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。
  70. // @description:zh-tw ①讀秀試讀或者包庫全文、匯雅電子書的一鍵下載 ② 在圖書館參考諮詢聯盟(ucdrs)或讀秀(duxiu)以及他們鏡像站上顯示文獻的ssid或dxid,用於圖書文獻互助、羣組找書等場景;顯示大學數字圖書館國際合作計劃(cadal)的書號-ssno,用於查詢下載中美百萬書冊;顯示社科文獻中心、日本內閣文庫等文獻站點的索書號。 ③ 提供各文獻站點、圖書電商和豆瓣圖書的互訪鏈接。 ④ 一鍵複製各文獻站點的索書號、圖書元數據。 To搜索[紅太狼的平底鍋]的朋友:提供紅太狼的平底鍋的部分功能,如顯示ssid,但不提供售賣,下載請自行找百度網盤羣組;顯示dxid或其它索書號、雙向鏈接、一鍵複製等爲平底鍋沒有的新加功能。
  71. // @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
  72. // @description:ja ①LibraryReference Alliance(ucdrs)またはDuxiu(duxiu)からssid / dxidを取得②ZhongmeiMillion(cadal)からssnoを取得③ucdrs、duxiu、cadalからDoubanBooksへのリンクを提供
  73. // @grant GM_registerMenuCommand
  74. // @grant GM_unregisterMenuCommand
  75. // @grant GM_setValue
  76. // @grant GM_getValue
  77. // @grant GM_xmlhttpRequest
  78. // @grant GM_addStyle
  79. // @license Copyright Theron
  80. // ==/UserScript==
  81.  
  82. /* jslint esversion: 6 */
  83. /*globals jQuery, GB2312UTF8, JSZip, saveAs */
  84.  
  85. function bookid2link(bookid) {
  86. var lib;
  87. if (bookid.match(/^\d{8}$/)) {
  88. bookid = bookid.slice(0, 7);
  89. lib = "duxiu";
  90. } else if (bookid.match(/^CD\d{8}$/i)) {
  91. bookid = bookid.slice(2, 9);
  92. lib = "cadal";
  93. } else if (bookid.match(/^BC\d{8}$/i)) {
  94. bookid = bookid.slice(2, 9);
  95. lib = "ncpssd";
  96. } else if (bookid.match(/^[MF]\d{19}$/i)) {
  97. bookid = bookid.slice(15, 20);
  98. lib = "najda";
  99. }
  100. 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");
  101. }
  102.  
  103. function showLink() {
  104. showlink = GM_getValue("showlink", "n");
  105. GM_setValue("showlink", showlink === "n" ? "y" : "n");
  106. showlink = GM_getValue("showlink", "n");
  107. GM_unregisterMenuCommand(menuid_showlink);
  108. menuid_showlink = GM_registerMenuCommand(showlink === "n" ? "改为显示链接" : "改为隐藏链接", showLink, "l");
  109. alert(showlink === "y" ? "将显示图书ID到百度网盘存储路径的链接,刷新页面生效" : "不再显示图书ID到百度网盘存储路径的链接,刷新页面生效");
  110. }
  111.  
  112. var showlink = GM_getValue("showlink", "n");
  113. var menuid_showlink = GM_registerMenuCommand(showlink === "n" ? "改为显示链接" : "改为隐藏链接", showLink, "l");
  114. function ss2rc() {
  115. enablerc = GM_getValue("enablerc", "n");
  116. GM_setValue("enablerc", enablerc === "n" ? "y" : "n");
  117. enablerc = GM_getValue("enablerc", "n");
  118. GM_unregisterMenuCommand(menuid_enablerc);
  119. menuid_enablerc = GM_registerMenuCommand(enablerc === "n" ? "芝麻开门" : "芝麻关门", ss2rc, "z");
  120. alert(enablerc === "y" ? "将尝试获取ssid对应图书的秒传码,此为试验性功能,随时可能失效,请低调使用。使用方法:右键点击ssid右侧的📋,每日限3次。" : "不再尝试获取ssid对应图书的秒传码");
  121. }
  122.  
  123. var enablerc = GM_getValue("enablerc", "n");
  124. var menuid_enablerc = GM_registerMenuCommand(enablerc === "n" ? "芝麻开门" : "芝麻关门", ss2rc, "z");
  125.  
  126. var html = document.documentElement.innerHTML;
  127. // 允许连续失败的最大次数
  128. const max_failscnt = 5;
  129. // 页面下载失败,下次尝试前等待的秒数
  130. const gap_fails = 30;
  131. // 页面下载间隔随机秒数的上限、下限
  132. const sleep_max = 8;
  133. const sleep_min = 3;
  134.  
  135. (function () {
  136. 'use strict';
  137. function ogetk(object, key, default_value) {
  138. var result = object[key];
  139. return (typeof result !== "undefined") ? result : default_value;
  140. }
  141. function slim(s) {
  142. return s.replaceAll(/ +/g, "").trim();
  143. }
  144. function showbid(bookid, idtype, p=1) {
  145. var title = "";
  146. var rate = "";
  147. var prefix = "";
  148. if (idtype == "SS号") {
  149. prefix = bookid.slice(0, 4);
  150. rate = ogetk(rate_ssid, prefix, "-");
  151. title = rate === "-" ? "库存无此书-灰色" : prefix + "号段库存率为" + rate + "%";
  152. } else if (idtype == "DX号") {
  153. title = "此为下架书,命中几率低,须先查得对应的SSID";
  154. } else if (idtype == "SSNO<br>") {
  155. prefix = bookid.replace(/CD/, "").slice(0, 4);
  156. rate = ogetk(rate_ssno, prefix, "-");
  157. title = rate === "-" ? "库存无此书-灰色" : prefix + "号段库存率为" + rate + "%";
  158. }
  159. var title_type = {"SS号": "ssid / SuperStar ID", "DX号": "dxid / Duxiu ID", "SSNO<br>": "CADAL用于编目的SSNO", "BCID": "社科院文献中心编目的barcodenum", "DAID": "日本国立公文书馆内阁文库文献编号,有F和M开头两类,分别为辑合/单本的ID"}[idtype];
  160. var color = rate === "-" ? "grey" : "blue";
  161. var opacity = rate === "-" ? 1 : (parseFloat(rate) / 100 + 0.2);
  162. 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>`;
  163. if (showlink === "y") {
  164. var link = bookid2link(bookid);
  165. bookid_snippet = `<a href="${link}" target="_blank" style="text-decoration: none;">${bookid_snippet}</a>`;
  166. }
  167. if (p !== 1) {
  168. return bookid_snippet;
  169. }
  170. 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>`;
  171. }
  172. function sepit(s, sep) {
  173. if (sep === "|") {
  174. s = " | " + s;
  175. } else if (sep === "br") {
  176. s = s + "<br>";
  177. } else if (sep === "p") {
  178. s = `<p style="text-align: center">${s}</p>`;
  179. } else if (sep) {
  180. s = sep + s;
  181. }
  182. return s;
  183. }
  184. function shortenbkn(s) {
  185. s = s.trim().replace(/(.)[\[【\((].*/, "$1");
  186. while (s.includes(" ") && s.replace(/[A-z0-9]{2}/g, "的").length > 20) {
  187. s = s.replace(/ [^ ]*$/, "");
  188. }
  189. return s;
  190. }
  191. function ucdrslink(bookname, isbn = "", args = {}) {
  192. var args0 = {"sep": "", text: "参考联盟", cls: "", style: ""};
  193. args = args === {} ? args0 : Object.assign({}, args0, args);
  194. var sep = args.sep;
  195. var text = args.text;
  196. var cls = args.cls;
  197. var style = args.style;
  198. if (!style.includes("font-size")) style += "font-size: 90%;";
  199. if (text === "") text = "参考联盟";
  200. 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);
  201. return r.replace(' class=""', '').replace(' style=""', '');
  202. }
  203. function ucdrslink4db(bookname, args = {"sep": "|"}) {
  204. args.style = "font-size: 80%; color: orange;";
  205. return ucdrslink(bookname, "", args);
  206. }
  207. function dzylink(key, args = {}) {
  208. var args0 = {"sep": "|", text: "多抓鱼", cls: "", style: ""};
  209. args = args === {} ? args0 : Object.assign({}, args0, args);
  210. var sep = args.sep;
  211. var text = args.text;
  212. var cls = args.cls;
  213. var style = args.style;
  214. if (!style.includes("font-size")) style += "font-size: 90%;";
  215. if (text === "") text = "多抓鱼";
  216. var r = sepit(`<a href="https://www.duozhuayu.com/search/book/${key.replace(/\//g, '')}" target="_blank" class="${cls}" style="${style}" title="多抓鱼">${text}</a>`, sep);
  217. return r.replace(' class=""', '').replace(' style=""', '');
  218. }
  219. function dblink(bookname, isbn = "", args = {}) {
  220. var args0 = {"sep": "|", "text": "", "cls": "", "style": ""};
  221. args = args === {} ? args0 : Object.assign({}, args0, args);
  222. var sep = args.sep;
  223. var text = args.text;
  224. var cls = args.cls;
  225. var style = args.style;
  226. if (!style.includes("font-size")) style += "font-size: 90%;";
  227.  
  228. // color: blue
  229. var dbname = isbn === "" ? "豆瓣搜索" : "豆瓣直达";
  230. if (text === "") text = dbname;
  231. if (pageurl.includes("://www.ncpssd.org/")) {
  232. text = "豆瓣";
  233. }
  234. var href = isbn === "" ? "https://search.douban.com/book/subject_search?search_text=" + bookname.trim() : `https://book.douban.com/isbn/${isbn.trim()}/?bookname=${bookname.trim()}`;
  235. return sepit(`<a href="${href}" target="_blank" class="${cls}" style="${style}" title="${dbname}">${text}</a>`, sep).replace(' class=""', '').replace(' style=""', '');
  236. }
  237. function dxtoc(url) {
  238. url = url.replace("bookDetail.jsp", "chapter.jsp").replace(/sw=[^/&]*/, "sw=1 2 3 中 4 5 6 7 8 大 参考 9 是 人 上 附 不 小 从 之 下 有 用 以 多 后 表 什么 十 10 部分 前 到 图 我 如何 要 可 内 里 记 区 外 天 来 你 西 再 序 南 步骤 同 录 附 去 女 篇 开 文 都 题 东 就 节 他 也 公 北 结 右 又 少 百 那 这 关 没 千 表格 个 男 章 0 论 几 今 左 万");
  239. return ` | <a href="${url}" target="_blank" style="font-size: 90%;">目录</a>`;
  240. }
  241. function dedao() {
  242. bookname = document.querySelector("figure.ebook-detail-header > figcaption.detail > h3.title").textContent.trim().split("(")[0];
  243. m_isbn = html.match(/"href":"isbn(\d+)/);
  244. isbn = m_isbn ? m_isbn[1] : "";
  245. let link = document.createElement("p");
  246. link.innerHTML = ucdrslink(bookname, isbn) + dblink(bookname, isbn);
  247. document.querySelector("figure.ebook-detail-header > figcaption.detail > h3.title").after(link);
  248. }
  249. function iid2bookid(iid) {
  250. // 2022年9月初,ucdrs和duxiu的封面iid参数都启用了v3,之前的算法无法从iid推导ssid了。ucdrs源码中包含了ssid,无需计算,duxiu的源码中ssid字段都为空,因此只能返回dxid
  251. if (iid.length >= 112) return "00000000";
  252. var bookid = "";
  253. var part = "";
  254. var tailhex = parseInt(iid.substring(iid.length - 2), 16);
  255. var encoded = iid.substring(0, iid.length - 32);
  256. var i;
  257. for (i = 0; i < encoded.length; i = i + 2) {
  258. part = encoded.substring(i, i + 2);
  259. bookid += String.fromCharCode(parseInt(part, 16) - tailhex);
  260. }
  261. console.log(bookid);
  262. return bookid.match(/^\d/) ? bookid.replace(/\//g, "").match(/^\d{8,}/)[0] : "00000000";
  263. }
  264. function copybid(bookid, bidtype) {
  265. 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>`;
  266. }
  267. function copymeta(bookid) {
  268. 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>`;
  269. }
  270. function copyText(text) {
  271. // 复制相关代码参考 https://gf.qytechs.cn/zh-CN/scripts/437492
  272. if (navigator.clipboard) {
  273. navigator.clipboard.writeText(text);
  274. } else {
  275. let textarea = document.createElement("textarea");
  276. document.body.appendChild(textarea);
  277. textarea.style.position = "absolute";
  278. textarea.style.clip = "rect(0 0 0 0)";
  279. textarea.value = text;
  280. textarea.select();
  281. document.execCommand("copy", true);
  282. textarea.remove();
  283. }
  284. }
  285. function nes(s) {
  286. return s === "" ? "-" : s;
  287. }
  288. function hsize(i) {
  289. let k = 1024;
  290. let m = k * 1024;
  291. let g = m * 1024;
  292. if (i >= g) return Math.round(i / g * 100, 2) / 100 + "G";
  293. if (i >= m) return Math.round(i / m * 100, 2) / 100 + "M";
  294. if (i >= k) return Math.round(i / k * 100, 2) / 100 + "K";
  295. return i + "bytes";
  296. }
  297. function fmb_clicked(event) {
  298. let ele = event.target;
  299. if (jQuery(ele).attr("href") !== "#") {
  300. return;
  301. }
  302. event.preventDefault();
  303. // 先看看有没有缓存
  304. let fmbid = jQuery(ele).attr("data-fmbid");
  305. let md5_cache = GM_getValue("fmb" + fmbid, "");
  306. let ele_status = jQuery(ele).next();
  307. let filename = jQuery(ele).prev().prev().prev().text();
  308. let filesize = jQuery(ele).prev().prev().attr("title").split(" ")[1];
  309. if (md5_cache !== "") {
  310. let [cmd5, smd5] = md5_cache;
  311. if (smd5 !== "") {
  312. 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}`);
  313. jQuery(ele).attr("title", "点击此链接,尝试直接转存,如失败需使用秒传连接脚本转存");
  314. ele_status.html("缓存命中,秒传码已复制,点击🔗也可直接转存");
  315. } else {
  316. ele_status.html("缓存命中,秒传码已复制");
  317. }
  318. return;
  319. }
  320. // 超额不再查询
  321. let today = new Date().toLocaleDateString('sv').replaceAll('-', '');
  322. let cnts = GM_getValue("ss2rc_cnt", {});
  323. let cnt = cnts[today] === undefined ? 0 : cnts[today];
  324. if (cnt >= 9) return;
  325. //jQuery(".getfmb").unbind("click").bind("click", fmb_clicked);
  326. GM_xmlhttpRequest({
  327. method: "GET",
  328. url: `https://api.freembook.com/acquire?book_id=${fmbid}&tk=${cnt <= 2 ? "" : (cnt <= 5 ? "freembook" : "freemdict")}`,
  329. headers: {
  330. "referer": "https://api.freembook.com"
  331. },
  332. timeout: 10000,
  333. onload(res) {
  334. let rdata = JSON.parse(res.responseText);
  335. if (rdata.code !== 0) {
  336. if (rdata.code === 1005) {
  337. if (cnt <= 2) cnt = 3;
  338. if (cnt <= 5) cnt = 6;
  339. if (cnt <= 8) cnt = 9;
  340. cnts[today] = cnt;
  341. GM_setValue("ss2rc_cnt", cnts);
  342. jQuery(".fmbquota").each(function(i, el) {
  343. jQuery(el).text(cnt + 1);
  344. });
  345. ele_status.html(`获取秒传码失败,错误码 ${rdata.code} - ${rdata.message}${cnt === 9 ? " - 额度用完了,请明天再试(自行通过freembook查询或同IP的其他人查询也会消耗额度)" : " - 请重试"}`);
  346. } else {
  347. ele_status.html(`获取秒传码失败,错误码 ${rdata.code} - ${rdata.message}`);
  348. }
  349. return;
  350. }
  351. cnts[today] = cnt + 1;
  352. GM_setValue("ss2rc_cnt", cnts);
  353. let [cmd5, smd5] = rdata.book_baidu;
  354. GM_setValue("fmb" + fmbid, rdata.book_baidu);
  355. if (smd5 !== "") {
  356. 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}`);
  357. jQuery(ele).attr("title", "点击此链接,尝试直接转存,如失败需使用秒传连接脚本转存");
  358. copyText(`${cmd5}#${smd5}#${filesize}#${filename}`);
  359. ele_status.html("秒传码已复制,点击🔗也可直接转存");
  360. } else {
  361. copyText(`${cmd5}#${filesize}#${filename}`);
  362. ele_status.html("秒传码已复制");
  363. }
  364. },
  365. onerror(res) {
  366. ele_status.html(`查询秒传码时发生错误,请稍后重试`);
  367. },
  368. onabort(res) {
  369. ele_status.html(`查询秒传码的任务被取消,请稍后重试`);
  370. },
  371. ontimeout(res) {
  372. ele_status.html(`查询秒传码的任务超时,请稍后重试`);
  373. },
  374. });
  375. jQuery(".fmbquota").each(function(i, el) {
  376. jQuery(el).text(cnt + 1);
  377. });
  378. }
  379. function copybid_clicked(event) {
  380. let ele = event.target;
  381. let bid = jQuery(ele).attr("data-text");
  382. jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked);
  383. let bidtype = bid.length === 8 ? "SSID" : "DXID";
  384. if (bid.length === 10) bidtype = bid[0] === "B" ? "BCID" : "SSNO";
  385. if (bid.length === 20) bidtype = "DAID";
  386. if ((bidtype === "SSID" || bidtype === "DXID") && enablerc === "y" && event.type === "contextmenu" && !pageurl.includes("/s?")) {
  387. let today = new Date().toLocaleDateString('sv').replaceAll('-', '');
  388. let cnts = GM_getValue("ss2rc_cnt", {});
  389. let cnt = cnts[today] === undefined ? 0 : cnts[today];
  390. let tip = cnt <= 8 ? `正在查询${bid}的秒传码......请耐心等待` : `根据ssid/dxid获取秒传链接为试验性功能,请低调使用。获取秒传码每日每IP限额9次,你已用完额度,只能查看资源列表。要获得秒传码,请明天再尝试!(自行通过freembook查询或同IP的其他人查询也会消耗额度,因此已用额度可能与你印象中不一致。)`;
  391. let nostock = jQuery(ele).prev().find("span.bid").attr("style").includes("color: grey;");
  392. if (nostock) tip = "灰色SSID的书无库存,请不要查询!";
  393. let snippet = `<div class="rcresult">${tip}</div><div class="tgresult"></div>`;
  394. let isdx = html.includes("/views/specific/") ? false : true;
  395. let block = isdx ? jQuery(ele).parent().parent().parent() : jQuery(ele).parent().parent();
  396. let bookname = pageurl.includes("/search?") ? block.find("input[id^='title']").val().replace(/<.*?>/g, "") : jQuery(isdx ? "div.card_text > dl > dt" : "div.tutilte").text();
  397. let rcresult = pageurl.includes("/search?") ? block.find("div.rcresult") : jQuery("div.rcresult");
  398. let tgresult = pageurl.includes("/search?") ? block.find("div.tgresult") : jQuery("div.tgresult");
  399. if (rcresult.length === 0) {
  400. // 参考联盟详情页,元信息很少而封面很大时,避免查询结果被遮蔽
  401. if (!isdx && pageurl.includes("/views/specific/")) jQuery("div.leftnav_tu > div:last").css({"height": "", "min-height": "265px"});
  402. (pageurl.includes("/search?") ? block.find(isdx ? "dl" : "div.get") : jQuery(isdx ? "div.card_text > dl" : "div.leftnav_tu").children().last()).after(snippet);
  403. rcresult = pageurl.includes("/search?") ? block.find("div.rcresult") : jQuery("div.rcresult");
  404. tgresult = pageurl.includes("/search?") ? block.find("div.tgresult") : jQuery("div.tgresult");
  405. } else {
  406. rcresult.text(tip);
  407. }
  408. GM_xmlhttpRequest({
  409. method: "GET",
  410. url: `https://api.freembook.com/search?category=tg&q=${bookname}`,
  411. headers: {
  412. "referer": "https://api.freembook.com"
  413. },
  414. timeout: 10000,
  415. onload(res) {
  416. console.log(res.responseText);
  417. let rdata = JSON.parse(res.responseText);
  418. if (rdata.code !== 0) {
  419. tgresult.html(`在tg库查询${bookname}时发生错误,错误码 ${rdata.code} - ${rdata.message}`);
  420. return;
  421. }
  422. let books = rdata.books;
  423. if (books.length === 0) {
  424. tgresult.html(`在tg库查询${bookname}无结果`);
  425. return;
  426. }
  427. let r = "";
  428. let seq = 0;
  429. for (let book of books) {
  430. let [bookname, author, language, pubdate, isbn, fids] = book;
  431. seq += 1;
  432. r += `<p class="rcitem"><span class="seq">${seq}.</seq> <span title="书名">${nes(bookname)}</span>, <span title="作者">${nes(author)}</span>, <span title="书号">${nes(isbn)}</span>`;
  433. fids = fids.split("|");
  434. for (let i = 0; i < fids.length; i++) {
  435. let fid = fids[i];
  436. if (fid !== "") {
  437. let ftype = ["mobi", "epub", "azw3", "pdf"][i];
  438. r += `, <a href="https://t.me/freembook_channel/${fid}" target="_blank" title="跳转到telegram客户端完成下载,不消耗每日额度。">${ftype}</a>`;
  439. }
  440. }
  441. r += "</p>";
  442. }
  443.  
  444. if (r) {
  445. r = `以下为检索书名获得的telegram 群组文件,请自行辨别是否所需图书。数据来源<a href="https://freembook.com/" target="_blank">freembook</a>。` + r;
  446. tgresult.html(r);
  447. }
  448. },
  449. onerror(res) {
  450. tgresult.html(`在tg库查询${bookname}时发生错误,请稍后重试:<br>${res.responseText}`);
  451. },
  452. onabort(res) {
  453. tgresult.html(`在tg库查询${bookname}的任务被取消,请稍后重试:<br>${res.responseText}`);
  454. },
  455. ontimeout(res) {
  456. tgresult.html(`tg库查询${bookname}的任务超时,请稍后重试:<br>${res.responseText}`);
  457. },
  458. });
  459. GM_xmlhttpRequest({
  460. method: "GET",
  461. url: `https://api.freembook.com/search?category=duxiu&q=${bid}`,
  462. headers: {
  463. "referer": "https://api.freembook.com"
  464. },
  465. timeout: 10000,
  466. onload(res) {
  467. let rdata = JSON.parse(res.responseText);
  468. if (rdata.code !== 0) {
  469. rcresult.html(`查询${bid}秒传码发生错误,错误码 ${rdata.code} - ${rdata.message}`);
  470. return;
  471. }
  472. let books = rdata.books;
  473. if (books.length === 0) {
  474. rcresult.html(`查询${bid}秒传码无结果`);
  475. return;
  476. }
  477. let books_filter = {};
  478. for (let book of books) {
  479. let [bidx, ssid, filename, filesize, dxid, bookname, pubdate, page, isbn, rctype] = book;
  480. let key = filesize + "-" + rctype;
  481. if (books_filter[key] !== undefined) continue;
  482. books_filter[key] = bidx;
  483. }
  484. let r = "";
  485. let seq = 0;
  486. for (let book of books) {
  487. let [bidx, ssid, filename, filesize, dxid, bookname, pubdate, page, isbn, rctype] = book;
  488. if (books_filter[filesize + "-32"] !== undefined && books_filter[filesize + "-32"] !== bidx) continue;
  489. if (books_filter[filesize + "-32"] === undefined && books_filter[filesize + "-0"] !== undefined && books_filter[filesize + "-0"] !== bidx) continue;
  490. seq += 1;
  491. 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>`;
  492. }
  493.  
  494. if (r) {
  495. r = `<p>今日额度已使用 <span class="fmbquota">${cnt}</span> / 9,点击🔗将消耗一次限额,并获取${bid}的秒传码。使用<a href="https://gf.qytechs.cn/zh-CN/scripts/424574" target="_blank">秒传链接脚本</a>可提取文件。数据来源<a href="https://freembook.com/" target="_blank">freembook</a>。</p>` + r;
  496. rcresult.html(r);
  497. jQuery(".getfmb").unbind("click").bind("click", fmb_clicked);
  498. } else {
  499. rcresult.html(`${bid}暂无秒传链接,库存率为0的书请不要尝试。本次查询不计用量,今日额度已使用 <span class="fmbquota">${cnt}</a> / 9。`);
  500. }
  501. },
  502. onerror(res) {
  503. rcresult.html(`查询${bid}的秒传码时发生错误,请稍后重试:<br>${res.responseText}`);
  504. },
  505. onabort(res) {
  506. rcresult.html(`查询${bid}秒传码的任务被取消,请稍后重试:<br>${res.responseText}`);
  507. },
  508. ontimeout(res) {
  509. rcresult.html(`查询${bid}秒传码的任务超时,请稍后重试:<br>${res.responseText}`);
  510. },
  511. });
  512. }
  513. copyText(bid);
  514. jQuery(ele).siblings(".copy_status").text("已复制" + bidtype).show().delay(1000).hide(0);
  515. return false;
  516. }
  517. function copymeta_clicked(event) {
  518. let ele = event.target;
  519. let bid = jQuery(ele).attr("data-text");
  520. let bidtype = bid.length === 8 ? "SSID" : "DXID";
  521. let meta;
  522. let bookname;
  523. let score;
  524. let popularity;
  525. let ele_title;
  526. let libscnt;
  527. let idx;
  528. if (pageurl.includes("superlib.net/search")) {
  529. meta = jQuery(ele).parent().parent().parent().parent().parent().text();
  530. meta = meta.replace(/\s+《(.*?)》.*\s+/, "【书名】$1");
  531. meta = meta.replace(/(作者|页数|出版社|出版日期|丛书名称|简介|主题词):/g, "\n【$1】");
  532. meta = meta.replace(/\meta+/g, "");
  533. meta = meta.trim() + `\n【链接】${pageurl.split("/search")[0] + jQuery(ele).prev().prev().attr("href")}`;
  534. } else if (pageurl.includes("/views/specific/")) {
  535. meta = jQuery(ele).parent().parent().next().text();
  536. meta += jQuery(".tu_content").text().replace("内容提要:", "【内容提要】");
  537. meta = meta.replace(/\n\s+/g, "\n").replace("【作 者】", "【作者】");
  538. meta = meta.replace(/\n([^【])/g, "$1");
  539. bookname = jQuery(".tutilte").text();
  540. meta = `【书名】${bookname}\n` + meta + `\n【链接】${pageurl}`;
  541. } else if (pageurl.includes("://book.douban.com/subject")) {
  542. bidtype = "DBID";
  543. bookname = jQuery("h1")[0].textContent.trim();
  544. score = jQuery(".rating_people").text() === "" ? jQuery(".rating_sum").text().trim() : jQuery(".rating_num").text().trim() + "分 / " + jQuery(".rating_people").text();
  545. 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("全部", ",书评");
  546. meta = jQuery("#info").text();
  547. meta = `【书名】${bookname}\n【评分】${score}\n【热度】${popularity}` + meta;
  548. meta = meta.replace(/\n\s+/g, "\n").replace(/:\n+/g, ": ").replace(" ", " ").replace(/(作者|出版社|出品方|副标题|原作名|译者|出版年|页数|定价|装帧|丛书|ISBN): */g, "【$1】").replace(/\n([^【])/g, "$1").replace(/【热度】\n/, "");
  549. meta += `\n【链接】https://book.douban.com/subject/${bid}/`;
  550. } else if (pageurl.includes("://www.ncpssd.org/Literature/articleinfo.aspx")) {
  551. bidtype = "BCID";
  552. meta = jQuery(ele).parent().parent().text().replace(/\n\s+/g, "\n").replace(/(.*)古籍 📋 /, "【书名】$1").replace(/(阅读全文|全文下载)/g, "").replace(/(分类|条码号|责任者|出版者|出版时间|版本|索书号|备注):/g, "【$1】").trim() + `\n【链接】${pageurl}`;
  553. } else if (pageurl.includes("://cadal.edu.cn/cardpage/bookCardPage")) {
  554. bidtype = "SSNO";
  555. 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}`;
  556. } else if (pageurl.includes("://cadal.edu.cn/cadalinfo/search")) {
  557. bidtype = "SSNO";
  558. bookname = jQuery(ele).prev().prev().text().trim();
  559. 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", "")}`;
  560. } else if (pageurl.includes("/search?sw=")) {
  561. ele_title = jQuery(ele).prev().prev().prev();
  562. bookname = jQuery(ele).prev().prev().prev().text().trim().match("^《(.*)》$")[1];
  563. 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]}`;
  564. } else if (pageurl.includes("/bookDetail.jsp?")) {
  565. libscnt = jQuery("div#otherlib > a:last").text();
  566. libscnt = libscnt.match(/>>更多\(收藏馆:\d+\)/) ? libscnt.match(/>>更多\(收藏馆:(\d+)\)/)[1] : 0;
  567. idx = jQuery("div#bookphoto > p").text().match(/.*(被引用指数.*)/);
  568. idx = idx ? idx[1].replace("被图书", ",被图书").replaceAll("数", "数 ") : "";
  569. popularity = (libscnt ? "收藏馆 " + libscnt : "") + (idx ? "," + idx : "");
  570. 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]}`;
  571. } else if (pageurl.includes("://fx.ccelib.com/detail_")) {
  572. libscnt = jQuery("div.titStyle > em").text();
  573. libscnt = libscnt ? "馆藏 " + libscnt.match(/(\d+)/)[1] : "";
  574. 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]}`;
  575. } else if (pageurl.includes("/s?")) {
  576. 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")}`;
  577. }
  578.  
  579. meta = `【${bidtype}】${bid}\n` + meta.replace(" ,", ",").replace(/,([A-z0-9])/g, ", $1");
  580. meta = meta.replace(/^【DBID】.*\n/, "");
  581. meta = meta.replace(/\n+/g, "\n");
  582. meta = meta.replace(/\s+$/g, "");
  583. copyText(meta);
  584. jQuery(ele).siblings(".copy_status").text("已复制图书元数据").show().delay(1000).hide(0);
  585. return false;
  586. }
  587. function gettoc() {
  588. if (document.querySelector("ul#ztree").textContent === "") {
  589. alert("本书无目录数据可用");
  590. return false;
  591. }
  592. var tocurl = "http://path.sslibrary.com" + html.match(/<ul id="ztree" param="(.*?)" class="ztree">/)[1].replace(/amp;/g, "");
  593. GM_xmlhttpRequest({
  594. method: "GET",
  595. url: tocurl,
  596. timeout: 10000,
  597. onload(res) {
  598. var toc = "";
  599. console.log(res.responseText);
  600. const nodes = res.responseText.matchAll(/<(?:tree|node) id="(.*?)" Caption="(.*?)" PageNumber="(\d+)"/g);
  601. for (const node of nodes) {
  602. let nodeid = node[1];
  603. let tabs = (nodeid.match(/-/g) || []).length;
  604. let caption = node[2].trim();
  605. let pagenum = node[3];
  606. toc += `${"\t".repeat(tabs)}${caption}\t${pagenum}\n`;
  607. }
  608. var pagesum = 0;
  609. if (pages[4][1] > 0) {pagesum += pages[4][1]; toc = `目录\t-${pagesum}\n` + toc;}
  610. if (pages[3][1] > 0) {pagesum += pages[3][1]; toc = `前言\t-${pagesum}\n` + toc;}
  611. if (pages[2][1] > 0) {pagesum += pages[2][1]; toc = `版权\t-${pagesum}\n` + toc;}
  612. if (pages[1][1] > 0) {pagesum += pages[1][1]; toc = `书名\t-${pagesum}\n` + toc;}
  613. if (pages[0][1] > 0) {pagesum += pages[0][1]; toc = `封面\t-${pagesum}\n` + toc;}
  614. if (pages[6][1] > 0) toc += `附录\t${pages[5][1] + 1}\n`;
  615. if (pages[7][1] > 0) toc += `封底\t${pages[5][1] + 1 + pages[6][1]}\n`;
  616. copyText(toc);
  617. alert("目录已复制到剪切板上,可在 PdgCntEditor 中直接粘贴使用");
  618. },
  619. onerror(res) {
  620. alert(`获取目录时发生错误,请稍后重试:${res.responseText}`);
  621. },
  622. onabort(res) {
  623. alert(`获取目录的任务被取消,请稍后重试。`);
  624. },
  625. ontimeout(res) {
  626. alert(`获取目录的任务超时,请稍后重试,如提示跨域权限请允许。`);
  627. },
  628. });
  629. return false;
  630. }
  631. function pad(num, n) {
  632. // https://bbs.csdn.net/topics/390547495
  633. var s = '000000000000000000000000000000' + num;
  634. return s.substr(s.length - n);
  635. }
  636. function genpages(pe, prefix, ps=1) {
  637. let spages = [];
  638. for (var i = ps; i <= pe; i++) {
  639. spages.push(prefix + pad(i, 6 - prefix.length));
  640. }
  641. return spages;
  642. }
  643. function tipspage(spage) {
  644. var prefix;
  645. if (spage === "cov001") prefix = "封面";
  646. else if (spage === "cov002") prefix = "封底";
  647. else prefix = {"!": "目录页", "b": "书名页", "f": "前言页", "a": "附录页", "l": "版权页", "0": "正文页"}[spage[0]];
  648. return prefix + " " + spage;
  649. }
  650. function gen_spages_list() {
  651. var download_start = parseInt(document.querySelector("input#download_start").value);
  652. var download_end = parseInt(document.querySelector("input#download_end").value);
  653. if (download_end < 1 || download_end > pages[5][1]) download_end = pages[5][1];
  654. if (download_start < 1) download_start = 1;
  655. if (download_start > download_end) download_start = download_end;
  656. var download_all = document.querySelector("input#download_all").checked;
  657. var spages_all = (pages[0][0] > 0) ? ['cov001'] : []; // 封面
  658. if (pages[1][1] > 0) spages_all = spages_all.concat(genpages(pages[1][1], 'bok')); // 书名
  659. if (pages[2][1] > 0) spages_all = spages_all.concat(genpages(pages[2][1], 'leg')); // 版权
  660. if (pages[3][1] > 0) spages_all = spages_all.concat(genpages(pages[3][1], 'fow')); // 前言
  661. if (pages[4][1] > 0) spages_all = spages_all.concat(genpages(pages[4][1], '!')); // 目录
  662. var spages = download_all ? spages_all : [];
  663. spages_all = spages_all.concat(genpages(pages[5][1], '', 1)); // 正文
  664. spages = spages.concat(genpages(download_end, '', download_start)); // 正文
  665. var tails = (pages[6][1] > 0) ? genpages(pages[6][1], 'att') : []; // 附录
  666. if (pages[7][1] > 0) tails.push('cov002'); // 封底
  667. spages_all = spages_all.concat(tails);
  668. if (download_all) spages = spages.concat(tails);
  669. return [spages_all, spages, download_start, download_end, download_all];
  670. }
  671. function download_spages_list() {
  672. var list = gen_spages_list()[0].join("\n");
  673. 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");
  674. var bookname = html.match(/<title>(.*?)<\/title>/)[1];
  675. var ssid = pageurl.match(/\b(\d{8})\b/)[1];
  676. saveAs(new Blob([list], {type: "text/plain;charset=utf-8"}), `${bookname}_${ssid}_pages.txt`);
  677. return false;
  678. }
  679. function appendlog(log) {
  680. //jQuery("textarea#helperlog").val(`${now} 已连续5次失败,将自动中断任务,请耐心等待下载\n` + jQuery("textarea#helperlog").val());
  681. var ele = jQuery("textarea#helperlog");
  682. var now = new Date().toLocaleString('en-US', {hour12: false}).split(" ")[1];
  683. ele.val(`${now} ${log}\n` + ele.val());
  684. }
  685. function show_failtip(failscnt, errorline) {
  686. console.log(errorline);
  687. if (failscnt === max_failscnt) {
  688. appendlog(`已连续${max_failscnt}次失败,将自动中断任务,请耐心等待下载`);
  689. } else {
  690. appendlog(`已失败${failscnt}次,${gap_fails}秒后将重试,请立即处理验证码`);
  691. alert("下载页面错误,请滚动页面查看是否需要过反爬虫验证,如多个页面加载失败,大概率是会话过期,请重新打开页面重试!");
  692. }
  693. }
  694. function okdownload() {
  695. if (downloading) {
  696. document.getElementById("okdownload").innerText = "一键下载";
  697. downloading = false;
  698. return false;
  699. }
  700. document.getElementById("okdownload").innerText = "停止下载";
  701. downloading = true;
  702. //var jpgPath = document.querySelector("div.reader > div.readerPager > input.readerImg[src^='/n/']").getAttribute("src");
  703. var jpgPath = html.match(/jpgPath: *"(.*?)",/)[1];
  704. var zoomvalue = document.querySelector("select#zoomvalue").value;
  705. var download_format = document.querySelector("select#download_format").value;
  706. var [spages_all, spages, download_start, download_end, download_all] = gen_spages_list();
  707. var temp = document.getElementById("spageslist").value.replace(/\s+/g, "\n").trim().split("\n").filter(function(s){
  708. return s.length === 6 && s.match(/^(cov|bok|leg|fow|!|att)?\d{3,}$/);
  709. });
  710. if (temp.length > 0) spages = temp;
  711. var maintip = temp.length > 0 ? `开始下载列表中的${spages.length}个页面` : `开始下载P${download_start}-P${download_end},${download_all ? "附带非正文页" : "跳过非正文页"}`;
  712. jQuery("textarea#helperlog").val(`-----\n${maintip},zoom值为${zoomvalue},目标格式为${{"pdf": "PDF", "zip": "ZIP", "page": "分页图片"}[download_format]}\n-----\n1、为了避免频繁触发验证码,下载过程中不要滚动页面,出现弹窗时则要立即向下滚动页面或打开新的阅读页面,触发验证码并通过验证,超时${max_failscnt}次会中断下载。\n2、点击停止下载可中断任务,下载任务完成或被中断后,浏览器会保存剩余文件并导出下载日志,若pdf/zip文件生成慢暂时没反应,请耐心等待,不要关闭页面`);
  713. //console.log(spages);
  714. //console.log(jpgPath);
  715. //var bookname = html.match(/<input type="hidden" name="BookName" value="(.*?)" *\/?>/)[1];
  716. var bookname = html.match(/<title>(.*?)<\/title>/)[1];
  717. //var ssid = html.match(/<input type="hidden" name="ssid" value="(.*?)" *\/?>/)[1];
  718. var ssid = pageurl.match(/\b(\d{8})\b/)[1];
  719. var jsPDF = window.jspdf.jsPDF;
  720. if(jsPDF && jsPDF.version) {
  721. console.log('jsPDF version: ' + jsPDF.version);
  722. }
  723. var pages_success = [];
  724. var pagescnt = spages.length;
  725. var imgsData = {};
  726. var imgsSize = {};
  727. var imgsExt = {};
  728. var maxwidth = 0;
  729. var maxheight = 0;
  730. var failscnt = 0;
  731. var page = 0;
  732. var timeout = 0;
  733. var now;
  734. var releasemem = function() {
  735. pages_success = [];
  736. imgsData = {};
  737. imgsSize = {};
  738. imgsExt = {};
  739. appendlog(`内存已释放`);
  740. };
  741. var savefiles = function() {
  742. if (download_format !== "page") appendlog(`正在保存${download_format}文件,请耐心等待!\n-----`);
  743. var zip = new JSZip();
  744. var doc = new jsPDF({
  745. orientation: 'p',
  746. unit: 'px',
  747. format: [imgsSize[pages_success[0]][0], imgsSize[pages_success[0]][1]],
  748. putOnlyUsedFonts:true
  749. });
  750. doc.setFontSize(72);
  751. var txt_download_done = "";
  752. var txt_download_fails = "";
  753. // var d_spages = spages.reduce((ac,a) => ({...ac,[a]:''}),{});
  754. var log = "";
  755. var emptypages = 0;
  756. var firstpage_used = false;
  757. for (var i = 0; i < spages_all.length; i++) {
  758. let spage = spages_all[i];
  759. // if (d_spages[spage] === undefined) {
  760. if (!spages.includes(spage)) {
  761. log += `skip\t${spage}\n`;
  762. continue;
  763. }
  764. let imgData = imgsData[spage];
  765. if (imgData === undefined) {
  766. if (firstpage_used && (download_format === "pdf")) doc.addPage([imgsSize[pages_success[0]][0], imgsSize[pages_success[0]][1]], "p");
  767. if (download_format === "pdf") doc.text(spage, 100, 100);
  768. emptypages += 1;
  769. log += `fail\t${spage}\n`;
  770. txt_download_fails += (spage + "\n");
  771. continue;
  772. }
  773. log += `ok\t${spage}\n`;
  774. // [Javascript - get extension from base64 image - Stack Overflow](https://stackoverflow.com/questions/27886677/javascript-get-extension-from-base64-image)
  775. let imgExt = imgsExt[spage];
  776. txt_download_done += (spage + "\n");
  777. //if (download_format === "zip") zip.file(`${spage}.${imgExt}`, imgData.split(",")[1], {base64: true});
  778. // zip blob is faster than base64
  779. if (download_format === "zip") zip.file(`${spage}.${imgExt}`, imgData, {blob: true});
  780. if (firstpage_used && (download_format === "pdf")) doc.addPage([imgsSize[spage][0], imgsSize[spage][1]], "p");
  781. //doc.addImage(imageData, imgExt, x, y, width, height, alias, compression, rotation);
  782. if (download_format === "pdf") {
  783. doc.addImage(imgData, imgExt, 0, 0, imgsSize[spage][0], imgsSize[spage][1]);
  784. firstpage_used = true;
  785. }
  786. }
  787. if (download_format === "zip") {
  788. console.log("zipping");
  789. zip.file("done.txt", txt_download_done);
  790. zip.file("fails.txt", txt_download_fails);
  791. let progress = 0;
  792. let progress_prev = 0;
  793. zip.generateAsync({type:"blob"}, function updateCallback(metadata) {
  794. progress = Math.round(metadata.percent * 10) / 10;
  795. if (progress !== progress_prev) appendlog(`zip打包进度 ${progress}%'`);
  796. progress_prev = progress;
  797. }).then(function(content) {
  798. saveAs(content, `${bookname}_${ssid}.zip`);
  799. appendlog(`zip文件完成打包,将自动保存到本地`);
  800. releasemem();
  801. }).catch(function(err) {
  802. appendlog(`zip文件打包出错,${err}`);
  803. releasemem();
  804. });
  805. }
  806. if (download_format === "pdf") {
  807. doc.save(`${bookname}_${ssid}.pdf`);
  808. appendlog(`pdf文件保存完毕,${emptypages === 0 ? "无缺页" : "有" + emptypages + "张缺页,已标注"}`);
  809. }
  810. if (download_format !== "zip") releasemem();
  811. saveAs(new Blob([log], {type: "text/plain;charset=utf-8"}), `${bookname}_${ssid}_log.txt`);
  812. document.getElementById("okdownload").innerText = "一键下载";
  813. downloading = false;
  814. };
  815. var getpage = function () {
  816. page += 1;
  817. timeout = getRndInteger(sleep_min, sleep_max);
  818. let spage = spages[page - 1];
  819. console.log(`will download page ${spage}`);
  820. now = new Date().toLocaleString('en-US', {hour12: false}).split(" ")[1];
  821. GM_xmlhttpRequest({
  822. method: "GET",
  823. url: `https://${pageurl.split("/")[2]}${jpgPath}${spage}?zoom=${zoomvalue}`,
  824. headers: {referer: pageurl},
  825. timeout: 5000,
  826. responseType: "blob",
  827. onload: function (res) {
  828. console.log(`${res.status} ${res.statusText}`);
  829. if (res.statusText !== "OK") {
  830. // fail 1
  831. console.log(res.responseText);
  832. failscnt += 1;
  833. show_failtip(failscnt, "statusText_not_OK");
  834. timeout = (failscnt === max_failscnt) ? 0 : gap_fails;
  835. appendlog(`${tipspage(spage)} 状态码错误`);
  836. page -= 1;
  837. if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
  838. return;
  839. }
  840. let blob = res.response;
  841. let oFileReader = new FileReader();
  842. oFileReader.onloadend = function (e) {
  843. let imageData = e.target.result;
  844. console.log(`image loaded, ${imageData.substring(0, 100)}`);
  845. let image = new Image();
  846. image.src = imageData;
  847. image.onload = function() {
  848. console.log(`page ${spage} dimension is w${image.width} x h${image.height}`);
  849. // 检测是否图片:【数据加载失败,请稍后重试!】
  850. console.log(imageData);
  851. if (!imageData.startsWith("data:image") || (image.width === 994 && image.height === 1455 && imageData.startsWith("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+IAAAWvCAIAAACkbtyUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw"))) {
  852. // fail 2
  853. failscnt += 1;
  854. show_failtip(failscnt, "fail_image_shown");
  855. timeout = (failscnt === max_failscnt) ? 0 : gap_fails;
  856. appendlog(`${tipspage(spage)} 数据加载失败`);
  857. page -= 1;
  858. if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
  859. return;
  860. }
  861. // reset counter
  862. failscnt = 0;
  863. pages_success.push(spage);
  864. imgsSize[spage] = [image.width, image.height];
  865. imgsExt[spage] = imageData.split(';')[0].split('/')[1];
  866. if (download_format === "page") {
  867. saveAs(blob, `${spage}.${imgsExt[spage]}`);
  868. } else if (download_format === "pdf") {
  869. imgsData[spage] = imageData;
  870. } else if (download_format === "zip") {
  871. //imgsData[spage] = imageData;
  872. // zip blob is faster than base64
  873. imgsData[spage] = blob;
  874. }
  875. appendlog(`${tipspage(spage)} 已下载`);
  876. console.log(`page ${spage} download ok: success - ${pages_success.length} / tried - ${page} / all - ${pagescnt} / flag - ${downloading}`);
  877. document.querySelector("span#download_status").innerText = `下载进度:${pages_success.length} / ${page} / ${pagescnt}`;
  878. if (!downloading || page === pagescnt) timeout = 0;
  879. if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
  880. };
  881. image.onerror = function() {
  882. // fail 3
  883. failscnt += 1;
  884. show_failtip(failscnt, "image_load_error");
  885. timeout = (failscnt === max_failscnt) ? 0 : gap_fails;
  886. appendlog(`${tipspage(spage)} 未知原因,图片无法加载`);
  887. page -= 1;
  888. if (!downloading) timeout = 0;
  889. if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
  890. };
  891. };
  892. oFileReader.readAsDataURL(blob);
  893. },
  894. onerror, onabort, ontimeout: function (res) {
  895. // fail 4
  896. console.log(`${res.status} ${res.statusText}`);
  897. console.log(res.responseText);
  898. console.warn(`page ${spage} download fail: success - ${pages_success.length} / tried - ${page} / all - ${pagescnt} / flag - ${downloading}`);
  899. document.querySelector("span#download_status").innerText = `下载进度:${pages_success.length} / ${page} / ${pagescnt}`;
  900. timeout = gap_fails;
  901. appendlog(`${tipspage(spage)} 下载失败: ${res.statusText}`);
  902. page -= 1;
  903. if (!downloading) timeout = 0;
  904. if (timeout > 0) {setTimeout(getpage, timeout * 1000);} else savefiles();
  905. }
  906. }); // GM_xmlhttpRequest end
  907. };
  908. getpage();
  909. return false;
  910. }
  911. function getRndInteger(min, max) {
  912. return Math.floor(Math.random() * (max - min + 1) ) + min;
  913. }
  914. function funcinterval(func, interval = 3000) {
  915. func();
  916. setInterval(func, interval);
  917. }
  918. var pageurl = window.location.href;
  919. console.log(pageurl);
  920. var bookid;
  921. var bookname;
  922. var author;
  923. var press;
  924. var ssid;
  925. var dxid;
  926. var img;
  927. var m_isbn;
  928. var isbn;
  929. var m_ssn;
  930. var m_dxid;
  931. var m_iid;
  932. var copys;
  933. var bidtype;
  934. 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"};
  935. 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"};
  936. if (pageurl.includes("://search.douban.com/book/subject_search") || pageurl.includes("://book.douban.com/subject_search")) {
  937. jQuery("div.item-root > div.detail > div.title").each(function (i, el) {
  938. bookname = slim(jQuery(el).text());
  939. jQuery(el).find("a").after(ucdrslink4db(bookname));
  940. });
  941. } else if (pageurl.includes("://book.douban.com/works")) {
  942. // 无分页设计
  943. jQuery("div.bkdesc > a.pl2").each(function (i, el) {
  944. bookname = slim(jQuery(el).text());
  945. jQuery(el).after(ucdrslink4db(bookname));
  946. });
  947. } else if (pageurl.includes("://book.douban.com/producers") || pageurl.includes("://book.douban.com/press")) {
  948. jQuery("div.info > h2 > a").each(function (i, el) {
  949. bookname = slim(jQuery(el).text());
  950. jQuery(el).after(ucdrslink4db(bookname));
  951. });
  952. } else if (pageurl.includes("://book.douban.com/cart")) {
  953. jQuery("td.book_title > a").each(function (i, el) {
  954. bookname = slim(jQuery(el).text());
  955. jQuery(el).after(ucdrslink4db(bookname, {sep: "|", text: "参"}));
  956. });
  957. } else if (pageurl.includes("://www.douban.com/doulist")) {
  958. jQuery("div.title > a").each(function (i, el) {
  959. bookname = slim(jQuery(el).text());
  960. var src = slim(jQuery(el).parent().prev().prev().text());
  961. if (src === "来自:豆瓣读书") {
  962. jQuery(el).after(ucdrslink4db(bookname));
  963. }
  964. });
  965. } else if (pageurl.match("book.douban.com.*/(series|tag|do|wish|collect)")) {
  966. jQuery("div.info > h2 > a").each(function (i, el) {
  967. bookname = slim(jQuery(el).text());
  968. jQuery(el).after(ucdrslink4db(bookname));
  969. });
  970. } else if (pageurl.includes("://book.douban.com/author")) {
  971. jQuery("h6 > a").each(function (i, el) {
  972. bookname = slim(jQuery(el).text());
  973. jQuery(el).after(ucdrslink4db(bookname));
  974. });
  975. } else if (pageurl.includes("://book.douban.com/subject")) {
  976. bookid = pageurl.match(/book.douban.com\/subject\/(\d+)/)[1];
  977. var json = jQuery('script[type="application/ld+json"]').text();
  978. bookname = json.match(/"name" : "(.*?)",/)[1];
  979. m_isbn = json.match(/"isbn" : "(.*?)",/);
  980. isbn = m_isbn ? m_isbn[1] : "";
  981. jQuery("div#mainpic > a.nbg").after("<br>" + ucdrslink(bookname, isbn) + copymeta(bookid));
  982. } else if (pageurl.includes("://book.douban.com/isbn")) {
  983. var error = jQuery("div#exception").text().trim();
  984. if (error === "豆瓣评论暂时没有收录此书,请原谅。" || error === "您提供的ISBN号码不正确,请校正后再试。谢谢。") {
  985. var m_bookname = pageurl.match(/\?bookname=(.+)/);
  986. if (m_bookname) {
  987. bookname = m_bookname[1];
  988. document.location = "https://search.douban.com/book/subject_search?search_text=" + bookname;
  989. }
  990. }
  991. } else if (pageurl.includes(".kongfz.com/")) {
  992. // 孔书网
  993. // 组件或模板
  994. setTimeout(function() {
  995. 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) {
  996. var bnele = {"money": "p.name", "price": "div.book_name", "price_box": "div.text_height > div.book_name"}[jQuery(el).attr("class")];
  997. bookname = shortenbkn(jQuery(el).parent().find(bnele).text());
  998. jQuery(el).append(ucdrslink(bookname, "", {sep: "|", text: "参", cls: "link"}) + dblink(bookname, "", {"text": "豆", cls: "link"}));
  999. });
  1000. jQuery("div.item-info > div.title > a.link").each(function (i, el) {
  1001. bookname = shortenbkn(jQuery(el).text());
  1002. jQuery(el).after(ucdrslink(bookname, "", {sep: "|", cls: "link"}) + dblink(bookname, "", {"cls": "link"}));
  1003. });
  1004. }, 1000);
  1005. // 两个详情页
  1006. if (pageurl.match(/book.kongfz.com\/\d+\/\d+\//)) {
  1007. bookname = shortenbkn(jQuery("h1.title").text());
  1008. m_isbn = html.match(/ISBN:\s*<span>&nbsp;(.*?)<\/span>/);
  1009. if (!m_isbn) m_isbn = html.match(/<span class="keywords-define-txt" itemprop="isbn">\s*(.*?)\s*<\/span>/);
  1010. isbn = m_isbn ? m_isbn[1] : "";
  1011. jQuery("h1.title").after(ucdrslink(bookname, isbn, {sep: "|", cls: "link"}) + dblink(bookname, isbn));
  1012. } else if (pageurl.match(/item.kongfz.com\/book\/\d+\.html/)) {
  1013. bookname = shortenbkn(jQuery("h1.detail-title").text());
  1014. m_isbn = html.match(/var isbn = "(.*?)",/);
  1015. isbn = m_isbn ? m_isbn[1] : "";
  1016. jQuery("h1.detail-title").after(ucdrslink(bookname, isbn, {"style": "color: #365899;"}) + dblink(bookname, isbn, {"style": "color: #365899;"}));
  1017. }
  1018. } else if (pageurl.match(/e.jd.com\/\d+\.html/)) {
  1019. // 京东电子书详情页
  1020. bookname = jQuery("div.itemInfo-wrap > div.sku-name").text().trim();
  1021. m_isbn = html.match(/<div class="dt">I S B N<\/div>\s*<div class="dd">(.*?)<\/div>/);
  1022. isbn = m_isbn ? m_isbn[1] : "";
  1023. jQuery("div.itemInfo-wrap > div.sku-name").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
  1024. } else if (pageurl.match(/item.jd.com\/\d+\.html/) && jQuery("div.crumb > div.first > a").text() === "图书") {
  1025. // 京东纸书详情页
  1026. bookname = jQuery("div.itemInfo-wrap > div.sku-name").text().trim();
  1027. m_isbn = html.match(/ISBN:([\d\-]*)/);
  1028. isbn = m_isbn ? m_isbn[1] : "";
  1029. jQuery("div.itemInfo-wrap > div.sku-name").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
  1030. } else if (pageurl.match(/e.dangdang.com\/products\/\d+\.html/)) {
  1031. // 当当电子书详情页
  1032. setTimeout(function() {
  1033. bookname = shortenbkn(jQuery("h1.bookname_box > span.title_words").text());
  1034. m_isbn = html.match(/ISBN:([\d-]*)/);
  1035. isbn = m_isbn ? m_isbn[1] : "";
  1036. jQuery("h1.bookname_box").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
  1037. }, 2000);
  1038. } else if (pageurl.match(/product.dangdang.com\/\d+\.html/) && jQuery("div#breadcrumb > a.domain:eq(0)").text()=== "图书") {
  1039. // 当当纸书详情页
  1040. bookname = shortenbkn(jQuery("div.name_info > h1").text());
  1041. m_isbn = html.match(/<li>国际标准书号ISBN:(.*?)<\/li>/);
  1042. isbn = m_isbn ? m_isbn[1] : "";
  1043. jQuery("div.name_info > h1").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
  1044. } else if (pageurl.includes("www.bookschina.com")) {
  1045. // 中图网
  1046. // 组件-编辑推荐:有购物车按钮,添加文字链接
  1047. jQuery("div.siteHotPannel > ul > li > h3.bookName").each(function (i, el) {
  1048. bookname = slim(jQuery(el).text());
  1049. bookname = GB2312UTF8.GB2312ToUTF8(bookname);
  1050. jQuery(el).parent().find("div.priceWrap > del.price").after(ucdrslink(bookname, "", {text: "参", sep: "&nbsp;| "}) + dblink(bookname, "", {"text": "豆"}));
  1051. });
  1052. // 页面-特惠/9块9:全页ajax
  1053. if (pageurl.includes("www.bookschina.com/tejia/NewTeHui.aspx")) {
  1054. funcinterval(function() {
  1055. jQuery("div.bookLIst > ul > li > div.text > div.priceWrap > span.dPrcie").each(function (i, el) {
  1056. if (jQuery(el).text().match(/:\d+(\.\d+)?元$/)) {
  1057. bookname = slim(jQuery(el).parent().parent().find("div.bookName").text());
  1058. bookname = GB2312UTF8.GB2312ToUTF8(bookname);
  1059. jQuery(el).append(ucdrslink(bookname, "", {text: "参", sep: "&nbsp;| "}) + dblink(bookname, "", {"text": "豆"}));
  1060. }
  1061. });
  1062. });
  1063. } else if (pageurl.includes("www.bookschina.com/books/9kuai9/")) {
  1064. funcinterval(function() {
  1065. jQuery("div.freeShipFloor > ul#ulList > li.default > div.bookInfor > div.authorPublisher > b.author").each(function (i, el) {
  1066. var p = jQuery(el).parent().parent().find("div.priceWrap > div.sellPrice");
  1067. if (jQuery(el).text() !== "暂无" && !p.text().match(/参 \| 豆$/)) {
  1068. bookname = slim(jQuery(el).parent().parent().find("h3.bookName").text());
  1069. bookname = GB2312UTF8.GB2312ToUTF8(bookname);
  1070. p.append(ucdrslink(bookname, "", {text: "参", sep: "&nbsp;| "}) + dblink(bookname, "", {"text": "豆"}));
  1071. }
  1072. });
  1073. });
  1074. }
  1075. // 模板-详情页和各类列表页
  1076. if (pageurl.match(/www.bookschina.com\/\d+\.htm/)) {
  1077. // 详情页
  1078. bookname = shortenbkn(jQuery("h1").text());
  1079. m_isbn = html.match(/<li>ISBN:(.*?)<\/li>/);
  1080. isbn = m_isbn ? m_isbn[1] : "";
  1081. jQuery("h1").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
  1082. } else {
  1083. // 各种有购物车和收藏按钮的列表页、大图页
  1084. jQuery("a.collectBtn").each(function (i, el) {
  1085. jQuery(el).css("margin-right", "3px");
  1086. bookname = slim(jQuery(el).parent().parent().find("h2.name").text());
  1087. bookname = GB2312UTF8.GB2312ToUTF8(bookname);
  1088. 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;"}));
  1089. });
  1090. }
  1091. return;
  1092. } else if (pageurl.includes("citic.cmread.com")) {
  1093. // 咪咕云书店
  1094. setTimeout(function() {
  1095. bookname = jQuery("div.book-name").text().trim();
  1096. 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;"}));
  1097. }, 1000);
  1098. } else if (pageurl.match(/www.dedao.cn\/ebook\/detail\?/)) {
  1099. // 得到电子书
  1100. setTimeout(dedao, 1000);
  1101. // [There is no JavaScript event for a URL change | Today I Learned](https://todayilearned.net/2021/03/no-javascript-event-url-change)
  1102. let currentUrl = location.href;
  1103. setInterval(() => {
  1104. if (location.href !== currentUrl) {
  1105. currentUrl = location.href;
  1106. setTimeout(dedao, 1000);
  1107. }
  1108. }, 3000);
  1109. return;
  1110. } else if (pageurl.match(/read.douban.com\/ebook\/\d+\//)) {
  1111. // 豆瓣阅读详情页
  1112. setTimeout(function(){
  1113. bookname = jQuery("h1.article-title").text().trim();
  1114. m_isbn = html.match(/itemprop="isbn">(.*?)<\/a>/);
  1115. isbn = m_isbn ? m_isbn[1] : "";
  1116. jQuery("h1.article-title").after(ucdrslink(bookname, isbn) + dblink(bookname, isbn));
  1117. }, 1000);
  1118. } else if (pageurl.includes("superlib.net/search")) {
  1119. // ucdrs搜索页-支持自动翻页
  1120. // 脚本域名匹配只匹配到yyy.xxx,不理会zzz.yyy.xxx,因此此规则可使用superlib.net下的各种镜像站,只要没有页面UI与主站显著差异的镜像站,就无需修改
  1121. funcinterval(function() {
  1122. jQuery('td[id="b_img"]').each(function (i, el) {
  1123. if (jQuery(el).parent("tr").find("p > a > span.bid").length === 1 || jQuery(el).parent("tr").find("p > span.bid").length === 1) return;
  1124. bookid = jQuery(el).parent("tr").find('input[name*="ssid"]').val();
  1125. if (bookid) {
  1126. jQuery(el).after(showbid(bookid, "SS号").replace("</p>", copybid(bookid, "SS号")));
  1127. } else {
  1128. bookid = jQuery(el).find("a[href]").attr("href").match(/dxNumber=(\d+)/);
  1129. if (bookid) {
  1130. bookid = bookid[1];
  1131. jQuery(el).after(showbid(bookid, "DX号").replace("</p>", copybid(bookid, "DX号")));
  1132. }
  1133. }
  1134. bookname = jQuery(el).parent("tr").find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
  1135. let meta = jQuery(el).parent("tr").find('span.fc-green').text();
  1136. author = meta.match(/作者:\s*(.*?) /);
  1137. author = author ? author[1].replace(/[\(\[(【].*?[\)\])】]/g, "").trim().replace(/[ \/;;,,::].*/g, "").replace(/等?(主?编|编?著)?$/, "") : "";
  1138. press = meta.match(/出版社:\s*(.*?) /);
  1139. press = press ? press[1].replace(/.*:/, "") : "";
  1140. if (bookname) jQuery(el).parent().children().last().find("a").after(dzylink(bookname + " " + author + " " + press) + dblink(bookname) + copymeta(bookid));
  1141. });
  1142. jQuery(".copybid").unbind("click").bind("click", copybid_clicked);
  1143. jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked);
  1144. jQuery(".copymeta").unbind("click").bind("click", copymeta_clicked);
  1145. }, 5000);
  1146. } else if (pageurl.includes("://www.digital.archives.go.jp")) {
  1147. // 内阁文库-暂无自动翻页
  1148. jQuery("div.list_ti_box > h4.list_ti > a.list_ti_txt").each(function (i, el) {
  1149. bookid = jQuery(el).attr("onclick").match(/(submitHierarchy|submitDetail)\('(\w+)'/)[2];
  1150. bookname = jQuery(el).text();
  1151. jQuery(el).after(dblink(bookname));
  1152. jQuery(el).after(" | " + showbid(bookid, "DAID", 0));
  1153. });
  1154. var bknameele;
  1155. if (pageurl.includes("/listPhoto")) {
  1156. var m_bookid = pageurl.match(/\bID=(\w+)/);
  1157. if (m_bookid === null) {
  1158. m_bookid = pageurl.match(/\bBID=(\w+)/);
  1159. }
  1160. bookid = m_bookid[1];
  1161. bknameele = jQuery(jQuery("div.view_ti > h1 > a")[0]);
  1162. bookname = bknameele.text();
  1163. } else {
  1164. bknameele = jQuery(jQuery("dl.detail_tb > dd")[0]);
  1165. bookname = bknameele.text();
  1166. var ptitle;
  1167. ptitle = jQuery(jQuery("div.page_ti > h2")[0]).text().trim();
  1168. if (ptitle.indexOf("情報") > 0) {
  1169. // ptitle === "簿冊情報" || ptitle === "資料群情報"
  1170. bookid = pageurl.match(/IS_KEY_S51=(\w+)/)[1];
  1171. } else if (ptitle.indexOf("詳細") > 0) {
  1172. if (pageurl.includes("/file/")) {
  1173. // https://www.digital.archives.go.jp/file/1069939.html
  1174. bookid = html.match(/var mid = '(\w+)';/)[1];
  1175. } else {
  1176. // ptitle === "資料群詳細" || ptitle === "簿冊詳細" || ptitle === "件名・細目詳細"
  1177. bookid = pageurl.match(/IS_KEY_S16=(\w+)/)[1];
  1178. }
  1179. }
  1180. }
  1181. bknameele.after(dblink(bookname));
  1182. bknameele.after(showbid(bookid, "DAID", 0));
  1183. } else if (pageurl.includes("://www.ncpssd.org/Literature/ancientbooklist.aspx")) {
  1184. // ncpssd的列表页-暂无自动翻页
  1185. jQuery("div.jour-pic > ul.clr > li > a").each(function (i, el) {
  1186. bookid = atob(jQuery(el).attr("href").match(/barcodenum=(.*)/)[1]);
  1187. bookname = jQuery(el).next().attr("title").replace(/(第?[一二三四五六七八九十百千]+|不分)卷.*/, "");
  1188. jQuery(el).next().after(dblink(bookname));
  1189. jQuery(el).next().after(showbid("BC" + bookid, "BCID", 0));
  1190. });
  1191. } else if (pageurl.includes("://www.ncpssd.org/Literature/articleinfo.aspx")) {
  1192. // ncpssd的详情页
  1193. bookid = jQuery("p#p_institutions").text().replace("条码号:", "");
  1194. bookname = jQuery("h2#h2_title_c").text().replace(/(第?[一二三四五六七八九十百千]+|不分)卷.*/, "");
  1195. jQuery("img#img").after(dblink(bookname) + copybid("BC" + bookid, "BCID").replace("</p>", ""));
  1196. jQuery("img#img").after(showbid("BC" + bookid, "BCID", 0));
  1197. jQuery("h2#h2_title_c > i").after(copymeta("BC" + bookid));
  1198. } else if (pageurl.includes("://cadal.edu.cn/cadalinfo/search")) {
  1199. // cadal的搜索页-暂无自动翻页
  1200. funcinterval(function() {
  1201. jQuery("a.title").each(function (i, el) {
  1202. if (jQuery(el).parent().find("span.bid").length === 1) return;
  1203. bookid = jQuery(el).attr("onclick").match(/'\w+'/)[0].replace(/'/g, "").replace("hj", "");
  1204. jQuery(el).parent().parent().prev().find("a").after(showbid("CD" + bookid, "SSNO<br>").replace("</p>", copybid("CD" + bookid, "SSNO").replace("</a>", "</a><br>")));
  1205. bookname = jQuery(el).text().trim();
  1206. jQuery(el).after(dblink(bookname) + copymeta("CD" + bookid));
  1207. });
  1208. });
  1209. } else if (pageurl.includes("/search?") && (typeof jQuery !== "undefined") && jQuery("#dxid0").val()) {
  1210. // duxiu搜索页-暂无自动翻页
  1211. funcinterval(function() {
  1212. jQuery('div[class="divImg"]').each(function (i, el) {
  1213. if (jQuery(el).find("span.bid").length === 1) return;
  1214. ssid = jQuery(el).prev().val();
  1215. dxid = jQuery(el).prev().prev().val();
  1216. bookid = ssid ? ssid : dxid;
  1217. bidtype = bookid.length === 8 ? "SSID" : "DXID";
  1218. bookname = jQuery(el).parent().find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
  1219. m_isbn = jQuery(el).next().text().match(/ISBN : ([\d-]+)\n/);
  1220. isbn = m_isbn ? m_isbn[1] : "";
  1221. var ele_title = jQuery(el).next().find("dt").find("a");
  1222. ele_title.after(dxtoc(ele_title.attr("href")) + dblink(bookname, isbn) + copymeta(bookid));
  1223. jQuery(el).children().first().after(showbid(bookid, bidtype.replace("ID", "号")).replace("</p>", copybid(bookid, bidtype)));
  1224. });
  1225. });
  1226. } else if (pageurl.includes("://fx.ccelib.com/s?")) {
  1227. // duxiu的ccelib镜像站搜索页-暂无自动翻页
  1228. funcinterval(function() {
  1229. jQuery('div[class="savelist clearfix"]').each(function (i, el) {
  1230. if (jQuery(el).find("span.bid").length === 1) return;
  1231. var ele_ul = jQuery(el).find("div.savelist_con > div.savelist_box > ul");
  1232. if (ele_ul.find("li.biaoti > a:first").text() === "[图书]") {
  1233. bookname = ele_ul.find("li.biaoti > a:eq(1)").text().trim();
  1234. var ele_input = jQuery(el).find("div.save_img > input");
  1235. bookid = iid2bookid(ele_input.attr("img").match(/iid=(\w+)/)[1]);
  1236. if (bookid === "00000000") bookid = ele_ul.prev().find("div.favorite > span").attr("dxid");
  1237. bidtype = bookid.length == 8 ? "SS号": "DX号";
  1238. jQuery(el).find("div.save_img > a").after(showbid(bookid, bidtype).replace("</p>", copybid(bookid, bidtype)));
  1239. var m_isbn = ele_ul.text().match(/ISBN:([\d-]+)\n/);
  1240. isbn = m_isbn ? m_isbn[1] : "";
  1241. ele_ul.find("li.biaoti > a:last").after(dblink(bookname, isbn, {"sep": "", "style": "float: none;"}) + copymeta(bookid).replace(';" title', '; float: none;" title'));
  1242. }
  1243. });
  1244. });
  1245. } else if (pageurl.includes("/views/specific/")) {
  1246. // ucdrs详情页
  1247. m_ssn = jQuery("script:contains(send_requestajax)").text().match(/ssn=(\d{3,})/);
  1248. m_dxid = pageurl.match(/dxNumber=(\d+)/);
  1249. bookid = m_ssn ? m_ssn[1] : m_dxid[1];
  1250. bidtype = bookid.length === 8 ? "SSID" : "DXID";
  1251. img = jQuery("div.tubookimg>img");
  1252. img.after(showbid(bookid, bidtype).replace("</p>", copybid(bookid, bidtype)));
  1253. bookname = jQuery("div.tutilte").text();
  1254. m_isbn = jQuery("div.tubox").find("dl").text().match(/【ISBN号】(.*?)\n/);
  1255. isbn = m_isbn ? m_isbn[1] : "";
  1256. img.after(`<p style="text-align: center">${dblink(bookname, isbn, {"sep": ""}) + copymeta(bookid)}</p>`);
  1257. jQuery("body").children().last().append('<script type="text/javascript">function hasLogin(url){window.open(url);return;}</script>');
  1258. } else if (pageurl.includes("bookDetail.jsp?") && (typeof jQuery !== "undefined") && jQuery("input#dxid").val()) {
  1259. // duxiu详情页
  1260. m_iid = jQuery("div#bookphoto").html().match(/CoverNew.dll\?iid=(\w{40,56}\b)/);
  1261. m_ssn = jQuery("script:contains(send_requestlib)").text().match(/ssn=(\d{3,})/);
  1262. m_dxid = pageurl.match(/dxNumber=(\d+)/);
  1263. bookid = m_iid ? iid2bookid(m_iid[1]) : (m_ssn? m_ssn[1] : m_dxid[1]);
  1264. bidtype = bookid.length == 8 ? "SS号": "DX号";
  1265. img = jQuery("#grade1").prev();
  1266. img.after(showbid(bookid, bidtype).replace("</p>", copybid(bookid, bidtype)));
  1267. bookname = jQuery("input#dxid").prev().text();
  1268. m_isbn = jQuery("div.card_text").find("dl").text().match(/ISBN号 :(.*?)\n/);
  1269. isbn = m_isbn ? m_isbn[1] : "";
  1270. img.after(`<p style="text-align: center">${dxtoc(pageurl)} | ${dblink(bookname, isbn, {"sep": ""})}${copymeta(bookid)}</p>`);
  1271. } else if (pageurl.includes("://cadal.edu.cn/cardpage/bookCardPage?")) {
  1272. // cadal详情页
  1273. bookid = pageurl.match(/ssno=(\w+)/)[1];
  1274. jQuery("div.title_img").each(function (i, el) {
  1275. bookname = jQuery("span.title").text().trim();
  1276. m_isbn = jQuery(el).next().text().match(/ISBN:(.*?)\n/);
  1277. isbn = m_isbn ? m_isbn[1] : "";
  1278. jQuery("span.title").after(dblink(bookname, isbn) + copymeta("CD" + bookid));
  1279. jQuery(el).find("a").after(showbid("CD" + bookid, "SSNO<br>").replace("</p>", copybid("CD" + bookid, "SSNO").replace("</a>", "</a><br>")));
  1280. });
  1281. jQuery("#menu_area").show();
  1282. } else if (pageurl.includes("://fx.ccelib.com/detail_")) {
  1283. // duxiu的ccelib镜像详情页
  1284. jQuery('div[class="savelist clearfix"]').each(function (i, el) {
  1285. img = jQuery(el).find("div.save_img > img:first");
  1286. if (img.next().text() === "【图书】") {
  1287. bookname = jQuery("h4.falv_tit").text().trim();
  1288. var ele_ul = jQuery(el).find("div.savelist_con > ul.infolist");
  1289. var ele_headline = ele_ul.find("li.biaoti").children().last();
  1290. bookid = iid2bookid(img.attr("src").match(/iid=(\w+)/)[1]);
  1291. if (bookid === "00000000") bookid = jQuery("div.sharediv > div.bdsharebuttonbox").attr("data-tag").replace("share_", "");
  1292. bidtype = bookid.length == 8 ? "SS号": "DX号";
  1293. img.after(showbid(bookid, bidtype).replace("-20px", "0px").replace("</p>", copybid(bookid, bidtype)));
  1294. m_isbn = ele_ul.text().match(/【ISBN】([\d-]+)\n/);
  1295. isbn = m_isbn ? m_isbn[1] : "";
  1296. ele_headline.after(dblink(bookname, isbn, {"sep": "", "style": "float: none;"}) + copymeta(bookid));
  1297. }
  1298. });
  1299. } else if (pageurl.includes("chapter.jsp?") && pageurl.includes("dxNumber=")) {
  1300. // duxiu目录页
  1301. jQuery("#also").after('<p style="color: orange; font-size: 120%;">以下目录非完整版,由于读秀限制,仅展示匹配了 <a href="https://gf.qytechs.cn/zh-CN/scripts/435569/" target="_blank">文献互助小帮手</a> 脚本内置关键词的条目。</p>');
  1302. } else if (pageurl.includes("/n/slib/book/slib/") || pageurl.includes("/n/jpgfs/book/base/")) {
  1303. var downloading = false;
  1304. let tip_fomrat = "设定下载格式:PDF方便,失败页会留空,适合成功率高、不易触发验证码的场景;ZIP包生成速度可能较慢,配置低的电脑慎用;分页下载节省内存,但频繁下载可能干扰你使用浏览器,下载完成后请手动将全部图片收集到一个文件夹,否则多个下载任务的文件会因自动命名难以辨别";
  1305. let tip_zoom = "设定zoom值:值越大越清晰,文件体积也越大;本页面阅读器zoom值为0,若清晰度可用,无需调整";
  1306. var pages = JSON.parse(html.match(/var pages = (\[.*?\]);/)[1]);
  1307. 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>`;
  1308. 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>`;
  1309. // wait until jQuery loaded
  1310. setTimeout(function() {
  1311. if (pageurl.includes("/n/slib/book/slib/")) {
  1312. // 全文阅读url:https://img.sslibrary.com/n/slib/book/slib/\d+/*
  1313. jQuery("div.ToolsBar > ul").css({"width": "96%"});
  1314. jQuery("div.ToolsBar > ul > li.ssbook").css({"width": "160px"});
  1315. jQuery("div.ToolsBar").children().last().after(`<a href="#" id="gettoc" class="dtool">获取目录</a>` + toolbar);
  1316. } else {
  1317. // 部分试读url:https://img.duxiu.com/n/jpgfs/book/base/\d+/*
  1318. jQuery("div#t_content").css({"margin-left": "150px", "width": "100%"});
  1319. jQuery("div#tc_right").after(`<div style="float: left; height: 23px; margin-top: 2px;">${toolbar}</div>`);
  1320. }
  1321. jQuery("div#reader").after(logarea);
  1322. jQuery("select#pagejump > option").each(function(i, el){
  1323. if (jQuery(this).val() != 5) jQuery(this).text(jQuery(this).text().replace("页", pages[jQuery(this).val()][1] + "页"));
  1324. });
  1325. jQuery("#downloadlist").unbind("click").bind("click", download_spages_list);
  1326. jQuery("#okdownload").unbind("click").bind("click", okdownload);
  1327. jQuery("#gettoc").unbind("click").bind("click", gettoc);
  1328. }, 1000);
  1329. }
  1330. 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}');
  1331. if (typeof jQuery === "undefined" || jQuery === null) return;
  1332. jQuery(".copybid").unbind("click").bind("click", copybid_clicked);
  1333. jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked);
  1334. jQuery(".copymeta").unbind("click").bind("click", copymeta_clicked);
  1335. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址