// ==UserScript== // @name 文献互助小帮手:①读秀PDF一键下载 ②图书馆联盟、读秀、超星、中美百万显示SSID等索书号 ③各文献站、图书电商站与豆瓣的互访链接 ④一键复制元数据 // @name:zh-CN 文献互助小帮手:①读秀PDF一键下载 ②图书馆联盟、读秀、超星、中美百万显示SSID等索书号 ③各文献站、图书电商站与豆瓣的互访链接 ④一键复制元数据 // @name:zh-TW 文獻互助小幫手:①讀秀PDF一鍵下載 ②圖書館聯盟、讀秀、超星、中美百萬顯示SSID等索書號 ③各文獻站、圖書電商站與豆瓣的互訪鏈接 ④一鍵複製元數據 // @name:en Literature mutual helper // @name:ja 文献相互支援 // @namespace ucdrs.superlib.net // @version 1.10.5 // @update-note 新增:书签链接和一键复制书签。复制的书签附带页码,可供PdgCntEditor使用,链接添加在SSID、DXID、复制的元数据三处,书签数据由yysk.org提供,见 // @update-note 新增:没有SSID时,通过yysk.org提供的接口,尝试查询SSID,见 // @update-note 修复:改善脚本管理器兼容性支持,见,删除DXID上误添加的到百度网盘存储路径的链接,DXID上opacity为NaN的问题 // @update-note 移除:移除SSID上到百度网盘存储路径的链接,以及相应的配置菜单 // @update-note 优化:有SSID时同时显示SSID和DXID,否则只显示DXID,优化一些说明性文字 // @update-note 优化:对自动翻页的支持方式由setinterval改为mutationObserver,降低页面资源损耗 // @update-note 修复:右键点击小图标无反应的问题 // @author Theron // @icon data:image/png;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAACMuAAAjLgAAAAAAAAAAAAD///////////39///6+v//+/v///39//////////////7+///+/v///////////////////v7///////////////////z8///+/v////////7+////////4uL//0pJ//+wsP///////+np//9wb///vr7///////////////////////9ycf//Jyf//3h4//+np///4uL//+7u//9FRf//Cgn//+7u//+5uf//BQT//wAA//+jo/////////v7////////s7P//xoa//8XF///ISD//w4N//8tLP//f3///yoq//9YWP////////////8zMv//W1v////////7+////Pz///////89PP//hYT////////T0///Bgb//46O//+1tf//Bgb//+jo////////XFz//0tK////////+/v///z8////////ODf//4KB////////7u7//xUU///Pz////v7//w0M//+srP///////2Rk//9CQf////////z8///8/P///////0hI//8MC///NjX//yoq//8BAP//ysr///////8xMf//d3f///////9ubv//OTj////////8/P///Pz///////8+Pf//YWD//9nZ//+4t///Dg3//8fH////////VlX//1JS////////eHj//zEw/////////f3///z8////////Ojn//4SD////////7u7//xQT///Gxv///////29v//88O////////4GA//8qKf////////39///8/P///////0VF//8jIv//Y2L//1JR//8FBP//ysn///////+Fhf//Ly7///////+Skf//Jib////////+/v///Pz///////9CQv//PDv//5KS//95ef//Dw7//7Gx//9HRv//IyP//xEQ//9xcf//Ozr//yQk//////////////z8////////PDz//4aG////////7u7//xsa//+5uf//jY3//zw7//8NDP//ZWX//1VU//9vb////f3////////8/P///////0JC//85OP//j4///3h3//8HBv//x8f///////+NjP//Hx///////////////////////////////f3///////+Ghv//TEz//1NS//9TUv//VFP//9XV////////gYH//wAA///o6P////////v7///////////////////////////////////////////////////9/f///////7u7//+Ojv//6+v////////+/v////////////////////////39///7+///+/v///v7///7+////v7/////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== // @match *://book.ucdrs.superlib.net/views/specific/* // @match *://book.ucdrs.superlib.net/search* // @match *://book.dglib.superlib.net/views/specific/* // @match *://book.dglib.superlib.net/search* // @match *://book.zslib.com.cn/views/specific/* // @match *://book.zslib.com.cn/search* // @match *://search.douban.com/book/subject_search* // @match *://book.douban.com/isbn/* // @match *://book.douban.com/subject_search* // @match *://book.douban.com/tag/* // @match *://book.douban.com/subject/* // @match *://book.douban.com/series/* // @match *://book.douban.com/works/* // @match *://book.douban.com/producers/* // @match *://book.douban.com/press/* // @match *://book.douban.com/author/*/books* // @match *://book.douban.com/people/*/wish* // @match *://book.douban.com/people/*/do* // @match *://book.douban.com/people/*/collect* // @match *://www.douban.com/doulist/* // @match *://book.douban.com/cart* // @match *://cadal.edu.cn/cadalinfo/search* // @match *://cadal.edu.cn/cardpage/bookCardPage?*ssno=* // @match *://fx.ccelib.com/detail_* // @match *://fx.ccelib.com/s?* // @match *://www.ncpssd.org/Literature/ancientbooklist.aspx* // @match *://www.ncpssd.org/Literature/articleinfo.aspx* // @match *://www.digital.archives.go.jp/DAS/meta/* // @match *://www.digital.archives.go.jp/file/*.html // @match *://e.jd.com/*.html* // @match *://item.jd.com/*.html* // @match *://e.dangdang.com/products/*.html* // @match *://product.dangdang.com/*.html* // @match *://read.douban.com/ebook/*/* // @match *://www.dedao.cn/ebook/detail?* // @match *://www.bookschina.com/* // @match *://citic.cmread.com/zxHtml/html/paperBookDetailShare.html?* // @match *://www.kongfz.com/publisher/*/* // @match *://www.kongfz.com/writer/*/* // @match *://shop.kongfz.com/* // @match *://book.kongfz.com/*/*/* // @match *://book.kongfz.com/C*/* // @match *://item.kongfz.com/* // @match *://search.kongfz.com/product_result/?* // @match *://search.kongfz.com/item_result/?* // @match */n/slib/book/slib/* // @match */n/jpgfs/book/base/* // @require https://greasyfork.org/scripts/450973-gb2312utf8/code/GB2312UTF8.js?version=1091107 // @require https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/jszip/3.9.1/jszip.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js // @include */search?* // @include *bookDetail.jsp?* // @include *chapter.jsp?* // @include *book.do?* // @exclude *://*.google./* // @exclude *://*.bing./* // @description ①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。 // @description:zh-CN ①读秀试读或者包库全文、汇雅电子书的一键下载 ② 在图书馆参考咨询联盟(ucdrs)或读秀(duxiu)以及他们镜像站上显示文献的ssid或dxid,用于图书文献互助、群组找书等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;显示社科文献中心、日本内阁文库等文献站点的索书号。 ③ 提供各文献站点、图书电商和豆瓣图书的互访链接。 ④ 一键复制各文献站点的索书号、图书元数据。 To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,但不提供售卖,下载请自行找百度网盘群组;显示dxid或其它索书号、双向链接、一键复制等为平底锅没有的新加功能。 // @description:zh-tw ①讀秀試讀或者包庫全文、匯雅電子書的一鍵下載 ② 在圖書館參考諮詢聯盟(ucdrs)或讀秀(duxiu)以及他們鏡像站上顯示文獻的ssid或dxid,用於圖書文獻互助、羣組找書等場景;顯示大學數字圖書館國際合作計劃(cadal)的書號-ssno,用於查詢下載中美百萬書冊;顯示社科文獻中心、日本內閣文庫等文獻站點的索書號。 ③ 提供各文獻站點、圖書電商和豆瓣圖書的互訪鏈接。 ④ 一鍵複製各文獻站點的索書號、圖書元數據。 To搜索[紅太狼的平底鍋]的朋友:提供紅太狼的平底鍋的部分功能,如顯示ssid,但不提供售賣,下載請自行找百度網盤羣組;顯示dxid或其它索書號、雙向鏈接、一鍵複製等爲平底鍋沒有的新加功能。 // @description:en ①Show ssid/dxid from Library Reference Alliance (ucdrs) or Duxiu (duxiu) ②Show ssno from CADAL ③Provide links from ucdrs, duxiu, cadal to Douban Books // @description:ja ①LibraryReference Alliance(ucdrs)またはDuxiu(duxiu)からssid / dxidを取得②ZhongmeiMillion(cadal)からssnoを取得③ucdrs、duxiu、cadalからDoubanBooksへのリンクを提供 // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @grant GM_addStyle // @license Copyright Theron // @downloadURL https://update.greasyfork.icu/scripts/435569/%E6%96%87%E7%8C%AE%E4%BA%92%E5%8A%A9%E5%B0%8F%E5%B8%AE%E6%89%8B%EF%BC%9A%E2%91%A0%E8%AF%BB%E7%A7%80PDF%E4%B8%80%E9%94%AE%E4%B8%8B%E8%BD%BD%20%E2%91%A1%E5%9B%BE%E4%B9%A6%E9%A6%86%E8%81%94%E7%9B%9F%E3%80%81%E8%AF%BB%E7%A7%80%E3%80%81%E8%B6%85%E6%98%9F%E3%80%81%E4%B8%AD%E7%BE%8E%E7%99%BE%E4%B8%87%E6%98%BE%E7%A4%BASSID%E7%AD%89%E7%B4%A2%E4%B9%A6%E5%8F%B7%20%E2%91%A2%E5%90%84%E6%96%87%E7%8C%AE%E7%AB%99%E3%80%81%E5%9B%BE%E4%B9%A6%E7%94%B5%E5%95%86%E7%AB%99%E4%B8%8E%E8%B1%86%E7%93%A3%E7%9A%84%E4%BA%92%E8%AE%BF%E9%93%BE%E6%8E%A5%20%E2%91%A3%E4%B8%80%E9%94%AE%E5%A4%8D%E5%88%B6%E5%85%83%E6%95%B0%E6%8D%AE.user.js // @updateURL https://update.greasyfork.icu/scripts/435569/%E6%96%87%E7%8C%AE%E4%BA%92%E5%8A%A9%E5%B0%8F%E5%B8%AE%E6%89%8B%EF%BC%9A%E2%91%A0%E8%AF%BB%E7%A7%80PDF%E4%B8%80%E9%94%AE%E4%B8%8B%E8%BD%BD%20%E2%91%A1%E5%9B%BE%E4%B9%A6%E9%A6%86%E8%81%94%E7%9B%9F%E3%80%81%E8%AF%BB%E7%A7%80%E3%80%81%E8%B6%85%E6%98%9F%E3%80%81%E4%B8%AD%E7%BE%8E%E7%99%BE%E4%B8%87%E6%98%BE%E7%A4%BASSID%E7%AD%89%E7%B4%A2%E4%B9%A6%E5%8F%B7%20%E2%91%A2%E5%90%84%E6%96%87%E7%8C%AE%E7%AB%99%E3%80%81%E5%9B%BE%E4%B9%A6%E7%94%B5%E5%95%86%E7%AB%99%E4%B8%8E%E8%B1%86%E7%93%A3%E7%9A%84%E4%BA%92%E8%AE%BF%E9%93%BE%E6%8E%A5%20%E2%91%A3%E4%B8%80%E9%94%AE%E5%A4%8D%E5%88%B6%E5%85%83%E6%95%B0%E6%8D%AE.meta.js // ==/UserScript== /* jslint esversion: 6 */ /*globals jQuery, GB2312UTF8, JSZip, saveAs */ function bookid2link(bookid) { var lib; if (bookid.match(/^\d{8}$/)) { bookid = bookid.slice(0, 7); lib = "duxiu"; } else if (bookid.match(/^CD\d{8}$/i)) { bookid = bookid.slice(2, 9); lib = "cadal"; } else if (bookid.match(/^BC\d{8}$/i)) { bookid = bookid.slice(2, 9); lib = "ncpssd"; } else if (bookid.match(/^[MF]\d{19}$/i)) { bookid = bookid.slice(15, 20); lib = "najda"; } return "https://pan.baidu.com/disk/home?from=newversion&stayAtHome=true&_at_=" + Date.now() + "#/all?vmode=list&path=%2Fyysk.org%2F" + lib + "%2F" + bookid.split("").join("%2F"); } function showLink() { showlink = GM_getValue("showlink", "n"); GM_setValue("showlink", showlink === "n" ? "y" : "n"); showlink = GM_getValue("showlink", "n"); GM_unregisterMenuCommand(menuid_showlink); menuid_showlink = GM_registerMenuCommand(showlink === "n" ? "改为显示链接" : "改为隐藏链接", showLink, "l"); alert(showlink === "y" ? "将显示图书ID到百度网盘存储路径的链接,刷新页面生效" : "不再显示图书ID到百度网盘存储路径的链接,刷新页面生效"); } var showlink = GM_getValue("showlink", "n"); var menuid_showlink = GM_registerMenuCommand(showlink === "n" ? "改为显示链接" : "改为隐藏链接", showLink, "l"); function ss2rc() { enablerc = GM_getValue("enablerc", "n"); GM_setValue("enablerc", enablerc === "n" ? "y" : "n"); enablerc = GM_getValue("enablerc", "n"); GM_unregisterMenuCommand(menuid_enablerc); menuid_enablerc = GM_registerMenuCommand(enablerc === "n" ? "芝麻开门" : "芝麻关门", ss2rc, "z"); alert(enablerc === "y" ? "查询ssid获取图书秒传码的功能已启用,请低调使用。使用方法:右键点击ssid右侧的📋。" : "已停用查询ssid获取图书秒传码的功能"); } var enablerc = GM_getValue("enablerc", "n"); var menuid_enablerc = GM_registerMenuCommand(enablerc === "n" ? "芝麻开门" : "芝麻关门", ss2rc, "z"); var html = document.documentElement.innerHTML; var observerOptions = { childList: true, attributes: false, subtree: false }; // 允许连续失败的最大次数 const max_failscnt = 5; // 页面下载失败,下次尝试前等待的秒数 const gap_fails = 30; // 页面下载间隔随机秒数的上限、下限 const sleep_max = 8; const sleep_min = 3; const fmblimits = 999; (function () { 'use strict'; function ogetk(object, key, default_value) { var result = object[key]; return (typeof result !== "undefined") ? result : default_value; } function slim(s) { return s.replaceAll(/ +/g, "").trim(); } function showbid(bookid, idtype, p=1) { var title = ""; var rate = ""; var prefix = ""; if (idtype == "SSID") { prefix = bookid.slice(0, 4); rate = ogetk(rate_ssid, prefix, "-"); title = rate === "-" ? "库存无此书-灰色" : prefix + "号段库存率为" + rate + "%"; } else if (idtype == "DXID") { title = "如有SSID请优先使用SSID,DXID查询库存资源命中率较低"; rate = "-"; } else if (idtype == "SSNO
") { prefix = bookid.replace(/CD/, "").slice(0, 4); rate = ogetk(rate_ssno, prefix, "-"); title = rate === "-" ? "库存无此书-灰色" : prefix + "号段库存率为" + rate + "%"; } var title_type = {"SSID": "SSID / SuperStar ID", "DXID": "DXID / DuXiu ID", "SSNO
": "CADAL用于编目的SSNO", "BCID": "社科院文献中心编目的barcodenum", "DAID": "日本国立公文书馆内阁文库文献编号,有F和M开头两类,分别为辑合/单本的ID"}[idtype]; var color = rate === "-" ? "grey" : "blue"; var opacity = rate === "-" ? 1 : (parseFloat(rate) / 100 + 0.2); var bookid_snippet = `${idtype.replace("ID", "")}${bookid}`; if (showlink === "y" && bookid.length === 8) { var link = bookid2link(bookid); bookid_snippet = `${bookid_snippet}`; } if (p !== 1) { return bookid_snippet; } return `

