您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
Show book available info in douban book page, show book's douban score in Shenzhen Library book page
当前为
// ==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(); } })();