// ==UserScript== // @id xuqb@lib.pku.edu.cn // @name 豆瓣读书揭示北大馆藏+荐购 // @namespace lib.pku.edu.cn // @version 2.0 // @description 为豆瓣读书增加北京大学图书馆相关资源链接。图书页面右侧的“在哪儿借这本书”中将出现红色图标及“北京大学图书馆”链接,点击链接可以打开北大馆藏目录中该书的检索结果。如果该书有 ISBN(国际标准书号)但查无此书,或没有 ISBN,则改为提供一个按书名检索的链接。点击查馆藏链接后,原图书页面还将显示推荐购买界面,如果能确认该书尚不为北大图书馆所收藏,可由此快捷荐购。使用荐购功能时,若遇浏览器拦截阻止弹窗,请为当前网站(豆瓣图书)解除拦截,才能正常提交荐购申请。 // @author 馆君 // @match https://book.douban.com/subject/* // @connect 162.105.138.200 // @connect api.douban.com // @grant GM_xmlhttpRequest // @grant GM_setClipboard // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== var Douban_PKUL_Styles = "@charset utf-8;"; Douban_PKUL_Styles += " #borrowinfo ul img {height: 16px; vertical-align: text-bottom; padding-right: 2px;}"; Douban_PKUL_Styles += " #formPKULPurchase { width: 260px; font-size: 9px; background-color: rgba(144, 160, 238, 0.25); padding: 4px; border-radius: 6px; }"; Douban_PKUL_Styles += " #formPKULPurchase input, #formPKULPurchase label, #formPKULPurchase span { font-size: 9px; }"; Douban_PKUL_Styles += " #formPKULPurchase b { font-size: 12px; }"; Douban_PKUL_Styles += " .PKULibPurchaseTheme { font-size: 13px; color: #03155f; font-weight: bold; }"; Douban_PKUL_Styles += " #formPKULPurchase textarea { border-color: red; font-size: 10px; width: 250px; min-height: 40px; resize: vertical; }"; Douban_PKUL_Styles += " #paraTI, #paraAU { width: 213px; }"; Douban_PKUL_Styles += " #paraPUB { width: 124px; } #paraPD { width: 50px; } "; Douban_PKUL_Styles += " #paraPR { width: 72px; } #paraISBN { width: 100px; } "; Douban_PKUL_Styles += " #paraID { width: 100px; } "; Douban_PKUL_Styles += " #buttSUBMIT { width: 255px; height:36px; font-size: 16px !important; letter-spacing: 0.8px; border-radius: 6px; color: #03155f; background-color: orange; font-weight: bold; } "; Douban_PKUL_Styles += " .purchaseSubmitted { color: gray !important; } "; GM_addStyle(Douban_PKUL_Styles); // 油猴脚本附加 CSS function getDoc(url, meta, callback) { // XHR 回调函数模板 GM_xmlhttpRequest({ method: 'GET', url: url, headers: { 'User-agent': window.navigator.userAgent, 'Content-type': null }, onload: function(responseDetail) { var doc = ''; if (responseDetail.status == 200) { doc = new DOMParser().parseFromString(responseDetail.responseText, 'text/html'); if (doc === undefined) { doc = document.implementation.createHTMLDocument(""); doc.querySelector('html').innerHTML = responseText; } } callback(doc, responseDetail, meta); } }); } function generatePurchaseForm(thisBook) { // 在 #PKULib 之后生成荐购界面 var $form = $("
"); $form.append($("

如果尚未收藏,打算推荐购买?