${bookid_snippet}

`; } function sepit(s, sep) { if (sep === "|") { s = " | " + s; } else if (sep === "br") { s = s + "
"; } else if (sep === "p") { s = `

${s}

`; } else if (sep) { s = sep + s; } return s; } function shortenbkn(s) { s = s.trim().replace(/(.)[\[【\((].*/, "$1"); while (s.includes(" ") && s.replace(/[A-z0-9]{2}/g, "的").length > 20) { s = s.replace(/ [^ ]*$/, ""); } return s; } function ucdrslink(bookname, isbn = "", args = {}) { var args0 = {"sep": "", text: "参考联盟", cls: "", style: ""}; args = args === {} ? args0 : Object.assign({}, args0, args); var sep = args.sep; var text = args.text; var cls = args.cls; var style = args.style; if (!style.includes("font-size")) style += "font-size: 90%;"; if (text === "") text = "参考联盟"; var r = sepit(`${text}`, sep); return r.replace(' class=""', '').replace(' style=""', ''); } function ucdrslink4db(bookname, args = {"sep": "|"}) { args.style = "font-size: 80%; color: orange;"; return ucdrslink(bookname, "", args); } function dzylink(key, args = {}) { var args0 = {"sep": "|", text: "多抓鱼", cls: "", style: ""}; args = args === {} ? args0 : Object.assign({}, args0, args); var sep = args.sep; var text = args.text; var cls = args.cls; var style = args.style; if (!style.includes("font-size")) style += "font-size: 90%;"; if (text === "") text = "多抓鱼"; var r = sepit(`${text}`, sep); return r.replace(' class=""', '').replace(' style=""', ''); } function dblink(bookname, isbn = "", args = {}) { var args0 = {"sep": "|", "text": "", "cls": "", "style": ""}; args = args === {} ? args0 : Object.assign({}, args0, args); var sep = args.sep; var text = args.text; var cls = args.cls; var style = args.style; if (!style.includes("font-size")) style += "font-size: 90%;"; var dbname = isbn === "" ? "豆瓣搜索" : "豆瓣直达"; if (text === "") text = dbname; if (pageurl.includes("://www.ncpssd.org/")) { text = "豆瓣"; } var href = isbn === "" ? "https://search.douban.com/book/subject_search?search_text=" + bookname.trim() : `https://book.douban.com/isbn/${isbn.trim()}/?bookname=${bookname.trim()}`; return sepit(`${text}`, sep).replace(' class=""', '').replace(' style=""', ''); } function dxtoc(url) { url = url.replace("bookDetail.jsp", "chapter.jsp").replace(/sw=[^/&]*/, "sw=1 2 3 中 4 5 6 7 8 大 参考 9 是 人 上 附 不 小 从 之 下 有 用 以 多 后 表 什么 十 10 部分 前 到 图 我 如何 要 可 内 里 记 区 外 天 来 你 西 再 序 南 步骤 同 录 附 去 女 篇 开 文 都 题 东 就 节 他 也 公 北 结 右 又 少 百 那 这 关 没 千 表格 个 男 章 0 论 几 今 左 万"); return ` | 目录`; } function dedao() { bookname = document.querySelector("figure.ebook-detail-header > figcaption.detail > h3.title").textContent.trim().split("(")[0]; m_isbn = html.match(/"href":"isbn(\d+)/); isbn = m_isbn ? m_isbn[1] : ""; let link = document.createElement("p"); link.innerHTML = ucdrslink(bookname, isbn) + dblink(bookname, isbn); document.querySelector("figure.ebook-detail-header > figcaption.detail > h3.title").after(link); } function iid2bookid(iid) { if (iid.length >= 112) return "00000000"; var bookid = ""; var part = ""; var tailhex = parseInt(iid.substring(iid.length - 2), 16); var encoded = iid.substring(0, iid.length - 32); var i; for (i = 0; i < encoded.length; i = i + 2) { part = encoded.substring(i, i + 2); bookid += String.fromCharCode(parseInt(part, 16) - tailhex); } console.log(bookid); return bookid.match(/^\d/) ? bookid.replace(/\//g, "").match(/^\d{8,}/)[0] : "00000000"; } function copybid(bookid, bidtype) { return ` 📋

