您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
为豆瓣读书增加北京大学图书馆相关资源链接。图书页面右侧的“在哪儿借这本书”中将出现红色图标及“北京大学图书馆”链接,点击链接可以打开北大馆藏目录中该书的检索结果。如果该书有 ISBN(国际标准书号)但查无此书,或没有 ISBN,则改为提供一个按书名检索的链接。点击查馆藏链接后,原图书页面还将显示推荐购买界面,如果能确认该书尚不为北大图书馆所收藏,可由此快捷荐购。使用荐购功能时,若遇浏览器拦截阻止弹窗,请为当前网站(豆瓣图书)解除拦截,才能正常提交荐购申请。
当前为
// ==UserScript== // @id [email protected] // @name 豆瓣读书揭示北大馆藏+荐购 // @namespace lib.pku.edu.cn // @version 2.01 // @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 // ==/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 id='formPKULPurchase' method='post' action='http://162.105.138.200/uhtbin/cgisirsi/0/0/0/65/PURCHASE' accept-charset='UTF-8' target='_blank'></form>"); $form.append($("<p class='PKULibPurchaseTheme'>如果尚未收藏,打算推荐购买?</p>")).append($("<hr />")); $form.append($("<b>书目信息</b>")).append($("<span>(已自动填写,请核对订正)</span>")).append($("<br />")); $form.append($("<label for='paraTI'>书 名 </label>")); $form.append($("<input type='text' name='entry^1^TITLE^题名' id='paraTI' class='PKULib_MUST' size='30' value='" + thisBook.title + (thisBook.subtitle.length > 0 ? ". " + thisBook.subtitle : "") + "' placeholder='必填' required='required' />")).append($("<br />")); $form.append($("<label for='paraAU'>著 者 </label>")); $form.append($("<input type='text' name='entry^2^AUTHOR^著者' id='paraAU' class='PKULib_MUST' size='30' value='" + thisBook.author.join("、") + (thisBook.translator.length > 0 ? ";" + thisBook.translator.join("、") + " 译" : "") + "' placeholder='必填;包括作者、编者、译者等' required='required' />")).append($("<br />")); $form.append($("<label for='paraPUB'>出版社 </label>")); $form.append($("<input type='text' name='entry^3^PUBLISHER^出版者' id='paraPUB' size='17' value='" + thisBook.publisher + "' placeholder='出版社、出版商' />")); $form.append($("<label for='paraPD'> 年月 </label>")); $form.append($("<input type='text' name='entry^4^DATE^日期' id='paraPD' size='7' value='" + (/\d{2,4}[-\/\.]\d{1,2}/.test(thisBook.pubdate) ? thisBook.pubdate.match(/\d{2,4}[-\/\.]\d{1,2}/)[0] : thisBook.pubdate) + "' placeholder='出版年月' />")).append($("<br />")); $form.append($("<label for='paraPR'>定 价 </label>")); $form.append($("<input type='text' name='entry^7^PRICE^价格' id='paraPR' size='10' value='" + thisBook.price + "' placeholder='图书价格' />")); $form.append($("<label for='paraISBN'> ISBN </label>")); $form.append($("<input type='text' name='entry^5^ISBN/ISSN^ISBN/ISSN' id='paraISBN' size='14' value='" + (thisBook.isbn13 ? thisBook.isbn13 : (thisBook.isbn10 ? thisBook.isbn10.replace(/^SH/, "统一书号 ") :"(无)")) + "' placeholder='国际标准书号' />")).append($("<br />")); $form.append($("<hr />")); $form.append($("<label for='paraWHY' style='color: red;'><b>推荐理由<br /></b></label>")); $form.append($("<textarea name='entry^6^CITED_IN^推荐原因' id='paraWHY' class='PKULib_MUST' size='14' maxlength='140' placeholder='为何推荐这本书?——对专业的重要性、作者知名度、版本价值,等等' autofocus='autofocus' required='required' rows='3'></textarea>")).append($("<br />")); $form.append($("<span>如果是外文书 </span>")); $form.append($("<input type='radio' name='entry^8^NOTE^注释' id='paraNOTEhold' value='希望预约' />")); $form.append($("<label for='paraNOTEhold'>希望预约可借复本 </label>")); $form.append($("<input type='radio' name='entry^8^NOTE^注释' id='paraNOTEnohold' value='不必预约或非外文书' checked='checked' />")); $form.append($("<label for='paraNOTEnohold'>无所谓</label>")).append($("<br />")); $form.append($("<label for='paraID'><b>校园卡号</b> </label>")); $form.append($("<input type='text' name='alt_id' id='paraID' size='14' value='' placeholder='推荐人的校园卡号' />")).append($("<br />")); $form.append($("<span>【说明】建议正确填写校园卡号,有助于图书馆决定是否订购,并且用户还可在 e-Library 中跟踪订购状态(限同时最多 3 个)</span>")).append($("<br />")); $form.append($("<hr />")); $form.append($("<input type='submit' value='推荐给北大图书馆订购' id='buttSUBMIT' />")); $form.append($("<input type='hidden' name='entry^9^SOURCE^来源' size='10' value='" + thisBook.alt + "' />")); $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($("<p id='PKULibPurchaseRetry'>如果申请提交不成功,可以<a href='#'>重新填表</a>。</p>")); $("#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($("<div class='gray_ad' id='borrowinfo'><h2><span>在哪儿借这本书</span> · · · · · ·</h2><ul class='bs more-after'></ul></div>")); $("#borrowinfo ul.more-after").prepend($("<li style='border: none;'><img src='http://lib.pku.edu.cn/portal/sites/default/files/favicon.ico' /><span id='PKULib'>北京大学图书馆</span><span id='searchingPKULib'>……检索中,请稍等</span></li>")); // 创建北大图书馆项目 $.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($("<a href='" + searchTIurl + "' target='_blank' title='尝试检索书名'>(ISBN 查无结果)</a>")); $("#searchingPKULib").remove(); // 删除等待检索提示(必须在 getDoc callback 函数中执行,否则可能还在等待时就删除了) generatePurchaseForm(thisBook); // 生成荐购表单,初始隐藏,用户点击一次链接后触发显示 return; } } $("#PKULib").wrap($("<a href='" + searchISBNurl + "' target='_blank' id='PKULibLink' title='馆藏目录检索''></a>")); // 生成按 ISBN 检索的链接 $("#searchingPKULib").remove(); }); } else { // 豆瓣没有著录 ISBN $("#PKULib").append($("<a href='" + searchTIurl + "&sort_by=PBYR" + "' target='_blank' title='尝试检索书名'>(该书无 ISBN)</a>")); // 因为没有 ISBN 所以增加 sort_by 参数,按从旧到新排序搜索结果 $("#searchingPKULib").remove(); generatePurchaseForm(thisBook); } } }); })();