深圳图书馆图书信息豆瓣脚本,这个失效了。- // ==UserScript==
- // @name douban_shenzhenLib
- // @name:zh-CN 深圳图书馆图书信息豆瓣脚本
- // @namespace http://www.douban.com/note/180166013/
- // @description Show book available info in douban book page, show book's douban score in Shenzhen Library book page
- // @description:zh-cn 为豆瓣书籍页面(book.douban.com)添加书籍在深圳图书馆的信息,预借链接,为深圳图书馆书籍信息页面添加书籍在豆瓣的评分,链接
- // @license MIT License
- // @supportURL http://www.douban.com/note/180166013/
- // @version 1.24.10
- // @require http://code.jquery.com/jquery-1.4.4.min.js
- // @include http://book.douban.com/*
- // @include https://book.douban.com/*
- // @include https://www.douban.com/doulist/*
- // @include https://www.szlib.org.cn/Search/searchdetail.jsp*
- // @include https://www.szlib.org.cn/Search/searchshow.jsp*
- // @include http://opac.nslib.cn/Search/searchdetail.jsp*
- // @include http://opac.nslib.cn/Search/searchshow.jsp*
- // @include https://www.szln.gov.cn/Search/searchdetail.jsp*
- // @include https://www.szln.gov.cn/Search/searchshow.jsp*
- // @include http://218.17.147.50/Search/searchdetail.jsp*
- // @include http://218.17.147.50/Search/searchshow.jsp*
- // @grant GM_addStyle
- // @grant GM_xmlhttpRequest
- // @grant GM_registerMenuCommand
- // @grant GM_getValue
- // @grant GM_setValue
- // @author morningSky
- // @refer books_recommend_THU, bean vine (49911) and others...
- // @updateDate 2019-03-25
- /* @reason
- 1. 深圳图书馆查询url变更, sortfield=ptitle
- 2. 减少加载时间:缓存图书的索书号,是否有多本,可预借,可快递。在馆信息还是需要查询图书馆网站
- 3. 豆瓣api只对企业开放,个人用户不提供key,修改为在html中解析isbn10
-
- Firefox Greasemonkey v4.0及之后版本修改了API,这个脚本失效了;请用tampermonkey插件,需要再次安装这个脚本。
- 争取找时间修改脚本,使其适用于新版的Greasemonkey插件————可能tampermonkey插件后续也会修改API,导致脚本失效。
- @end*/
- //
- // ==/UserScript==
-
- /*
- * opac.nslib.cn 南山,szln.gov.cn 盐田,218.17.147.50 龙岗
- */
-
- var fDebug = false;
- var title, isbn, isbn10;
-
- var SZLIB_HOST = 'https://www.szlib.org.cn/';
- var LIBOPAC_URL = SZLIB_HOST + 'Search/searchshow.jsp?v_tablearray=bibliosm,serbibm,apabibibm,mmbibm,&v_book=on&sortfield=ptitle&sorttype=desc&pageNum=10';
-
- // 查询索书号
- var LIBOPAC_URL_CALLNO = SZLIB_HOST + 'Search/getpreholding.jsp?v_curtable=bibliosm&v_recno=';
- var LIBBOOK_URL = SZLIB_HOST + 'Search/searchdetail.jsp?v_tablearray=bibliosm&v_curtable=bibliosm&site=null&v_recno=';
- var LIBQRYRESERVABLE_URL = SZLIB_HOST + 'Search/getpreLoan.jsp?';
- var LIBRESERVE_URL = SZLIB_HOST + 'MyLibrary/Reader-Access.jsp?destPage=ReserveSubmit.jsp&v_tablearray=bibliosm&v_TableName=80000002&v_recno=';
- var LIB_EXPRESS_URL = SZLIB_HOST + 'MyLibrary/Reader-Access.jsp?destPage=/Search/searchshow.jsp?v_index=isbn&v_tablearray=bibliosm,&sorttype=desc&sortfield=ptitle&v_value=';
-
- var HTML_LOADING = '<font color="grey">正在查询图书馆馆藏情况 · · · · · · </font>';
- var LIBSEARCH_LINK_PRE = '<a title="点击前往图书馆搜索" target="_blank" ';
- var LIBSEARCH_LINK_SUF = '在深圳图书馆搜索</a>';
-
-
- //if(typeof isChromeExtension == 'undefined'){
- // init();
- //}else{
- // function onReadyGM(){
- // init();
- // };
- //};
-
-
-
- // main body of the script
-
- function isEmptyStr(vStr) {
- return vStr == null || vStr.length == 0 || /^\s*$/.test(vStr);
- }
-
- function getLibIsbnUrl(vIsbn) {
- return LIBOPAC_URL + '&v_index=isbn&v_value=' + vIsbn;
- }
-
- function getLibTitleUrl(vTitle) {
- return LIBOPAC_URL + '&v_index=title&v_value=' + encodeURIComponent(vTitle);
- }
-
- function getDoubanSearchUrl(keyword) {
- return 'http://book.douban.com/subject_search?cat=1001&cat=&search_text=' + encodeURIComponent(keyword);
- }
-
- function getDoubanSearchLink(keyword) {
- return '<a target="_blank" href="' + getDoubanSearchUrl(keyword) + '" title="点击前往豆瓣查询这本书">在豆瓣搜索</a>';
- }
-
- function getLibHeadHtml() {
- var htmlStr = '<ul>';
- // http://www.szln.gov.cn/lib/library.do
- /*htmlStr += '<li><a style="float:right" target="_blank" href="http://www.szlib.gov.cn">深圳图书馆</a></li>';*/
- //<span class="membArrow"> </span>
- htmlStr += '<li><div class="libMem">';
- htmlStr += '<a class="libMemLink" href="#more" >成员馆</a>';
- htmlStr += '<ul class="libMemMenu">';
- htmlStr += '<li><a href="http://www.szlib.org.cn" target="_blank" title="深圳图书馆">深圳图书馆</a></li>';
- htmlStr += '<li><a href="http://www.szclib.org.cn/" target="_blank" title="深圳少年儿童图书馆">少年儿童图书馆</a></li>';
- htmlStr += '<li><a href="http://lib.utsz.edu.cn/" target="_blank" title="深圳市科技图书馆">科技图书馆</a></li>';
- htmlStr += '<li><a href="http://www.szlhlib.com.cn/" target="_blank" title="深圳市罗湖区图书馆">罗湖区图书馆</a></li>';
- htmlStr += '<li><a href="http://www.szftlib.com.cn/" target="_blank" title="深圳市福田区图书馆">福田区图书馆</a></li>';
- htmlStr += '<li><a href="http://www.sznslib.com.cn" target="_blank" title="深圳市南山区图书馆">南山区图书馆</a></li>';
- htmlStr += '<li><a href="http://www.szytlib.cn/" target="_blank" title="深圳市盐田区图书馆">盐田区图书馆</a></li>';
- htmlStr += '<li><a href="http://www.balib.com.cn" target="_blank" title="深圳市宝安区图书馆">宝安区图书馆</a></li>';
- htmlStr += '<li><a href="http://www.szlglib.com.cn/" target="_blank" title="深圳市龙岗图书馆">龙岗图书馆</a></li>';
- htmlStr += '</ul></div></li>';
- htmlStr += '<li><h2>在深圳图书馆借阅 · · · · · · </h2></li>';
- htmlStr += '</ul>';
-
- return htmlStr;
- }
-
- function setLibMemberStyle() {
- GM_addStyle('\
- #libInfo {\
- overflow: visible;\
- }\
- .libMem {\
- z-index: 97;\
- position: relative;\
- float: right;\
- }\
- .libMemMenu {\
- position: absolute;\
- top: -5px;\
- left: 0px;\
- visibility: hidden;\
- }\
- .libMem a {\
- -moz-border-radius: 7px;\
- -webkit-border-radius: 7px;\
- border-radius: 7px;\
- display: block;\
- background: #f6f6f1;\
- padding: 5px;\
- width: 90px;\
- line-height: 160%;\
- border: 1px solid #fff;\
- }\
- .libMem a:hover {\
- background: #FFF;\
- border: 1px solid #aaa;\
- color: #000;\
- }\
- .libMem:hover .libMemMenu {\
- visibility: visible;\
- }\
- .libMem .libMemLink {\
- border: 1px solid #aaa;\
- line-height: 100%;\
- width: 90px;\
- }\
- ');
- }
-
- // getpreLoan.jsp?tableList=bibliosm,bibliosm,bibliosm,&metaidList=934991,1209378,698561,
- function getReservableQryUrl(bookRecNos) {
- var qryParam = 'tableList=';
- for (var i = 0; i < bookRecNos.length; i++) {
- qryParam += 'bibliosm,';
- }
- // array.toString: arr[0],arr[1],...
- qryParam += '&metaidList=' + bookRecNos + ',';
- if (fDebug) console.log('Reservable qryUrl: ' + LIBQRYRESERVABLE_URL + qryParam);
- return LIBQRYRESERVABLE_URL + qryParam;
- }
-
- /*
- * Append the book link, search link, preserve link, call no with location info
- *
- * @param bookRecNos is an Array
- * The reservable query return a xml:
- * <root><preloan no='0'>true</preloan><preloan no='1'>false</preloan></root>
- */
- function appendLibBookInfo(bookRecNos) {
- if (bookRecNos == null || bookRecNos.length == 0)
- return ;
-
- var fMore = (bookRecNos.length > 1);
- var bookRecNo = bookRecNos[0];// set the first book as default
- var reservableQry_url = getReservableQryUrl(bookRecNos);
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: reservableQry_url,
- headers: {
- 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
- "Accept": "text/xml"
- },
- onload: function(res) {
- // the reservable query return is a xml document
- var fHasReservable = false;
-
- if (fDebug) console.log('preloan xml: ' + res.responseText);
- var xmldata = new DOMParser().parseFromString(res.responseText, "text/xml");
-
- if (fDebug) console.log('preloan xml: ' + xmldata);
- var preloans = xmldata.getElementsByTagName('preloan');
- for (var i = 0; i < preloans.length;i++) {
- if (fDebug) console.log('preloan : ' + i + ', ' + preloans[i].childNodes[0].nodeValue);
- if (preloans[i].childNodes[0].nodeValue == 'true') {
- bookRecNo = bookRecNos[i];
- fHasReservable = true;
- break;
- }
- }
-
- var fHasExpress = false;
- var exps = xmldata.getElementsByTagName('express');
- for (var j = 0; j < exps.length; j++) {
- if (exps[j].childNodes[0].nodeValue == 'true') {
- fHasExpress = true;
- break;
- }
- }
-
- var cacheInfo = '{"bookRecNo":"' + bookRecNo + '", "hasMore":"'+ fMore + '", "reservable":"' + fHasReservable + '", "expressable":"' + fHasExpress + '"}';
- GM_setValue(isbn, cacheInfo);
- appendLibBookHtml(bookRecNo, fMore, fHasReservable, fHasExpress);
-
- } // end function(res)
- }
- );
-
- } // end appendLibBookInfo
-
- function appendLibBookHtml(bookRecNo, fMore, fHasReservable, fHasExpress) {
- if (fDebug) console.log('book recNo: ' + bookRecNo + ', fHasReservable: ' + fHasReservable + ', fHasExpress:' + fHasExpress);
-
- var book_url = LIBBOOK_URL + bookRecNo;
- var htmlStr = '';
- htmlStr += '<ul id="libLinks" class="bs" >';//<div class="indent">
- htmlStr += '<li style="border:none"><a id=libBookLink href="' + book_url;
- //title="点击前往图书馆查看"
- htmlStr += '" target="_blank" >到深圳图书馆查看本书</a>';
- if (fMore) {
- htmlStr += '<a class="rr" href="' + getLibIsbnUrl(isbn);
- htmlStr += '" target="_blank" title="查看所有搜索结果">更多. . .</a>';
- }
- htmlStr += '</li>';
- if (fHasReservable || fHasExpress) {
- htmlStr += '<li style="border:none">';
- if (fHasReservable) {
- htmlStr += '<a class="collect_btn colbutt ll" href="';
- htmlStr += LIBRESERVE_URL + bookRecNo;
- htmlStr += '" target="_blank" title="登陆我的图书馆办理预借登记"><span >预借登记</span></a>';
- }
- if (fHasExpress) {
- htmlStr += (fHasReservable ? ' ' : '');
- htmlStr += '<a class="collect_btn colbutt ll" href="';
- htmlStr += LIB_EXPRESS_URL + isbn;
- htmlStr += '" target="_blank" title="登陆我的图书馆办理快递到家"><span >快递到家</span></a>';
- }
- htmlStr += '</li>';
- }
-
- htmlStr += '</ul>'; //</div></div>
- $("#libInfo").html(htmlStr);
-
- appendBookCallNumbers(bookRecNo);
- }
-
-
- /**
- * 解析索书号没有使用xml解析,使用正则表达式解析
- *
- * 添加索书号,位置信息,查询url返回html字符串,每个馆藏一个div,结构如下
- * <div class='tab_2_title'><a title='深圳图书馆 (1)'>深圳图书馆 (1)</a>...</div>
- * <div class="tab_2_show">
- * <div class="tab_2_text">
- * <h3 class='title'>可外借馆藏</h3>
- * <table >
- * <thead><tr><td>条码号</td><td>索书号</td><td>所在地点</td></tr></thead>
- * <tbody>
- * <tr><td>04400511016054</td><td>K825.4/1023</td><td>深图中文图书借阅区(3楼)</td></tr>
- * ...
- * </tbody>
- * </table>
- * <h3 class='title'>可阅览馆藏</h3>
- * <table >...</table>
- * </div>
- * ...
- * </div>
- *
- * 条码号可能是字母开头
- * <tr><td>F4401001057643</td><td>K825.1=72/6</td><td>大学城中文图书</td></tr>
- */
- function appendBookCallNumbers(bookRecNo) {
- if (bookRecNo == -1)
- return ;
-
- var qryCallNoUrl = LIBOPAC_URL_CALLNO + bookRecNo;
- if (fDebug) console.log('qryCallNoUrl: ' + qryCallNoUrl);
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: qryCallNoUrl,
- headers: {
- 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey'
- },
- onload: function(res) {
- if (fDebug) console.log('res: ' + res.responseText);
- var respTxt = res.responseText;
- // extract the 图书馆分馆名称
- var locs = null;
- var libLocs = null;
- try
- {
- locs = respTxt.match(/\s+title=["']?.*?["']/igm);
- if (fDebug) console.log('locs: ' + locs + ', len: ' + locs.length);
- libLocs = respTxt.match(/<div\sclass=["']?tab_2_text["']?.*?<\/div>/igm);
- if (fDebug) console.log('libLocs: ' + libLocs + ', len: ' + libLocs.length);
- } catch (ex) {
- console.log('book callNo parse has exception, ' + ex.message);
- }
-
- var htmlStr = getBookCallNumberHtml(locs, libLocs);
- if (fDebug) console.log('call No html: ' + htmlStr);
-
- if (!isEmptyStr(htmlStr))
- $("#libInfo").append(htmlStr);
- } // end function(res)
- });
-
- } // end appendBookCallNumber
-
- function getBookCallNumberHtml(locs, libLocs) {
- if (locs == null || libLocs == null)
- return '<div class="indent"></div>';
-
- var htmlStr = '';
- htmlStr += '<div class="indent"><table width="100%" title="部分在馆书籍">';
- htmlStr += '<thead><tr style="border-bottom:1px solid #CCC;">'
- + '<td width=30%> 索 书 号</td><td width=70%>馆藏地点</td>'
- + '</tr></thead><tbody>';
- for (var i = 0; i < libLocs.length; i++) {
- // extract Name, remove the first '
- var subLibName = locs[i].match(/["'].*?\s/ig)[0].substr(1).trim();
- if (fDebug) console.log('subLib: ' + subLibName);
- // extract the 索书号信息行
- var shelfLocs = libLocs[i].match(/<tr><td>.*?<\/td><\/tr>/igm);
- //libLocs[i].match(/<tr><td>[0-9]+.*?<\/td><\/tr>/igm);
-
- if (fDebug) console.log('shelfLocs: ' + shelfLocs + ', len: ' + shelfLocs.length);
- var callNoArr = new Array();
- for (var j = 0; j < shelfLocs.length; j++) {
- // extract the 索书号, 馆内位置
- try{
- var shelfLocArr = shelfLocs[j].match(/<td>.*?<\/td>/igm);
- var callNoStr = shelfLocArr[1];
- var shelfLocStr = shelfLocArr[2];
- // 4 = "<td>".length, 5 = "</td>".length
- callNoStr = callNoStr.substring(4, callNoStr.length-5);
- shelfLocStr = shelfLocStr.substring(4, shelfLocStr.length-5).trim();
- if (fDebug) console.log('callNo : ' + callNoStr + ', loc: ' + shelfLocStr);
-
- // 索 书 号+馆藏地点 相同的不重复显示
- if (callNoArr.indexOf(callNoStr + shelfLocStr) == -1) {
- callNoArr.push(callNoStr + shelfLocStr);
-
- htmlStr += '<tr style="border-bottom:1px dashed #DDDDDD;"><td>' + callNoStr + '</td><td>';
- htmlStr += shelfLocStr + '</td></tr>';
- }
- } catch(ex) {
- console.log('failed to parse callNo, shelfLoc, subLibName, ' + ex.message);
- }
- }
- } // end libLocs
-
- htmlStr += '</tbody></table></div>';
-
- return htmlStr;
- }
-
- function getDoubanBookTitle() {
- // get book title
- title = $('h1 span').text();
- }
-
- function getDoubanBookIsbn() {
- // get book isbn
- try
- {
- var liTxt = null;
- $("#info span.pl").each(function(){
- liTxt = $(this).text();
- if (fDebug) console.log('lib book attr txt:' + liTxt);
- if (liTxt == 'ISBN:' && $(this)[0].nextSibling != null){
- isbn = $(this)[0].nextSibling.nodeValue.trim();
- if (fDebug) console.log('book isbn txt: [' + isbn + ']');
- }
- });
- } catch(ex) {
- console.log('In getDoubanBookIsbn, exception: ' + ex.message);
- }
- isbn10 = getIsbn10();
- if (fDebug) console.log("book isbn10: \'" + isbn10 + "\'");
- }
-
- function appendTitleLink_Loading(){
- var htmlStr = '';
- htmlStr += '<div id="libArea">' + getLibHeadHtml();
- htmlStr += '<div id="libInfo"><div class="indent">'
- + LIBSEARCH_LINK_PRE + ' href="' + getLibTitleUrl(title)
- + '" >' + LIBSEARCH_LINK_SUF;
-
- if (!isEmptyStr(isbn)) {
- htmlStr += '<ul id="libLoading">' + HTML_LOADING + '</ul>';
- }
- htmlStr += '</div></div></div>';
- $('.aside').prepend(htmlStr);
- setLibMemberStyle();
- }
-
- function queryLibByIsbn(vIsbn){
- if (fDebug) console.log("url : " + getLibIsbnUrl(vIsbn));
-
- var cacheInfo = GM_getValue(vIsbn);
- if (!cacheInfo && isbn10) {
- if (fDebug) console.log("check cache for isbn10 also ");
- cacheInfo = GM_getValue(isbn10);
- }
- if (cacheInfo) {
- var bookInfo = JSON.parse(cacheInfo);
- // '{"bookRecNo":' + bookRecNo + ', "hasMore":'+ fMore + ', "reservable":' + fHasReservable + ', "expressable":' + fHasExpress + '}';
- var bookRecNo = bookInfo['bookRecNo'];
- var fMore = bookInfo['hasMore'];
- var fReservable = bookInfo['reservable'];
- var fHasExpress = bookInfo['expressable'];
- if (fDebug) console.log(vIsbn + " cached, bookRecNo:" + bookRecNo + ", hasMore:" + fMore + ", reservable:" + fReservable + ", expressable:" + fHasExpress);
- appendLibBookHtml(bookRecNo, fMore, fReservable, fHasExpress);
- return ;
- }
-
- GM_xmlhttpRequest({
- method: 'GET',
- url: getLibIsbnUrl(vIsbn),
- headers: {
- 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
- },
- //onload: loadLibInfo
- onload: function(res) {
- var respTxt = res.responseText;
- if (fDebug) console.log("respTxt : " + respTxt);
-
- // shenzhenLib search result page will contains below string
- // if the isbn search find any books
- // parse string: &metaidList=1086672,962940,400742,70483,1184921,'
- var idstr = respTxt.match(/\&metaidList=.*?,\'/igm);
- if (fDebug) console.log("found metaids : " + idstr);
- var found = (idstr != null );
- if (found ) {
- // parse bookRecNos
- var bookRecNos = idstr[0].match(/\d+/g);
- isbn = vIsbn; // the value might be isbn10
- appendLibBookInfo(bookRecNos);
- } else {
- if (vIsbn.length == 13) {
- if (fDebug) console.log('try another value again');
- //setTimeout(function(){
- // appendLibInfoByIsbn10(vIsbn);
- //}, 20);
- if (isbn10) {
- queryLibByIsbn(isbn10);
- } else {
- $('#libLoading').remove();
- }
- } else {
- $('#libLoading').remove();
- }
- }
- }
- });
- }
-
- function appendLibInfoByIsbn10(isbn13){
- GM_xmlhttpRequest({
- method: 'GET',
- url: 'http://api.douban.com/book/subject/isbn/' + isbn13 + '?alt=json',
- headers: {
- 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
- },
- onload: function(res) {
- var isbn10 = null;
- var jsonObj = JSON.parse(res.responseText);
-
- var propArr = jsonObj['db:attribute'];
- for (var i = 0; i < propArr.length; i++) {
- if (fDebug) console.log("name: " + propArr[i]['@name']);
- if (fDebug) console.log("val : " + propArr[i]['$t']);
- if (propArr[i]['@name'] == 'isbn10') {
- isbn10 = propArr[i]['$t'];
- break;
- }
- }
-
- if (isbn10 != null && isbn10.length == 10) {
- queryLibByIsbn(isbn10);
- } else {
- $('#libLoading').remove();
- }
- }
- });
- }
-
- function getIsbn10() {
- var isbn10 = null;
- var borrowDiv = document.getElementById("borrowinfo");
- // div -> ul -> li -> a
- if (borrowDiv ) {
- if (borrowDiv.children[1] && borrowDiv.children[1].children[0]
- && borrowDiv.children[1].children[0].children[0]) {
- var libLink = borrowDiv.children[1].children[0].children[0].href;
- if (fDebug) console.log('libLink: ' + libLink);
- var m = libLink.match(/&subject=.*&type=/igm);
- if (m) {
- isbn10 = m[0];
- isbn10 = isbn10.substring("&subject=".length, isbn10.length - "&type=".length);
- if (fDebug) console.log('isbn10: ' + isbn10);
- return isbn10;
- }
- }
- }
- }
-
- /**
- * append the library link to douban book page
- * a) if the lib isbn query return books, the link is the first book page;
- * b) if the query results has more than one book, add query result link
- * c) if the first ten books has preservable book, set it as the book link
- * d) otherwise append title query link of Shenzhen Library
- */
- function appendLibraryLink() {
-
- title = null;
- isbn = null;
-
- getDoubanBookTitle();
- if (fDebug) console.log("book title: \'" + title + "\'");
- getDoubanBookIsbn();
- if (fDebug) console.log("book isbn: \'" + isbn + "\'");
- // it might not be book page, or douban changed the page structure
- if (isEmptyStr(title) && isEmptyStr(isbn) )
- return ;
-
- appendTitleLink_Loading();
-
- if (!isEmptyStr(isbn)) {
- // query library, append link to library
- setTimeout(function(){
- queryLibByIsbn(isbn);
- }, 200); // end of setTimeout
- }
- } // end of appendLibraryLink()
-
-
- function getLibBookTitle() {
- title = $('h3 a').text();
- }
-
- function getLibBookIsbn() {
- // get book isbn
- try
- {
- var liTxt = null;
- $("div.righttop ul li").each(function(){
- liTxt = $(this).text();
- if (fDebug) console.log('lib book attr txt:' + liTxt);
- //if ($(this).text() == 'ISBN' && $(this)[0].nextSibling != null)
- if (liTxt.indexOf('ISBN') == 0 && liTxt.length > 5) { // 5='ISBN:'.length
- //isbn = $(this)[0].nextSibling.nodeValue.trim();
- isbn = liTxt.substring(5).trim();
- if (fDebug) console.log('lib book isbn txt:' + isbn);
- isbn = isbn.replace(/-/g, '').substr(0,13);
- if (fDebug) console.log('lib book isbn:' + isbn);
- }
- });
- } catch(ex) {
- console.log('In getLibBookIsbn, exception: ' + ex.message);
- }
- }
-
- function appendDoubanTitleSearchLink() {
- if (isEmptyStr(title))
- return ;
-
- var htmlStr = '<li>在豆瓣:';
- htmlStr += getDoubanSearchLink(title) + '</li>';
- if (fDebug) console.log("book query url: " + htmlStr);
- $("div.righttop ul").append(htmlStr);
- }
-
- function appendDoubanBookLink(score, bookLink, pageCt) {
- var htmlStr = '<li>在豆瓣:';
- htmlStr += '<a href="' + bookLink + '" target="_blank" title="点击前往豆瓣查看评论">到豆瓣查看评论';
- if (score != null && !isNaN(score) && score > 0) {
- htmlStr += ' (评分: ' + score + ')';
- }
- htmlStr += '</a></li>';
- if (pageCt != null && !isNaN(pageCt) && pageCt > 0) {
- htmlStr += '<li>页数:'+ pageCt + '</li>';
- }
-
- if (fDebug) console.log("book query url: " + htmlStr);
-
- $("div.righttop ul").append(htmlStr);
- }
-
- // append link to douban book
- function appendDoubanLink() {
-
- title = null;
- isbn = null;
-
- if (fDebug) console.log('lib bookpage append link to douban book: ');
- getLibBookTitle();
- if (fDebug) console.log("book title: \'" + title + "\'");
- getLibBookIsbn();
- if (fDebug) console.log("book isbn: \'" + isbn + "\'");
- // it might not be lib book page, or shenzhen Lib changed the page structure
- if (isEmptyStr(title) && isEmptyStr(isbn) )
- return ;
-
- if (!isEmptyStr(isbn)) {
- //var doubanUrl = 'http://book.douban.com/isbn/' + isbn + '/';
- var doubanUrl = 'http://api.douban.com/book/subject/isbn/' + isbn + '?alt=json';
- setTimeout(function(){GM_xmlhttpRequest({
- method: 'GET',
- url: doubanUrl ,
- headers: {
- 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
- },
- onload: function(res) {
- try {
- var jsonObj = JSON.parse(res.responseText);
-
- var score = jsonObj['gd:rating']['@average'];
- var bookLink = jsonObj['link'][1]['@href'];
- var dbAttrs = jsonObj['db:attribute'];
- var pageCt = 0;
- for (var i = 0; i < dbAttrs.length; i++)
- {
- if (fDebug) console.log("attr: " + dbAttrs[i]['$t']);
- if (dbAttrs[i]['@name'] == 'pages') {
- pageCt = dbAttrs[i]['$t'];
- if (fDebug) console.log("pages: " + pageCt);
- }
- }
- if (fDebug) console.log("score: " + score);
-
- appendDoubanBookLink(score, bookLink, pageCt);
- } catch(ex) {//SyntaxError
- if (fDebug) console.log("respTxt: " + res.responseText);
- // no such book, responseText is not a valid json str
- appendDoubanTitleSearchLink();
- }
- }
- })}, 20); // end of setTimeout
- } else {
- appendDoubanTitleSearchLink();
- }
-
- } // end of appendDoubanLink()
-
-
- function appendLibraryInSearchPage() {
- var keyword = $(":text").val();
- keyword = keyword.replace(/-/g, '');
- if (fDebug) console.log('keyword: [' + keyword + ']');
- if (isEmptyStr(keyword))
- return ;
-
- var htmlStr =
- '<h2><span class="">图书馆搜索</span> · · · · · · </h2>'
- + '<p class="p1">' + LIBSEARCH_LINK_PRE
- + ' href="' + getLibTitleUrl(keyword)
- + '" >> '+ LIBSEARCH_LINK_SUF + '</p>';
-
- $(".aside h2:last").before(htmlStr);
- }
-
- function appendDoubanInSearchPage() {
-
- try
- {
- var keyword = $("span.fbold").text();
- if (isEmptyStr(keyword))
- return ;
- if (fDebug) console.log('keyword: [' + keyword + ']');
-
- var rsltSearchBtn = $("div.books_sel input:last");
- if (fDebug) console.log('find search in result button');
- var dbSearchBtn = rsltSearchBtn.clone();
- var dbSearchUrl = getDoubanSearchUrl(keyword);
- if (fDebug) console.log('copy it, new dbSearchBtn, dbSearchUrl: ' + dbSearchUrl);
- dbSearchBtn.attr('value','在豆瓣搜索');
- dbSearchBtn.attr('onclick', null);
- dbSearchBtn.click(function() {window.open(dbSearchUrl);});
-
- if (fDebug) console.log('created douban search button');
- $("div.books_sel").append(dbSearchBtn);
- } catch(ex) {
- console.log('In Library search page, exception: ' + ex.message);
- console.log('In Library search page, cannot find keyword, page struct may changed');
- }
- }
-
- function appendListBooksLibLink() {
- // eg, book.douban.com/doulist/232705/ (div.pl2 a),
- // book.douban.com/doulist/531890/ (div.title a),
-
- var fChecked = false;
- $('div.article table').each(function(){
- var keyword = '';
- if (!fChecked) {
- fChecked = true;
- GM_addStyle(".libSearch{\
- float:left;display: inline-block;\
- background: #eef9eb;border: 1px solid #2F7B4B;\
- padding: 1px 10px;border-radius:3px;margin-right: 8px;}\
- ");
- if (fDebug) console.log(' tag/doulist 1: fChecked[' + fChecked + '] ');
- }
-
- keyword = $('div.pl2 a', this).text();
- if (isEmptyStr(keyword))
- return ;
- keyword = keyword.trim();
- if (fDebug) console.log(' tag/doulist page: [' + keyword + ']');
-
- var htmlStr = LIBSEARCH_LINK_PRE +
- ' class="libSearch" href="' + getLibTitleUrl(keyword)
- + '" >' + LIBSEARCH_LINK_SUF;
- $('td > span.rr', this).append(htmlStr);
- });
- }
-
- function appendTagBooksLibLink() {
- // eg, book.douban.com/tag/web , book.douban.com/people/qibadao/collect
- // book.douban.com/chart
-
- $('div.article ul li').each(function(){
- var keyword = '';
- keyword = $('h2 a', this).text();
-
- if (isEmptyStr(keyword))
- return ;
- keyword = keyword.trim();
- if (fDebug) console.log(' tag page: [' + keyword + ']');
-
- var htmlStr = LIBSEARCH_LINK_PRE
- + ' class="j a_add2cart add2cart" href="'
- + getLibTitleUrl(keyword) + '">' + LIBSEARCH_LINK_SUF;
- $('span.cart-info span', this).first().append(htmlStr);
- });
- }
-
-
- (function() {
-
- var thisScript = {
- name: "douban_shenzhenLib",
- id: "116332",
- version:"1.24.10"
- };
-
- if (typeof(Updater)!='undefined') {
- var updater = new Updater(thisScript);
- updater.check(24);
- }
-
- if (fDebug) console.log('url host:' + document.URL);
-
- var vUrl = document.URL;
- if (vUrl.indexOf("douban.com/subject/") > 0) {
- if (fDebug) console.log('in douban page');
- appendLibraryLink();
- } else if (vUrl.indexOf("douban.com/subject_search") > 0) {
- appendLibraryInSearchPage();
- } else if (vUrl.indexOf("/Search/searchdetail.jsp") > 0) {
- if (fDebug) console.log('in shenzhen library page');
- appendDoubanLink();
- } else if (vUrl.indexOf("/Search/searchshow.jsp") > 0) {
- appendDoubanInSearchPage();
- } else if(vUrl.indexOf('/top250') > 0
- || vUrl.indexOf('/doulist/') > 0) {
- appendListBooksLibLink();
- } else if (vUrl.indexOf('/tag/') > 0
- || /\/people\/.+\/collect/.test(vUrl) || /\/chart(.*)$/.test(vUrl)) {
- appendTagBooksLibLink();
- }
- })();
复制代码
|