`; } function copymeta(bookid) { return ` 📑 `; } function copyText(text) { if (navigator.clipboard) { navigator.clipboard.writeText(text); } else { let textarea = document.createElement("textarea"); document.body.appendChild(textarea); textarea.style.position = "absolute"; textarea.style.clip = "rect(0 0 0 0)"; textarea.value = text; textarea.select(); document.execCommand("copy", true); textarea.remove(); } } function nes(s) { return s === "" ? "-" : s; } function hsize(i) { let k = 1024; let m = k * 1024; let g = m * 1024; if (i >= g) return Math.round(i / g * 100, 2) / 100 + "G"; if (i >= m) return Math.round(i / m * 100, 2) / 100 + "M"; if (i >= k) return Math.round(i / k * 100, 2) / 100 + "K"; return i + "bytes"; } function fmb_clicked(event) { let ele = event.target; if (jQuery(ele).attr("href") !== "#") { return; } event.preventDefault(); let fmbid = jQuery(ele).attr("data-fmbid"); let md5_cache = GM_getValue("fmb" + fmbid, ""); let ele_status = jQuery(ele).next(); let filename = jQuery(ele).prev().prev().prev().text(); let filesize = jQuery(ele).prev().prev().attr("title").split(" ")[1]; if (md5_cache !== "") { let [cmd5, smd5] = md5_cache; if (smd5 !== "") { jQuery(ele).attr("href", `https://pcs.baidu.com/rest/2.0/pcs/file?app_id=266719&method=rapidupload&ondup=overwrite&content-length=${filesize}&content-md5=${cmd5}&slice-md5=${smd5}&path=/${filename}`); jQuery(ele).attr("title", "点击此链接,尝试直接转存,如失败需使用秒传连接脚本转存"); ele_status.html("缓存命中,秒传码已复制,点击🔗也可直接转存"); } else { ele_status.html("缓存命中,秒传码已复制"); } return; } let today = new Date().toLocaleDateString('sv').replaceAll('-', ''); let cnts = GM_getValue("ss2rc_cnt", {}); let cnt = cnts[today] === undefined ? 0 : cnts[today]; if (cnt >= fmblimits) return; GM_xmlhttpRequest({ method: "GET", url: `https://api.freembook.com/acquire?book_id=${fmbid}`, headers: { "referer": "https://api.freembook.com" }, timeout: 10000, onload(res) { let rdata = JSON.parse(res.responseText); if (rdata.code !== 0) { if (rdata.code === 1005) { GM_setValue("ss2rc_cnt", cnts); jQuery(".fmbquota").each(function(i, el) { jQuery(el).text(cnt + 1); }); ele_status.html(`获取秒传码失败,错误码 ${rdata.code} - ${rdata.message}${cnt === fmblimits ? " - 额度用完了,请明天再试(自行通过freembook查询或同IP的其他人查询也会消耗额度)" : " - 请重试"}`); } else { ele_status.html(`获取秒传码失败,错误码 ${rdata.code} - ${rdata.message}`); } return; } cnts[today] = cnt + 1; GM_setValue("ss2rc_cnt", cnts); let [cmd5, smd5] = rdata.book_baidu; GM_setValue("fmb" + fmbid, rdata.book_baidu); if (smd5 !== "") { jQuery(ele).attr("href", `https://pcs.baidu.com/rest/2.0/pcs/file?app_id=266719&method=rapidupload&ondup=overwrite&content-length=${filesize}&content-md5=${cmd5}&slice-md5=${smd5}&path=/${filename}`); jQuery(ele).attr("title", "点击此链接,尝试直接转存,如失败需使用秒传连接脚本转存"); copyText(`${cmd5}#${smd5}#${filesize}#${filename}`); ele_status.html("秒传码已复制,点击🔗也可直接转存"); } else { copyText(`${cmd5}#${filesize}#${filename}`); ele_status.html("秒传码已复制"); } }, onerror(res) { ele_status.html(`查询秒传码时发生错误,请稍后重试`); }, onabort(res) { ele_status.html(`查询秒传码的任务被取消,请稍后重试`); }, ontimeout(res) { ele_status.html(`查询秒传码的任务超时,请稍后重试`); }, }); jQuery(".fmbquota").each(function(i, el) { jQuery(el).text(cnt + 1); }); } function copybid_clicked(event) { let ele = event.target; let bid = jQuery(ele).attr("data-text"); jQuery(".copybid").unbind("contextmenu").bind("contextmenu", copybid_clicked); let bidtype = bid.length === 8 ? "SSID" : "DXID"; if (bid.length === 10) bidtype = bid[0] === "B" ? "BCID" : "SSNO"; if (bid.length === 20) bidtype = "DAID"; if ((bidtype === "SSID" || bidtype === "DXID") && enablerc === "y" && event.type === "contextmenu" && !pageurl.includes("/s?")) { let today = new Date().toLocaleDateString('sv').replaceAll('-', ''); let cnts = GM_getValue("ss2rc_cnt", {}); let cnt = cnts[today] === undefined ? 0 : cnts[today]; let tip = cnt <= (fmblimits - 1) ? `正在查询${bid}的秒传码......请耐心等待` : `根据ssid/dxid获取秒传链接为试验性功能,请低调使用。获取秒传码每日每IP限额${fmblimits}次,你已用完额度,只能查看资源列表。要获得秒传码,请明天再尝试!(自行通过freembook查询或同IP的其他人查询也会消耗额度,因此已用额度可能与你印象中不一致。)`; let nostock = jQuery(ele).prev().attr("style").includes("color: grey;"); if (nostock) tip = "灰色SSID的书无库存,请不要查询!"; let snippet = `
${tip}
`; let isdx = html.includes("/views/specific/") ? false : true; let block = isdx ? jQuery(ele).parent().parent().parent() : jQuery(ele).parent().parent(); let bookname = pageurl.includes("/search?") ? block.find("input[id^='title']").val().replace(/<.*?>/g, "") : jQuery(isdx ? "div.card_text > dl > dt" : "div.tutilte").text(); let rcresult = pageurl.includes("/search?") ? block.find("div.rcresult") : jQuery("div.rcresult"); let tgresult = pageurl.includes("/search?") ? block.find("div.tgresult") : jQuery("div.tgresult"); if (rcresult.length === 0) { if (!isdx && pageurl.includes("/views/specific/")) jQuery("div.leftnav_tu > div:last").css({"height": "", "min-height": "265px"}); (pageurl.includes("/search?") ? block.find(isdx ? "dl" : "div.get") : jQuery(isdx ? "div.card_text > dl" : "div.leftnav_tu").children().last()).after(snippet); rcresult = pageurl.includes("/search?") ? block.find("div.rcresult") : jQuery("div.rcresult"); tgresult = pageurl.includes("/search?") ? block.find("div.tgresult") : jQuery("div.tgresult"); } else { rcresult.text(tip); } GM_xmlhttpRequest({ method: "GET", url: `https://api.freembook.com/search?category=tg&q=${bookname}`, headers: { "referer": "https://api.freembook.com" }, timeout: 10000, onload(res) { console.log(res.responseText); let rdata = JSON.parse(res.responseText); if (rdata.code !== 0) { tgresult.html(`在tg库查询【${bookname}】时发生错误,错误码 ${rdata.code} - ${rdata.message}`); return; } let books = rdata.books; if (books.length === 0) { tgresult.html(`在tg库查询【${bookname}】无结果`); return; } let r = ""; let seq = 0; for (let book of books) { let [bookname, author, language, pubdate, isbn, fids] = book; seq += 1; r += `

