你需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
你需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
你需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
你需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已安装用户样式管理器,立即安装用户样式!)
// ==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);
}
}
});
})();