")).append($("
")); $form.append($("书目信息")).append($("(已自动填写,请核对订正)")).append($("
")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("")); $form.append($("")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("")); $form.append($("")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("
")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("如果是外文书 ")); $form.append($("")); $form.append($("")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("")); $form.append($("")).append($("
")); $form.append($("【说明】建议正确填写校园卡号,有助于图书馆决定是否订购,并且用户还可在 e-Library 中跟踪订购状态(限同时最多 3 个)")).append($("
")); $form.append($("
")); $form.append($("")); $form.append($("")); $form.hide(); // 初始隐藏 $("#PKULib").after($form); // 生成表单;下面继续挂接事件函数 $("#PKULib a").on("click", function(){ // 强制用户先用书名查询 OPAC 至少一次才能显示荐购界面 $("#formPKULPurchase").show(); }); $form.on("submit", trySubmitRecomm); // 挂接事件:尝试提交(验证 + 提交) $(".PKULib_MUST").on("input", function(){ // 必填字段如果空值,立刻用红色提醒 var color = $(this).val().length > 0 ? "initial" : "red"; $(this).prev("label").css("color", color); // 就是栏位提示文字 label $(this).css("border-color", color); }); } function trySubmitRecomm() { // 验证并实际执行提交 //document.charset='UTF-8'; if ($("#paraTI").val().length <= 0 || $("#paraAU").val().length <= 0 || $("#paraWHY").val().length <= 0) { alert("书名、著者、推荐理由为必填项,请不要留空!\n\n谢谢合作!"); return false; } if ($("#paraID").val().length < 10 && $("#paraNOTEhold").attr("checked") == "checked") { alert("您选择了希望预约外文图书的可借出复本,然则还须正确填写校园卡号。\n\n请重新填写并核实。谢谢合作!"); $("#paraID").select(); return false; } if (!confirm("只有正确填写校园卡号才能跟踪订购申请的状态(登录馆藏目录 -> 读者服务 -> 用户状态查询 -> 请求),图书馆也将优先考虑此类申请。\n\n现在" + (($("#paraID").val().length <= 0) ? "没有填写校园卡号" : "填写的卡号是【" + $("#paraID").val() + "】") + ",您确定要推荐吗?")) { $("#paraID").select(); return false; } var urlPreLoad = "http://162.105.138.200/uhtbin/cgisirsi/0/0/0/64/PURCHASE"; getDoc(urlPreLoad, null, function(doc, resp, meta) { document.getElementById("formPKULPurchase").submit(); // 必须预先请求上面的页面,才能正确提交荐购申请 }); $("#buttSUBMIT").val("荐购申请已提交!"); // 替换提交按钮的文字 $("#buttSUBMIT").addClass("purchaseSubmitted"); // 按钮文字变灰 $("#buttSUBMIT").attr("disabled", "disabled"); // 停用提交按钮 $("#formPKULPurchase").append($("

如果申请提交不成功,可以重新填表

")); $("#PKULibPurchaseRetry").on("click", "a", function(){ $("#buttSUBMIT").val("重新向北大图书馆推荐订购"); $("#buttSUBMIT").removeClass("purchaseSubmitted"); $("#buttSUBMIT").attr("disabled", false); // 恢复提交按钮 $("#PKULibPurchaseRetry").remove(); return false; }); return false; // 直接的提交行为永远被阻止,因为无法成功 } (function() { 'use strict'; if($("#buyinfo").length <= 0 && $("#borrowinfo").length <= 0) return; // 没有适当的位置?中断脚本(油猴 @match 属性并不能保证一定处在图书页面) if($("#borrowinfo").length <= 0) // 如果借阅信息面板不存在,模仿常例创建之 $("#buyinfo").after($("

在哪儿借这本书 · · · · · ·

")); $("#borrowinfo ul.more-after").prepend($("
  • 北京大学图书馆……检索中,请稍等
  • ")); // 创建北大图书馆项目 $.ajax({ // 调用豆瓣图书 API url: "https://api.douban.com/v2/book/" + window.location.pathname.match(/\d+/)[0], type: 'GET', dataType: 'JSONP', success: function(data) { var thisBook = data; var searchTIurl = "http://162.105.138.200/uhtbin/cgisirsi/x/北大中心馆/0/5?searchdata1=" + thisBook.title + "&library=ALL&srchfield1=TI%5ETITLE%5E%5ETitle%25"; if (thisBook.isbn13) { // 豆瓣著录了 ISBN var searchISBNurl = "http://162.105.138.200/uhtbin/isbn/" + thisBook.isbn13; getDoc(searchISBNurl, null, function(doc, resp, meta) { // 按 ISBN 查询北大 OPAC var searchSumHits = $("div.searchsum_hits .content p", doc).text(); // 单个命中结果 if (!searchSumHits.match(/\d+\D+of\D+\d+/)) { // 无论中英文版 OPAC 都是这个格式 var hitListSearchSummary = $("#hitlist .hit_list .hitstop .searchsummary", doc).text(); // 多个命中结果 if (!/检索到\D+\d+\D+题名/.test(hitListSearchSummary) && !/search found\D+\d+\D+titles/.test(hitListSearchSummary)) { $("#PKULib").append($("(ISBN 查无结果)")); $("#searchingPKULib").remove(); // 删除等待检索提示(必须在 getDoc callback 函数中执行,否则可能还在等待时就删除了) generatePurchaseForm(thisBook); // 生成荐购表单,初始隐藏,用户点击一次链接后触发显示 return; } } $("#PKULib").wrap($("")); // 生成按 ISBN 检索的链接 $("#searchingPKULib").remove(); }); } else { // 豆瓣没有著录 ISBN $("#PKULib").append($("(该书无 ISBN)")); // 因为没有 ISBN 所以增加 sort_by 参数,按从旧到新排序搜索结果 $("#searchingPKULib").remove(); generatePurchaseForm(thisBook); } } }); })();