Greasy Fork

Greasy Fork is available in English.

豆瓣读书揭示北大馆藏+荐购

为豆瓣读书增加北京大学图书馆相关资源链接。图书页面右侧的“在哪儿借这本书”中将出现红色图标及“北京大学图书馆”链接,点击链接可以打开北大馆藏目录中该书的检索结果。如果该书有 ISBN(国际标准书号)但查无此书,或没有 ISBN,则改为提供一个按书名检索的链接。点击查馆藏链接后,原图书页面还将显示推荐购买界面,如果能确认该书尚不为北大图书馆所收藏,可由此快捷荐购。使用荐购功能时,若遇浏览器拦截阻止弹窗,请为当前网站(豆瓣图书)解除拦截,才能正常提交荐购申请。

目前为 2017-05-12 提交的版本,查看 最新版本

// ==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>&nbsp;&middot;&nbsp;&middot;&nbsp;&middot;&nbsp;&middot;&nbsp;&middot;&nbsp;&middot;</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);
      }
    }
  });
})();