${seq}. ${nes(bookname)}, ${nes(author)}, ${nes(isbn)}`; fids = fids.split("|"); for (let i = 0; i < fids.length; i++) { let fid = fids[i]; if (fid !== "") { let ftype = ["mobi", "epub", "azw3", "pdf"][i]; r += `, ${ftype}`; } } r += "

"; } if (r) { r = `以下为检索书名获得的telegram 群组文件,请自行辨别是否所需图书。数据来源freembook。` + r; tgresult.html(r); } }, onerror(res) { tgresult.html(`在tg库查询【${bookname}】时发生错误,请稍后重试:
${res.responseText}`); }, onabort(res) { tgresult.html(`在tg库查询【${bookname}】的任务被取消,请稍后重试:
${res.responseText}`); }, ontimeout(res) { tgresult.html(`tg库查询${bookname}的任务超时,请稍后重试:
${res.responseText}`); }, }); GM_xmlhttpRequest({ method: "GET", url: `https://api.freembook.com/search?category=duxiu&q=${bid}`, headers: { "referer": "https://api.freembook.com" }, timeout: 10000, onload(res) { let rdata = JSON.parse(res.responseText); if (rdata.code !== 0) { rcresult.html(`查询${bid}秒传码发生错误,错误码 ${rdata.code} - ${rdata.message}`); return; } let books = rdata.books; if (books.length === 0) { rcresult.html(`查询${bid}秒传码无结果`); return; } let books_filter = {}; for (let book of books) { let [bidx, ssid, filename, filesize, dxid, bookname, pubdate, page, isbn, rctype] = book; let key = filesize + "-" + rctype; if (books_filter[key] !== undefined) continue; books_filter[key] = bidx; } let r = ""; let seq = 0; for (let book of books) { let [bidx, ssid, filename, filesize, dxid, bookname, pubdate, page, isbn, rctype] = book; if (books_filter[filesize + "-32"] !== undefined && books_filter[filesize + "-32"] !== bidx) continue; if (books_filter[filesize + "-32"] === undefined && books_filter[filesize + "-0"] !== undefined && books_filter[filesize + "-0"] !== bidx) continue; seq += 1; r += `

${seq}. ${nes(ssid)}, ${nes(dxid)}, ${nes(filename)}, ${hsize(filesize)}, ${rctype === 32 ? "长码" : "短码"} 🔗

`; } if (r) { r = `

今日已使用 ${cnt} / ${fmblimits},点击🔗可获取${bid}的秒传码。使用秒传链接脚本可提取文件。数据来源freembook

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