🏠 Home 

Greasy Fork is available in English.

文#互助小帮手:①读秀PDF一键下载 ②图书馆联盟、读秀、超星、中美百万显示SSID等索书号 ③各文#站、图书电商站与豆瓣的互访链接 ④一键复制元数据

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


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