// ==UserScript==
// @id xuqb@lib.pku.edu.cn
// @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
// @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);
}
}
});
})();