Board logo

标题: 80元求网页脚本 [打印本页]

作者: lxh623    时间: 2019-9-11 09:54     标题: 80元求网页脚本

本帖最后由 lxh623 于 2019-9-14 17:58 编辑

游览器有个插件tampermonkey,可以加载脚本。现有脚本“读秀超星电子书获取插件”等等。脚本网站是https://greasyfork.org/zh-CN/scripts?q=掌阅,可以搜索、安装。
我想有个脚本可以在读秀搜索结果页面加入添加书籍在豆瓣的评分,链接。每页结果那里可能十本或者五十本书。比如,豆瓣 9.0 。前面两个字“豆瓣”带有该图书的豆瓣链接。
对于电脑专业的也许不难吧。

谢谢!
作者: Batcher    时间: 2019-9-11 10:02

现有脚本是用什么语言写的?发出来看看
作者: lxh623    时间: 2019-9-11 10:42

深圳图书馆图书信息豆瓣脚本,这个失效了。
  1. // ==UserScript==
  2. // @name            douban_shenzhenLib
  3. // @name:zh-CN      深圳图书馆图书信息豆瓣脚本
  4. // @namespace       http://www.douban.com/note/180166013/
  5. // @description     Show book available info in douban book page, show book's douban score in Shenzhen Library book page
  6. // @description:zh-cn  为豆瓣书籍页面(book.douban.com)添加书籍在深圳图书馆的信息,预借链接,为深圳图书馆书籍信息页面添加书籍在豆瓣的评分,链接
  7. // @license         MIT License
  8. // @supportURL      http://www.douban.com/note/180166013/
  9. // @version         1.24.10
  10. // @require         http://code.jquery.com/jquery-1.4.4.min.js
  11. // @include         http://book.douban.com/*
  12. // @include         https://book.douban.com/*
  13. // @include         https://www.douban.com/doulist/*
  14. // @include         https://www.szlib.org.cn/Search/searchdetail.jsp*
  15. // @include         https://www.szlib.org.cn/Search/searchshow.jsp*
  16. // @include         http://opac.nslib.cn/Search/searchdetail.jsp*
  17. // @include         http://opac.nslib.cn/Search/searchshow.jsp*
  18. // @include         https://www.szln.gov.cn/Search/searchdetail.jsp*
  19. // @include         https://www.szln.gov.cn/Search/searchshow.jsp*
  20. // @include         http://218.17.147.50/Search/searchdetail.jsp*
  21. // @include         http://218.17.147.50/Search/searchshow.jsp*
  22. // @grant           GM_addStyle
  23. // @grant           GM_xmlhttpRequest
  24. // @grant           GM_registerMenuCommand
  25. // @grant           GM_getValue
  26. // @grant           GM_setValue
  27. // @author          morningSky
  28. // @refer           books_recommend_THU, bean vine (49911) and others...
  29. // @updateDate      2019-03-25
  30. /* @reason
  31. 1. 深圳图书馆查询url变更, sortfield=ptitle
  32. 2. 减少加载时间:缓存图书的索书号,是否有多本,可预借,可快递。在馆信息还是需要查询图书馆网站
  33. 3. 豆瓣api只对企业开放,个人用户不提供key,修改为在html中解析isbn10
  34. Firefox Greasemonkey v4.0及之后版本修改了API,这个脚本失效了;请用tampermonkey插件,需要再次安装这个脚本。
  35. 争取找时间修改脚本,使其适用于新版的Greasemonkey插件————可能tampermonkey插件后续也会修改API,导致脚本失效。
  36. @end*/
  37. //
  38. // ==/UserScript==
  39. /*
  40. * opac.nslib.cn 南山,szln.gov.cn 盐田,218.17.147.50 龙岗
  41. */
  42. var fDebug = false;
  43. var title, isbn, isbn10;
  44. var SZLIB_HOST = 'https://www.szlib.org.cn/';
  45. var LIBOPAC_URL = SZLIB_HOST + 'Search/searchshow.jsp?v_tablearray=bibliosm,serbibm,apabibibm,mmbibm,&v_book=on&sortfield=ptitle&sorttype=desc&pageNum=10';
  46. // 查询索书号
  47. var LIBOPAC_URL_CALLNO = SZLIB_HOST + 'Search/getpreholding.jsp?v_curtable=bibliosm&v_recno=';
  48. var LIBBOOK_URL = SZLIB_HOST + 'Search/searchdetail.jsp?v_tablearray=bibliosm&v_curtable=bibliosm&site=null&v_recno=';
  49. var LIBQRYRESERVABLE_URL = SZLIB_HOST + 'Search/getpreLoan.jsp?';
  50. var LIBRESERVE_URL = SZLIB_HOST + 'MyLibrary/Reader-Access.jsp?destPage=ReserveSubmit.jsp&v_tablearray=bibliosm&v_TableName=80000002&v_recno=';
  51. 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=';
  52. var HTML_LOADING = '<font color="grey">正在查询图书馆馆藏情况&nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;·&nbsp;· </font>';
  53. var LIBSEARCH_LINK_PRE = '<a title="点击前往图书馆搜索" target="_blank" ';
  54. var LIBSEARCH_LINK_SUF = '在深圳图书馆搜索</a>';
  55. //if(typeof isChromeExtension == 'undefined'){
  56. // init();
  57. //}else{
  58. // function onReadyGM(){
  59. // init();
  60. // };
  61. //};
  62. // main body of the script
  63. function isEmptyStr(vStr) {
  64. return vStr == null || vStr.length == 0 || /^\s*$/.test(vStr);
  65. }
  66. function getLibIsbnUrl(vIsbn) {
  67.     return LIBOPAC_URL + '&v_index=isbn&v_value=' + vIsbn;
  68. }
  69. function getLibTitleUrl(vTitle) {
  70.     return LIBOPAC_URL + '&v_index=title&v_value=' + encodeURIComponent(vTitle);
  71. }
  72. function getDoubanSearchUrl(keyword) {
  73.     return 'http://book.douban.com/subject_search?cat=1001&cat=&search_text=' + encodeURIComponent(keyword);
  74. }
  75. function getDoubanSearchLink(keyword) {
  76.     return '<a target="_blank" href="' + getDoubanSearchUrl(keyword) + '" title="点击前往豆瓣查询这本书">在豆瓣搜索</a>';
  77. }
  78. function getLibHeadHtml() {
  79.     var htmlStr = '<ul>';
  80.     // http://www.szln.gov.cn/lib/library.do  
  81.     /*htmlStr += '<li><a style="float:right" target="_blank"  href="http://www.szlib.gov.cn">深圳图书馆</a></li>';*/
  82.     //<span class="membArrow">&nbsp;</span>
  83.     htmlStr += '<li><div class="libMem">';
  84.     htmlStr += '<a class="libMemLink" href="#more" >成员馆</a>';
  85.     htmlStr += '<ul class="libMemMenu">';
  86.     htmlStr += '<li><a href="http://www.szlib.org.cn" target="_blank" title="深圳图书馆">深圳图书馆</a></li>';
  87.     htmlStr += '<li><a href="http://www.szclib.org.cn/" target="_blank" title="深圳少年儿童图书馆">少年儿童图书馆</a></li>';
  88.     htmlStr += '<li><a href="http://lib.utsz.edu.cn/" target="_blank" title="深圳市科技图书馆">科技图书馆</a></li>';
  89.     htmlStr += '<li><a href="http://www.szlhlib.com.cn/" target="_blank" title="深圳市罗湖区图书馆">罗湖区图书馆</a></li>';
  90.     htmlStr += '<li><a href="http://www.szftlib.com.cn/" target="_blank" title="深圳市福田区图书馆">福田区图书馆</a></li>';
  91.     htmlStr += '<li><a href="http://www.sznslib.com.cn" target="_blank" title="深圳市南山区图书馆">南山区图书馆</a></li>';
  92.     htmlStr += '<li><a href="http://www.szytlib.cn/" target="_blank" title="深圳市盐田区图书馆">盐田区图书馆</a></li>';
  93.     htmlStr += '<li><a href="http://www.balib.com.cn" target="_blank" title="深圳市宝安区图书馆">宝安区图书馆</a></li>';
  94.     htmlStr += '<li><a href="http://www.szlglib.com.cn/" target="_blank" title="深圳市龙岗图书馆">龙岗图书馆</a></li>';
  95.     htmlStr += '</ul></div></li>';
  96.     htmlStr += '<li><h2>在深圳图书馆借阅  ·  ·  ·  ·  ·  · </h2></li>';
  97.     htmlStr += '</ul>';
  98.    
  99.     return htmlStr;
  100. }
  101. function setLibMemberStyle() {
  102.     GM_addStyle('\
  103.         #libInfo {\
  104.             overflow: visible;\
  105.         }\
  106.         .libMem {\
  107.             z-index: 97;\
  108.             position: relative;\
  109.             float: right;\
  110.         }\
  111.         .libMemMenu {\
  112.             position: absolute;\
  113.             top: -5px;\
  114.             left: 0px;\
  115.             visibility: hidden;\
  116.         }\
  117.         .libMem a {\
  118.             -moz-border-radius: 7px;\
  119.             -webkit-border-radius: 7px;\
  120.             border-radius: 7px;\
  121.             display: block;\
  122.             background: #f6f6f1;\
  123.             padding: 5px;\
  124.             width: 90px;\
  125.             line-height: 160%;\
  126.             border: 1px solid #fff;\
  127.         }\
  128.         .libMem a:hover {\
  129.             background: #FFF;\
  130.             border: 1px solid #aaa;\
  131.             color: #000;\
  132.         }\
  133.         .libMem:hover .libMemMenu {\
  134.             visibility: visible;\
  135.         }\
  136.         .libMem .libMemLink {\
  137.             border: 1px solid #aaa;\
  138.             line-height: 100%;\
  139.             width: 90px;\
  140.         }\
  141.     ');
  142. }
  143. // getpreLoan.jsp?tableList=bibliosm,bibliosm,bibliosm,&metaidList=934991,1209378,698561,
  144. function getReservableQryUrl(bookRecNos) {
  145.     var qryParam = 'tableList=';
  146.     for (var i = 0; i < bookRecNos.length; i++) {
  147.         qryParam += 'bibliosm,';
  148.     }
  149.     // array.toString: arr[0],arr[1],...
  150.     qryParam += '&metaidList=' + bookRecNos + ',';
  151.     if (fDebug)  console.log('Reservable qryUrl: ' + LIBQRYRESERVABLE_URL + qryParam);
  152.     return LIBQRYRESERVABLE_URL + qryParam;
  153. }
  154. /*
  155. * Append the book link, search link, preserve link, call no with location info
  156. *
  157. * @param bookRecNos is an Array
  158. * The reservable query return a xml:
  159. * <root><preloan no='0'>true</preloan><preloan no='1'>false</preloan></root>
  160. */
  161. function appendLibBookInfo(bookRecNos) {
  162.     if (bookRecNos == null || bookRecNos.length == 0)
  163.         return ;
  164.    
  165.     var fMore = (bookRecNos.length > 1);
  166.     var bookRecNo = bookRecNos[0];// set the first book as default
  167.     var reservableQry_url = getReservableQryUrl(bookRecNos);
  168.    
  169.     GM_xmlhttpRequest({
  170.         method: 'GET',
  171.         url: reservableQry_url,
  172.         headers: {
  173.             'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
  174.             "Accept": "text/xml"
  175.         },
  176.         onload: function(res) {
  177.             // the reservable query return is a xml document
  178.             var fHasReservable = false;
  179.             
  180.             if (fDebug)  console.log('preloan xml: ' + res.responseText);
  181.             var xmldata = new DOMParser().parseFromString(res.responseText, "text/xml");
  182.             
  183.             if (fDebug)  console.log('preloan xml: ' + xmldata);
  184.             var preloans = xmldata.getElementsByTagName('preloan');
  185.             for (var i = 0; i < preloans.length;i++) {
  186.                 if (fDebug)  console.log('preloan : ' + i + ',  ' + preloans[i].childNodes[0].nodeValue);
  187.                 if (preloans[i].childNodes[0].nodeValue == 'true') {
  188.                     bookRecNo = bookRecNos[i];
  189.                     fHasReservable  = true;
  190.                     break;
  191.                 }
  192.             }
  193.             var fHasExpress = false;
  194.             var exps = xmldata.getElementsByTagName('express');
  195.             for (var j = 0; j < exps.length; j++) {
  196.                 if (exps[j].childNodes[0].nodeValue == 'true') {
  197.                     fHasExpress = true;
  198.                     break;
  199.                 }
  200.             }
  201.             var cacheInfo = '{"bookRecNo":"' + bookRecNo + '", "hasMore":"'+ fMore + '", "reservable":"' + fHasReservable + '", "expressable":"' + fHasExpress + '"}';
  202.             GM_setValue(isbn, cacheInfo);
  203.             appendLibBookHtml(bookRecNo, fMore, fHasReservable, fHasExpress);
  204.         } // end function(res)
  205.     }
  206.     );  
  207.    
  208. } // end appendLibBookInfo
  209. function appendLibBookHtml(bookRecNo, fMore, fHasReservable, fHasExpress) {
  210.     if (fDebug)  console.log('book recNo: ' + bookRecNo + ', fHasReservable: ' + fHasReservable + ', fHasExpress:' + fHasExpress);
  211.    
  212.     var book_url = LIBBOOK_URL + bookRecNo;
  213.     var htmlStr = '';
  214.     htmlStr += '<ul id="libLinks" class="bs" >';//<div class="indent">
  215.     htmlStr += '<li style="border:none"><a id=libBookLink href="' + book_url;
  216.     //title="点击前往图书馆查看"
  217.     htmlStr += '" target="_blank" >到深圳图书馆查看本书</a>';
  218.     if (fMore) {
  219.         htmlStr += '<a class="rr" href="' + getLibIsbnUrl(isbn);
  220.         htmlStr += '" target="_blank" title="查看所有搜索结果">更多. . .</a>';
  221.     }
  222.     htmlStr += '</li>';
  223.     if (fHasReservable || fHasExpress) {
  224.         htmlStr += '<li style="border:none">';
  225.         if (fHasReservable) {
  226.             htmlStr += '<a class="collect_btn colbutt ll" href="';
  227.             htmlStr += LIBRESERVE_URL + bookRecNo;
  228.             htmlStr += '" target="_blank" title="登陆我的图书馆办理预借登记"><span >预借登记</span></a>';
  229.         }
  230.         if (fHasExpress) {
  231.             htmlStr += (fHasReservable ? '&nbsp;&nbsp;' : '');
  232.             htmlStr += '<a class="collect_btn colbutt ll" href="';
  233.             htmlStr += LIB_EXPRESS_URL + isbn;
  234.             htmlStr += '" target="_blank" title="登陆我的图书馆办理快递到家"><span >快递到家</span></a>';
  235.         }
  236.         htmlStr += '</li>';
  237.     }
  238.    
  239.     htmlStr += '</ul>'; //</div></div>
  240.     $("#libInfo").html(htmlStr);
  241.    
  242.     appendBookCallNumbers(bookRecNo);
  243. }
  244. /**
  245. * 解析索书号没有使用xml解析,使用正则表达式解析
  246. *
  247. * 添加索书号,位置信息,查询url返回html字符串,每个馆藏一个div,结构如下
  248. * <div class='tab_2_title'><a title='深圳图书馆 (1)'>深圳图书馆 (1)</a>...</div>
  249. * <div class="tab_2_show">
  250. * <div class="tab_2_text">
  251. *   <h3 class='title'>可外借馆藏</h3>
  252. *   <table >
  253. *     <thead><tr><td>条码号</td><td>索书号</td><td>所在地点</td></tr></thead>
  254. *     <tbody>
  255. *       <tr><td>04400511016054</td><td>K825.4/1023</td><td>深图中文图书借阅区(3楼)</td></tr>
  256. *       ...
  257. *     </tbody>
  258. *   </table>
  259. *   <h3 class='title'>可阅览馆藏</h3>
  260. *   <table >...</table>
  261. * </div>
  262. * ...
  263. * </div>
  264. *
  265. * 条码号可能是字母开头
  266. * <tr><td>F4401001057643</td><td>K825.1=72/6</td><td>大学城中文图书</td></tr>
  267. */
  268. function appendBookCallNumbers(bookRecNo) {
  269.     if (bookRecNo == -1)
  270.         return ;
  271.    
  272.     var qryCallNoUrl = LIBOPAC_URL_CALLNO + bookRecNo;
  273.     if (fDebug)  console.log('qryCallNoUrl: ' + qryCallNoUrl);
  274.    
  275.     GM_xmlhttpRequest({
  276.         method: 'GET',
  277.         url: qryCallNoUrl,
  278.         headers: {
  279.             'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey'
  280.         },
  281.         onload: function(res) {
  282.             if (fDebug)  console.log('res: ' + res.responseText);
  283.             var respTxt = res.responseText;
  284.             // extract the 图书馆分馆名称
  285.             var locs    = null;
  286.             var libLocs = null;
  287.             try
  288.             {
  289.                 locs = respTxt.match(/\s+title=["']?.*?["']/igm);
  290.                 if (fDebug)  console.log('locs: ' + locs + ', len: ' + locs.length);
  291.                 libLocs = respTxt.match(/<div\sclass=["']?tab_2_text["']?.*?<\/div>/igm);
  292.                 if (fDebug)  console.log('libLocs: ' + libLocs + ', len: ' + libLocs.length);
  293.             } catch (ex) {
  294.                 console.log('book callNo parse has exception, ' + ex.message);
  295.             }
  296.             
  297.             var htmlStr = getBookCallNumberHtml(locs, libLocs);
  298.             if (fDebug)  console.log('call No html: ' + htmlStr);
  299.             
  300.             if (!isEmptyStr(htmlStr))
  301.                 $("#libInfo").append(htmlStr);
  302.         } // end function(res)
  303.     });
  304.    
  305. } // end appendBookCallNumber
  306. function getBookCallNumberHtml(locs, libLocs) {
  307.     if (locs == null || libLocs == null)
  308.         return '<div class="indent"></div>';
  309.    
  310.     var htmlStr = '';
  311.     htmlStr += '<div class="indent"><table width="100%" title="部分在馆书籍">';
  312.     htmlStr += '<thead><tr style="border-bottom:1px solid #CCC;">'
  313.       + '<td width=30%>&nbsp;索 书 号</td><td width=70%>馆藏地点</td>'
  314.       + '</tr></thead><tbody>';
  315.     for (var i = 0; i < libLocs.length; i++) {
  316.         // extract Name, remove the first '
  317.         var subLibName = locs[i].match(/["'].*?\s/ig)[0].substr(1).trim();
  318.         if (fDebug)  console.log('subLib: ' + subLibName);
  319.         // extract the 索书号信息行
  320.         var shelfLocs = libLocs[i].match(/<tr><td>.*?<\/td><\/tr>/igm);
  321.         //libLocs[i].match(/<tr><td>[0-9]+.*?<\/td><\/tr>/igm);
  322.         
  323.         if (fDebug)  console.log('shelfLocs: ' + shelfLocs + ', len: ' + shelfLocs.length);
  324.         var callNoArr = new Array();
  325.         for (var j = 0; j < shelfLocs.length; j++) {
  326.             // extract the 索书号, 馆内位置
  327.             try{
  328.                 var shelfLocArr = shelfLocs[j].match(/<td>.*?<\/td>/igm);
  329.                 var callNoStr = shelfLocArr[1];
  330.                 var shelfLocStr = shelfLocArr[2];
  331.                 // 4 = "<td>".length, 5 = "</td>".length
  332.                 callNoStr = callNoStr.substring(4, callNoStr.length-5);
  333.                 shelfLocStr = shelfLocStr.substring(4, shelfLocStr.length-5).trim();
  334.                 if (fDebug)  console.log('callNo : ' + callNoStr + ', loc: ' + shelfLocStr);
  335.                
  336.                 // 索 书 号+馆藏地点 相同的不重复显示
  337.                 if (callNoArr.indexOf(callNoStr + shelfLocStr) == -1) {
  338.                     callNoArr.push(callNoStr + shelfLocStr);
  339.                     htmlStr += '<tr style="border-bottom:1px dashed #DDDDDD;"><td>' + callNoStr + '</td><td>';
  340.                     htmlStr += shelfLocStr + '</td></tr>';
  341.                 }
  342.             } catch(ex) {
  343.                 console.log('failed to parse callNo, shelfLoc, subLibName, ' + ex.message);
  344.             }
  345.         }
  346.     } // end libLocs
  347.    
  348.     htmlStr += '</tbody></table></div>';
  349.    
  350.     return htmlStr;
  351. }
  352. function getDoubanBookTitle() {
  353.     // get book title
  354.     title = $('h1 span').text();
  355. }
  356. function getDoubanBookIsbn() {
  357.     // get book isbn  
  358.     try
  359.     {
  360.         var liTxt = null;
  361.         $("#info span.pl").each(function(){
  362.             liTxt = $(this).text();
  363.             if (fDebug)  console.log('lib book attr txt:' + liTxt);
  364.             if (liTxt == 'ISBN:' && $(this)[0].nextSibling != null){
  365.                 isbn = $(this)[0].nextSibling.nodeValue.trim();
  366.                 if (fDebug)  console.log('book isbn txt: [' + isbn + ']');
  367.             }
  368.         });
  369.     } catch(ex) {
  370.         console.log('In getDoubanBookIsbn, exception: ' + ex.message);
  371.     }
  372.     isbn10 = getIsbn10();
  373.     if (fDebug)  console.log("book isbn10: \'" + isbn10 + "\'");
  374. }
  375. function appendTitleLink_Loading(){
  376.     var htmlStr = '';
  377.     htmlStr += '<div id="libArea">' + getLibHeadHtml();
  378.     htmlStr += '<div id="libInfo"><div class="indent">'
  379.       + LIBSEARCH_LINK_PRE + ' href="' + getLibTitleUrl(title)
  380.       + '" >' + LIBSEARCH_LINK_SUF;
  381.    
  382.     if (!isEmptyStr(isbn)) {
  383.         htmlStr += '<ul id="libLoading">' + HTML_LOADING + '</ul>';
  384.     }
  385.     htmlStr += '</div></div></div>';
  386.     $('.aside').prepend(htmlStr);
  387.     setLibMemberStyle();
  388. }
  389. function queryLibByIsbn(vIsbn){
  390.     if (fDebug)  console.log("url : " + getLibIsbnUrl(vIsbn));
  391.     var cacheInfo = GM_getValue(vIsbn);
  392.     if (!cacheInfo && isbn10) {
  393.         if (fDebug)  console.log("check cache for isbn10 also ");
  394.         cacheInfo = GM_getValue(isbn10);
  395.     }
  396.     if (cacheInfo) {
  397.         var bookInfo = JSON.parse(cacheInfo);
  398.         // '{"bookRecNo":' + bookRecNo + ', "hasMore":'+ fMore + ', "reservable":' + fHasReservable + ', "expressable":' + fHasExpress + '}';
  399.         var bookRecNo = bookInfo['bookRecNo'];
  400.         var fMore = bookInfo['hasMore'];
  401.         var fReservable = bookInfo['reservable'];
  402.         var fHasExpress = bookInfo['expressable'];
  403.         if (fDebug)  console.log(vIsbn + " cached, bookRecNo:" + bookRecNo + ", hasMore:" + fMore + ", reservable:" + fReservable + ", expressable:" + fHasExpress);
  404.         appendLibBookHtml(bookRecNo, fMore, fReservable, fHasExpress);
  405.         return ;
  406.     }
  407.    
  408.     GM_xmlhttpRequest({
  409.         method: 'GET',
  410.         url: getLibIsbnUrl(vIsbn),
  411.             headers: {
  412.                 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
  413.         },
  414.         //onload: loadLibInfo
  415.         onload: function(res) {
  416.             var respTxt = res.responseText;
  417.             if (fDebug)  console.log("respTxt : " + respTxt);
  418.             
  419.             // shenzhenLib search result page will contains below string
  420.             // if the isbn search find any books
  421.             // parse string: &metaidList=1086672,962940,400742,70483,1184921,'
  422.             var idstr = respTxt.match(/\&metaidList=.*?,\'/igm);
  423.             if (fDebug)  console.log("found metaids : " + idstr);
  424.             var found = (idstr != null );
  425.             if (found ) {
  426.                 // parse bookRecNos
  427.                 var bookRecNos = idstr[0].match(/\d+/g);
  428.                 isbn = vIsbn; // the value might be isbn10
  429.                 appendLibBookInfo(bookRecNos);
  430.             } else {
  431.                 if (vIsbn.length == 13) {
  432.                     if (fDebug)  console.log('try another value again');
  433.                     //setTimeout(function(){
  434.                     //    appendLibInfoByIsbn10(vIsbn);
  435.                     //}, 20);
  436.                     if (isbn10) {
  437.                         queryLibByIsbn(isbn10);
  438.                     } else {
  439.                         $('#libLoading').remove();
  440.                     }
  441.                 } else {
  442.                     $('#libLoading').remove();
  443.                 }
  444.             }
  445.         }
  446.     });
  447. }
  448. function appendLibInfoByIsbn10(isbn13){
  449.     GM_xmlhttpRequest({
  450.         method: 'GET',
  451.         url: 'http://api.douban.com/book/subject/isbn/' + isbn13 + '?alt=json',
  452.         headers: {
  453.                 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
  454.         },
  455.         onload: function(res) {
  456.             var isbn10 = null;
  457.             var jsonObj = JSON.parse(res.responseText);
  458.             
  459.             var propArr = jsonObj['db:attribute'];
  460.             for (var i = 0; i < propArr.length; i++) {
  461.                 if (fDebug)  console.log("name: " + propArr[i]['@name']);
  462.                 if (fDebug)  console.log("val : " + propArr[i]['$t']);
  463.                 if (propArr[i]['@name'] == 'isbn10') {
  464.                     isbn10 = propArr[i]['$t'];
  465.                     break;
  466.                 }
  467.             }
  468.             
  469.             if (isbn10 != null && isbn10.length == 10) {
  470.                 queryLibByIsbn(isbn10);
  471.             } else {
  472.                 $('#libLoading').remove();
  473.             }
  474.         }
  475.     });
  476. }
  477. function getIsbn10() {
  478.     var isbn10 = null;
  479.     var borrowDiv = document.getElementById("borrowinfo");
  480.     // div -> ul -> li -> a
  481.     if (borrowDiv ) {
  482.         if (borrowDiv.children[1] && borrowDiv.children[1].children[0]
  483.             && borrowDiv.children[1].children[0].children[0]) {
  484.             var libLink = borrowDiv.children[1].children[0].children[0].href;
  485.             if (fDebug)  console.log('libLink: ' + libLink);
  486.             var m = libLink.match(/&subject=.*&type=/igm);
  487.             if (m) {
  488.                 isbn10 = m[0];
  489.                 isbn10 = isbn10.substring("&subject=".length, isbn10.length - "&type=".length);
  490.                 if (fDebug)  console.log('isbn10: ' + isbn10);
  491.                 return isbn10;
  492.             }
  493.         }
  494.     }
  495. }
  496. /**
  497. * append the library link to douban book page
  498. * a) if the lib isbn query return books, the link is the first book page;
  499. * b) if the query results has more than one book, add query result link
  500. * c) if the first ten books has preservable book, set it as the book link
  501. * d) otherwise append title query link of Shenzhen Library
  502. */
  503. function appendLibraryLink() {
  504.    
  505.     title = null;
  506.     isbn  = null;
  507.    
  508.     getDoubanBookTitle();
  509.     if (fDebug)  console.log("book title: \'" + title + "\'");
  510.     getDoubanBookIsbn();
  511.     if (fDebug)  console.log("book isbn: \'" + isbn + "\'");
  512.     // it might not be book page, or douban changed the page structure
  513.     if (isEmptyStr(title) && isEmptyStr(isbn) )
  514.         return ;
  515.    
  516.     appendTitleLink_Loading();
  517.    
  518.     if (!isEmptyStr(isbn)) {
  519.         // query library, append link to library
  520.         setTimeout(function(){
  521.             queryLibByIsbn(isbn);
  522.         }, 200); // end of setTimeout
  523.     }
  524. } // end of appendLibraryLink()
  525. function getLibBookTitle() {
  526.     title = $('h3 a').text();
  527. }
  528. function getLibBookIsbn() {
  529.     // get book isbn  
  530.     try
  531.     {
  532.         var liTxt = null;
  533.         $("div.righttop ul li").each(function(){
  534.             liTxt = $(this).text();
  535.             if (fDebug)  console.log('lib book attr txt:' + liTxt);
  536.             //if ($(this).text() == 'ISBN' && $(this)[0].nextSibling != null)
  537.             if (liTxt.indexOf('ISBN') == 0 && liTxt.length > 5) { // 5='ISBN:'.length
  538.                 //isbn = $(this)[0].nextSibling.nodeValue.trim();
  539.                 isbn = liTxt.substring(5).trim();
  540.                 if (fDebug)  console.log('lib book isbn txt:' + isbn);
  541.                 isbn = isbn.replace(/-/g, '').substr(0,13);
  542.                 if (fDebug)  console.log('lib book isbn:' + isbn);
  543.             }
  544.         });
  545.     } catch(ex) {
  546.         console.log('In getLibBookIsbn, exception: ' + ex.message);
  547.     }
  548. }
  549. function appendDoubanTitleSearchLink() {
  550.     if (isEmptyStr(title))
  551.         return ;
  552.    
  553.     var htmlStr = '<li>在豆瓣:';
  554.     htmlStr += getDoubanSearchLink(title) + '</li>';
  555.     if (fDebug)  console.log("book query url: " + htmlStr);
  556.     $("div.righttop ul").append(htmlStr);
  557. }
  558. function appendDoubanBookLink(score, bookLink, pageCt) {
  559.     var htmlStr = '<li>在豆瓣:';
  560.     htmlStr += '<a href="' + bookLink + '" target="_blank" title="点击前往豆瓣查看评论">到豆瓣查看评论';
  561.     if (score != null && !isNaN(score) && score > 0) {
  562.         htmlStr += '&nbsp;(评分:&nbsp;' + score + ')';
  563.     }
  564.     htmlStr += '</a></li>';
  565.     if (pageCt != null && !isNaN(pageCt) && pageCt > 0) {
  566.             htmlStr += '<li>页数:'+ pageCt + '</li>';
  567.     }
  568.    
  569.     if (fDebug)  console.log("book query url: " + htmlStr);
  570.    
  571.     $("div.righttop ul").append(htmlStr);
  572. }
  573. // append link to douban book
  574. function appendDoubanLink() {
  575.    
  576.     title = null;
  577.     isbn  = null;
  578.    
  579.     if (fDebug)  console.log('lib bookpage append link to douban book: ');
  580.     getLibBookTitle();
  581.     if (fDebug)  console.log("book title: \'" + title + "\'");
  582.     getLibBookIsbn();
  583.     if (fDebug)  console.log("book isbn: \'" + isbn + "\'");
  584.     // it might not be lib book page, or shenzhen Lib changed the page structure
  585.     if (isEmptyStr(title) && isEmptyStr(isbn) )
  586.         return ;
  587.    
  588.     if (!isEmptyStr(isbn)) {
  589.         //var doubanUrl = 'http://book.douban.com/isbn/' + isbn + '/';
  590.         var doubanUrl = 'http://api.douban.com/book/subject/isbn/' + isbn + '?alt=json';
  591.         setTimeout(function(){GM_xmlhttpRequest({
  592.             method: 'GET',
  593.             url: doubanUrl ,
  594.             headers: {
  595.                 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
  596.             },
  597.             onload: function(res) {
  598.                 try {
  599.                     var jsonObj = JSON.parse(res.responseText);
  600.                     
  601.                     var score = jsonObj['gd:rating']['@average'];
  602.                     var bookLink = jsonObj['link'][1]['@href'];
  603.                     var dbAttrs = jsonObj['db:attribute'];
  604.                     var pageCt = 0;
  605.                     for (var i = 0; i < dbAttrs.length; i++)
  606.                     {
  607.                      if (fDebug)  console.log("attr: " + dbAttrs[i]['$t']);
  608.                      if (dbAttrs[i]['@name'] == 'pages') {
  609.                      pageCt = dbAttrs[i]['$t'];
  610.                      if (fDebug)  console.log("pages: " + pageCt);
  611.                      }
  612.                     }
  613.                     if (fDebug)  console.log("score: " + score);
  614.                     
  615.                     appendDoubanBookLink(score, bookLink, pageCt);
  616.                 } catch(ex) {//SyntaxError
  617.                     if (fDebug)  console.log("respTxt: " + res.responseText);
  618.                     // no such book, responseText is not a valid json str
  619.                     appendDoubanTitleSearchLink();
  620.                 }
  621.             }
  622.         })}, 20); // end of setTimeout
  623.     } else {
  624.         appendDoubanTitleSearchLink();
  625.     }
  626.    
  627. } // end of appendDoubanLink()
  628. function appendLibraryInSearchPage() {
  629.     var keyword = $(":text").val();
  630.     keyword = keyword.replace(/-/g, '');
  631.     if (fDebug)  console.log('keyword: [' + keyword + ']');
  632.     if (isEmptyStr(keyword))
  633.         return ;
  634.    
  635.     var htmlStr =
  636.       '<h2><span class="">图书馆搜索</span>        · · · · · ·    </h2>'
  637.       + '<p class="p1">' + LIBSEARCH_LINK_PRE
  638.       + ' href="' + getLibTitleUrl(keyword)
  639.       + '" >&gt;&nbsp;'+ LIBSEARCH_LINK_SUF + '</p>';
  640.     $(".aside h2:last").before(htmlStr);
  641. }
  642. function appendDoubanInSearchPage() {
  643.    
  644.     try
  645.     {
  646.         var keyword = $("span.fbold").text();
  647.         if (isEmptyStr(keyword))
  648.             return ;
  649.         if (fDebug)  console.log('keyword: [' + keyword + ']');
  650.         
  651.         var rsltSearchBtn = $("div.books_sel input:last");
  652.         if (fDebug)  console.log('find search in result button');
  653.         var dbSearchBtn = rsltSearchBtn.clone();
  654.         var dbSearchUrl = getDoubanSearchUrl(keyword);
  655.         if (fDebug)  console.log('copy it, new dbSearchBtn, dbSearchUrl: ' + dbSearchUrl);
  656.         dbSearchBtn.attr('value','在豆瓣搜索');
  657.         dbSearchBtn.attr('onclick', null);
  658.         dbSearchBtn.click(function() {window.open(dbSearchUrl);});
  659.         if (fDebug)  console.log('created douban search button');
  660.         $("div.books_sel").append(dbSearchBtn);
  661.     } catch(ex) {
  662.         console.log('In Library search page, exception: ' + ex.message);
  663.         console.log('In Library search page, cannot find keyword, page struct may changed');
  664.     }
  665. }
  666. function appendListBooksLibLink() {
  667.     // eg, book.douban.com/doulist/232705/ (div.pl2 a),
  668.     // book.douban.com/doulist/531890/ (div.title a),
  669.    
  670.     var fChecked = false;
  671.     $('div.article table').each(function(){
  672.         var keyword = '';
  673.         if (!fChecked) {
  674.             fChecked = true;
  675.             GM_addStyle(".libSearch{\
  676.                 float:left;display: inline-block;\
  677.                 background: #eef9eb;border: 1px solid #2F7B4B;\
  678.                 padding: 1px 10px;border-radius:3px;margin-right: 8px;}\
  679.             ");
  680.             if (fDebug)  console.log(' tag/doulist 1: fChecked[' + fChecked + '] ');
  681.         }
  682.         
  683.         keyword = $('div.pl2 a', this).text();
  684.         if (isEmptyStr(keyword))
  685.             return ;
  686.         keyword = keyword.trim();
  687.         if (fDebug)  console.log(' tag/doulist page: [' + keyword + ']');
  688.         
  689.         var htmlStr = LIBSEARCH_LINK_PRE +
  690.           ' class="libSearch" href="' + getLibTitleUrl(keyword)
  691.           + '" >' + LIBSEARCH_LINK_SUF;
  692.         $('td > span.rr', this).append(htmlStr);
  693.     });
  694. }
  695. function appendTagBooksLibLink() {
  696.     // eg, book.douban.com/tag/web , book.douban.com/people/qibadao/collect
  697.     // book.douban.com/chart
  698.    
  699.     $('div.article ul li').each(function(){
  700.         var keyword = '';
  701.         keyword = $('h2 a', this).text();
  702.         
  703.         if (isEmptyStr(keyword))
  704.             return ;
  705.         keyword = keyword.trim();
  706.         if (fDebug)  console.log(' tag page: [' + keyword + ']');
  707.         
  708.         var htmlStr = LIBSEARCH_LINK_PRE
  709.           + ' class="j a_add2cart add2cart" href="'
  710.           + getLibTitleUrl(keyword) + '">' + LIBSEARCH_LINK_SUF;
  711.         $('span.cart-info span', this).first().append(htmlStr);
  712.     });
  713. }
  714. (function() {
  715.     var thisScript = {
  716.     name: "douban_shenzhenLib",
  717.     id: "116332",
  718.     version:"1.24.10"
  719.     };
  720.     if (typeof(Updater)!='undefined') {
  721.         var updater = new Updater(thisScript);
  722.         updater.check(24);
  723.     }
  724.    
  725.     if (fDebug)  console.log('url host:' + document.URL);
  726.    
  727.     var vUrl = document.URL;
  728.     if (vUrl.indexOf("douban.com/subject/") > 0) {
  729.         if (fDebug)  console.log('in douban page');
  730.         appendLibraryLink();
  731.     } else if (vUrl.indexOf("douban.com/subject_search") > 0) {
  732.         appendLibraryInSearchPage();
  733.     } else if (vUrl.indexOf("/Search/searchdetail.jsp") > 0) {
  734.         if (fDebug)  console.log('in shenzhen library page');
  735.         appendDoubanLink();
  736.     } else if (vUrl.indexOf("/Search/searchshow.jsp") > 0) {
  737.         appendDoubanInSearchPage();
  738.     } else if(vUrl.indexOf('/top250') > 0
  739.         || vUrl.indexOf('/doulist/') > 0) {
  740.         appendListBooksLibLink();
  741.     } else if (vUrl.indexOf('/tag/') > 0
  742.         || /\/people\/.+\/collect/.test(vUrl) || /\/chart(.*)$/.test(vUrl)) {
  743.         appendTagBooksLibLink();
  744.     }
  745. })();
复制代码

作者: lxh623    时间: 2019-9-11 10:45

读秀超星电子书获取插件。
  1. // ==UserScript==
  2. // @name 读秀超星电子书获取插件,适用于龙岩网络图书馆,全国图书参考联盟等网站 by平底锅 (感谢maer)
  3. // @namespace duxiu.ssno.search
  4. // @version 1.0.1
  5. // @include *search*
  6. // @include *bookDetail.jsp?*
  7. // @include *advsearch*
  8. // @include *book.do?go=guide*
  9. // @include *book.do?go=showmorelib*
  10. // @include *searchEBook*
  11. // @include *www.duxiu.com*
  12. // @include *n/jpgfs/book/base*
  13. // @include         *n/slib/book/slib*
  14. // @description 直接显示图书唯一编码ss号,增加存货查询按钮,一键获取图书方便快捷。
  15. // @copyright maer
  16. // @grant none
  17. // ==/UserScript==
  18. //获取当前网页地址
  19. var myurl = window.location.href;
  20. //定义统一的样式
  21. var mystyle = "font-family:Verdana;color:red;font-size:15px;font-weight:bold;";
  22. mystyle+="text-align:center;margin-top:5px;margin-bottom:5px;";
  23. app = {
  24. run: function(){
  25. //封面页展示图书显示ssid
  26. var isDuxiuIndex=myurl.indexOf("www.duxiu.com")!=-1;
  27. if(isDuxiuIndex)
  28. {
  29. var myul=document.querySelector("ul.zpicImg");
  30. var mybooks=myul.querySelectorAll("li");
  31. for(var i=0;i<mybooks.length;i++)
  32. {
  33. var myCov=mybooks[i].querySelector("img").src.toString();
  34. var ssid=GetSSID(myCov);
  35. var ssNode=CreateSSIDNode2(ssid,"myssid"+i);
  36. mybooks[i].appendChild(ssNode);
  37. }
  38. }
  39. //搜索页显示ssid
  40. var isSearch=myurl.indexOf("search?") != -1;
  41. var notBaoku=myurl.indexOf("book/search?")==-1;
  42. var notAdvsearch=myurl.indexOf("advsearch") == -1;
  43. if (isSearch&&notAdvsearch&&notBaoku) {
  44. var subdomain = document.getElementsByName("sp.subdomain")[0];
  45. //读秀和长春图书馆的情况
  46. var isDuxiu=subdomain.value == "book.duxiu.com";
  47. var isCcelib=subdomain.value == "book.ccelib.com";
  48. if ( isDuxiu||isCcelib) {
  49. //获取书本列表节点
  50. var mybooks = document.getElementsByClassName("books");
  51. for (var i = 0; i < mybooks.length; i++) {
  52. //调整最小显示高度
  53. var listDL=mybooks[i].querySelector("dl");
  54. listDL.style.minHeight="210px";
  55. //获取ssid
  56. var ssid=GetSSIDDXID("ssid" + i,"dxid" + i);
  57. //创建插入节点
  58. var ssNode=CreateSSIDNode2(ssid,"myssid"+i);
  59. //插入节点
  60. var divImg=mybooks[i].querySelector(".divImg");
  61. //存货查询
  62. var infoAnchor=divImg.querySelector("a").href;
  63. var oldstr="bookDetail.jsp?dxNumber=";
  64. var newstr="book.do?go=showmorelib&type=1&dxid=";
  65. var scgAnchor="http://180.76.236.241:8089/sscx="+ssid;
  66. var csgbutton=document.createElement("a");
  67. csgbutton.href=scgAnchor;
  68. csgbutton.target="_blank";
  69. csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  70. csgbutton.innerHTML="存货查询";
  71. var csgP=document.createElement("p");
  72. csgP.style="text-align:center;";
  73. csgP.appendChild(csgbutton);
  74. divImg.appendChild(ssNode);
  75. divImg.appendChild(csgP);
  76. };
  77. }
  78. //深圳文献港,全国图书馆联盟搜索页
  79. else {
  80. var mybooks = document.getElementsByClassName("book1");
  81. for (var i = 0; i < mybooks.length; i++) {
  82. //获取ssid
  83. var ssid=GetSSIDDXID("ssid" + i,"dxid" + i);
  84. //创建插入节点
  85. var ssNode=CreateSSIDNode2(ssid,"myssid"+i);
  86. //获取信息页地址
  87. var infoUrl=document.getElementById("url"+i).value;
  88. var dxid=getValueFromUrl2(infoUrl,"dxNumber");
  89. var dValue=getValueFromUrl2(infoUrl,"&d");
  90. var myhref="http://180.76.236.241:8089/sscx=";
  91. myhref+=ssid;
  92. var csgbutton=document.createElement("a");
  93. csgbutton.href=myhref;
  94. csgbutton.target="_blank";
  95. csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  96. csgbutton.innerHTML="存货查询";
  97. var csgP=document.createElement("p");
  98. csgP.style="text-align:center;";
  99. csgP.appendChild(csgbutton);
  100. //插入节点
  101. var tdelems = mybooks[i].getElementsByTagName("td");
  102. for (var j = 0; j < tdelems.length; j++) {
  103. if (tdelems[j].id == "b_img") {
  104. var imgNode = tdelems[j];
  105. var insertPoint = imgNode.nextSibling;
  106. var myParentNode=insertPoint.parentNode;
  107. myParentNode.insertBefore(ssNode, insertPoint);
  108. myParentNode.insertBefore(csgP,insertPoint);
  109. }
  110. }
  111. }
  112. }
  113. }
  114. //信息页面显示ssid
  115. if (myurl.indexOf("bookDetail.jsp?") != -1) {
  116. //读秀信息页面
  117. if (myurl.indexOf("/views/specific/") == -1) {
  118. //获取ssid
  119. var bookphoto=document.getElementById("bookphoto");
  120. var imgsrc=bookphoto.querySelector("img").src;
  121. var ssid=GetSSID(imgsrc);
  122. //创建插入节点
  123. var ssNode=CreateSSIDNode(ssid);
  124. var grade1=document.getElementById("grade1");
  125. bookphoto.insertBefore(ssNode,grade1);
  126. //获取三个按钮的根节点,如果没有,则创建一个
  127. var bnt_content=document.querySelector(".bnt_content");
  128. if(bnt_content==null)
  129. {
  130. bnt_content=document.createElement("dd");
  131. bnt_content.className="bnt_content";
  132. var card_text=document.querySelector(".card_text");
  133. var card_dl=card_text.querySelector("dl");
  134. card_dl.appendChild(bnt_content);
  135. }
  136. var bnt_innerHtml=bnt_content.innerHTML;
  137. var d=getValueFromUrl("&d");
  138. var dxid=getValueFromUrl("dxNumber");
  139. /*有待解决d值的问题
  140. if(bnt_innerHtml.indexOf("图书馆文献传递")==-1)
  141. {
  142. var wxcd=document.createElement("a");
  143. wxcd.title="功能将您需要的全文发送到您的邮箱!";
  144. wxcd.className="bnt_book leftF";
  145. var wxcdUrl="javaScript:subtoRefer(true,'/gofirstdrs.jsp?dxNumber=";
  146. wxcdUrl+=dxid+"&d="+d+"')";
  147. wxcd.href=wxcdUrl;
  148. wxcd.innerHTML="图书馆文献传递";
  149. if(bnt_innerHtml.indexOf("部分阅读")==-1)
  150. {
  151. bnt_content.appendChild(wxcd);
  152. }
  153. else
  154. {
  155. bnt_content.insertBefore(wxcd,wxcd.firstElementChild);
  156. }
  157. }
  158. */
  159. //部分阅读按钮
  160. if(bnt_innerHtml.indexOf("部分阅读")==-1)
  161. {
  162. var bfydurl="http://book.duxiu.com/readDetail.jsp?dxNumber=";
  163. bfydurl+=dxid;
  164. bfydurl+="&";
  165. bfydurl+="d="+d;
  166. var bfyd=document.createElement("a");
  167. bfyd.href=bfydurl;
  168. bfyd.className="bnt_book leftF";
  169. bfyd.innerHTML="部分阅读";
  170. bnt_content.appendChild(bfyd);
  171. }
  172. //显示查询藏馆按钮
  173. var csgbutton=document.createElement("a");
  174. var oldstr="bookDetail.jsp?dxNumber=";
  175. var newstr="book.do?go=showmorelib&type=1&dxid=";
  176. var newAnchor="http://180.76.236.241:8089/sscx="+ssid;
  177. csgbutton.href=newAnchor;
  178. csgbutton.className="bnt_book leftF";
  179. csgbutton.innerHTML="存货查询";
  180. bnt_content.appendChild(csgbutton);
  181. }
  182. //深圳文献港,图书馆参考联盟图书信息页
  183. else {
  184. //获取ssid
  185. var tubookimg=document.querySelector(".tubookimg");
  186. var imgsrc=tubookimg.querySelector("img").src;
  187. var ssid=GetSSID(imgsrc);
  188. //创建插入节点
  189. var ssNode=CreateSSIDNode(ssid);
  190. tubookimg.appendChild(ssNode);
  191. //显示查询藏馆按钮
  192. var csgbutton=document.createElement("a");
  193. var dxid=getValueFromUrl("dxNumber");
  194. var dvalue=getValueFromUrl("&d");
  195. var myhref="http://180.76.236.241:8089/sscx=";
  196. myhref+=ssid;
  197. csgbutton.href=myhref;
  198. csgbutton.target="_blank";
  199. csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  200. csgbutton.innerHTML="存货查询";
  201. var pTemp=document.createElement("p");
  202. pTemp.style="text-align:center;";
  203. pTemp.appendChild(csgbutton);
  204. tubookimg.appendChild(pTemp);
  205. }
  206. }
  207. //高级搜索页面显示ssid
  208. if (myurl.indexOf("advsearch") != -1) {
  209. //定义按钮
  210. var btnSSID = document.createElement("input");
  211. btnSSID.id = "btnshowSSID";
  212. btnSSID.class = "btnInput";
  213. btnSSID.type = "button";
  214. btnSSID.onclick = showAdvSS;
  215. btnSSID.value = "显示SS";
  216. btnSSID.style = "width:85px;height:27px;";
  217. //获取插入点,并插入
  218. var searchinfoDiv = document.getElementById("searchinfo");
  219. searchinfoDiv.appendChild(btnSSID);
  220. }
  221. //电子书导航页
  222. if(myurl.indexOf("book.do?go=guide")!=-1)
  223. {
  224. var ulLists=document.getElementsByTagName("ul");
  225. var ulBooks=null;
  226. for(var i=0;i<ulLists.length;i++)
  227. {
  228. if(ulLists[i].className=="clearfix")
  229. {
  230. ulBooks=ulLists[i];
  231. }
  232. }
  233. if(ulBooks!=null)
  234. {
  235. var bookLists=ulBooks.querySelectorAll("li");
  236. for(var j=0;j<bookLists.length;j++)
  237. {
  238. var ImgDiv=bookLists[j].getElementsByClassName("divImg");
  239. if(ImgDiv.length!=0)
  240. {
  241. var imgNode=ImgDiv[0];
  242. var covimgs=imgNode.getElementsByTagName("img");
  243. if(covimgs.length!=0)
  244. {
  245. var covimg=covimgs[0];
  246. var imghref=covimg.src;
  247. var ssid = GetSSID(imghref);
  248. var ssidNode=CreateSSIDNode(ssid);
  249. imgNode.appendChild(ssidNode);
  250. }
  251. }
  252. }
  253. }
  254. }
  255. //电子书检索页
  256. if(myurl.indexOf("searchEBook?")!=-1)
  257. {
  258. var mybooks=document.querySelector(".books");
  259. var myBookLists=mybooks.querySelectorAll("li");
  260. for(var i=0;i<myBookLists.length;i++)
  261. {
  262. //调整列表最小高度
  263. var listDL=myBookLists[i].querySelector("dl");
  264. listDL.style.minHeight="190px";
  265. //获取ssid
  266. var ssid=GetSSIDDXID("ssid" + i,"dxid_" + i);
  267. //创建插入节点
  268. var ssNode=CreateSSIDNode2(ssid,"myssid"+i);
  269. var divImg=myBookLists[i].querySelector(".divImg");
  270. divImg.appendChild(ssNode);
  271. }
  272. }
  273. //藏馆页面
  274. if(myurl.indexOf("book.do?go=showmorelib")!=-1)
  275. {
  276. //显示ssid部分
  277. var headDiv=document.querySelector(".header");
  278. var flDiv=headDiv.querySelector("img");
  279. var imgSrc=flDiv.src;
  280. var ssid=GetSSID(imgSrc);
  281. var ssidLi=document.createElement("li");
  282. ssidLi.style="color:red;font-weight:bold;";
  283. console.log(ssid);
  284. console.log(ssid.length);
  285. if(ssid.length==8)
  286. {
  287. ssidLi.innerHTML="【SS号】"+ssid;
  288. }
  289. else
  290. {
  291. ssidLi.innerHTML="【DX号】"+ssid;
  292. }
  293. var infoUL=headDiv.querySelector("ul");
  294. var insertPoint=infoUL.firstElementChild.nextElementSibling;
  295. infoUL.insertBefore(ssidLi,insertPoint);
  296. //统一按钮风格
  297. var btnStyle= "min-width:90px;height:28px;margin-left:10px;font-weight:bold;color:red;";
  298. //显示切换按钮
  299. var switchButton=document.createElement("input");
  300. switchButton.id = "switchSCG";
  301. switchButton.type = "button";
  302. switchButton.onclick = switchSCG;
  303. if(myurl.indexOf("&type=1")!=-1)
  304. {
  305. switchButton.value = "纸质藏馆";
  306. }
  307. else
  308. {
  309. switchButton.value = "存货查询";
  310. }
  311. switchButton.style = btnStyle;
  312. var tabDiv=document.querySelector(".tab");
  313. tabDiv.appendChild(switchButton);
  314. //返回按钮
  315. var returnButton=document.createElement("input");
  316. returnButton.id="returnBtn";
  317. returnButton.type="button";
  318. returnButton.style =btnStyle;
  319. returnButton.onclick=returnBookDetail;
  320. returnButton.value="返回BookDetail";
  321. tabDiv.appendChild(returnButton);
  322. //试读按钮
  323. var sd=document.createElement("input");
  324. sd.id="sd";
  325. sd.type="button";
  326. sd.style= btnStyle;
  327. sd.value="试读";
  328. sd.onclick=sdtz;
  329. tabDiv.appendChild(sd);
  330. }
  331. //包库搜索页面显示ssid
  332. if(myurl.indexOf("book/search")!=-1)
  333. {
  334. var ztbg=document.querySelector("div[class='ztbg']");
  335. var h2Status=ztbg.querySelector("h2[class='fl zli_t']");
  336. var insertPoint=h2Status.nextElementSibling;
  337. //定义按钮
  338. var btnSSID = document.createElement("input");
  339. btnSSID.id = "btnshowSSID";
  340. btnSSID.class = "btnInput";
  341. btnSSID.type = "button";
  342. btnSSID.onclick = GetBaoKuSSID;
  343. btnSSID.value = "显示SSID";
  344. btnSSID.style = "width:85px;height:30px;color:red;margin-left:15px;";
  345. ztbg.insertBefore(btnSSID,insertPoint);
  346. }
  347. //试读页显示封面、书名、版权、封底四个按钮
  348. if(myurl.indexOf("/n/jpgfs/book/base/")!=-1)
  349. {
  350. var jpath="";
  351. var mySource=document.querySelector("html").outerHTML;
  352. var istart=0;
  353. var iend=0;
  354. var myIndexStr1="jpgPath:\"";
  355. var myIndexStr2="\"";
  356. istart=mySource.indexOf(myIndexStr1);
  357. istart+=myIndexStr1.length;
  358. iend=mySource.indexOf(myIndexStr2,istart);
  359. jpath=mySource.substring(istart,iend);
  360. var baseUrl="http://img.duxiu.com";
  361. var myCovUrl=baseUrl+jpath+"cov001?zoom=2";
  362. var myBokUrl=baseUrl+jpath+"bok001?zoom=2";
  363. var myLegUrl=baseUrl+jpath+"leg001?zoom=2";
  364. var myBacUrl=baseUrl+jpath+"cov002?zoom=2";
  365. console.log("封面页:"+myCovUrl);
  366. console.log("书名页:"+myBokUrl);
  367. console.log("版权页:"+myLegUrl);
  368. console.log("封底页:"+myBacUrl);
  369. var t_content=document.querySelector("#t_content");
  370. t_content.style="width:815px;";
  371. var tc_right=document.querySelector("#tc_right");
  372. tc_right.style="width:240px;";
  373. var myul=tc_right.querySelector("ul");
  374. var cov001li=addALink(myCovUrl,"cov001","封面","cov001.pdg");
  375. cov001li.style.marginTop="7px";
  376. myul.appendChild(cov001li);
  377. var bok001li=addALink(myBokUrl,"bok001","书名","bok001.pdg");
  378. bok001li.style.marginTop="7px";
  379. myul.appendChild(bok001li);
  380. var leg001li=addALink(myLegUrl,"leg001","版权","leg001.pdg");
  381. leg001li.style.marginTop="7px";
  382. myul.appendChild(leg001li);
  383. var cov002li=addALink(myBacUrl,"cov002","封底","cov002.pdg");
  384. cov002li.style.marginTop="7px";
  385. myul.appendChild(cov002li);
  386. var oneKeyDown=document.createElement("li");
  387. oneKeyDown.style="margin-top: 7px;margin-left:6px;";
  388. var oneKeyDownlink=document.createElement("a");
  389. oneKeyDownlink.id="oneKeyDown";
  390. oneKeyDownlink.style="color: red;font-weight:bold;cursor: pointer;";
  391. oneKeyDownlink.innerHTML="一键下载";
  392. oneKeyDownlink.href="#";
  393. oneKeyDownlink.onclick=OneKeyDownAll;
  394. oneKeyDown.appendChild(oneKeyDownlink);
  395. myul.appendChild(oneKeyDown);
  396. }
  397. //包库在线阅读页显示封面、书名、版权、封底四个按钮
  398. if(myurl.indexOf("/n/slib/book/slib/")!=-1)
  399. {
  400. var jpath="";
  401. var mySource=document.querySelector("html").outerHTML;
  402. var istart=0;
  403. var iend=0;
  404. var myIndexStr1="jpgPath: \"";
  405. var myIndexStr2="\"";
  406. istart=mySource.indexOf(myIndexStr1);
  407. istart+=myIndexStr1.length;
  408. iend=mySource.indexOf(myIndexStr2,istart);
  409. jpath=mySource.substring(istart,iend);
  410. console.log(jpath);
  411. var baseUrl="http://img.sslibrary.com";
  412. var myCovUrl=baseUrl+jpath+"cov001?zoom=2";
  413. var myBokUrl=baseUrl+jpath+"bok001?zoom=2";
  414. var myLegUrl=baseUrl+jpath+"leg001?zoom=2";
  415. var myBacUrl=baseUrl+jpath+"cov002?zoom=2";
  416. console.log("封面页:"+myCovUrl);
  417. console.log("书名页:"+myBokUrl);
  418. console.log("版权页:"+myLegUrl);
  419. console.log("封底页:"+myBacUrl);
  420. var ToolsBar=document.querySelector(".ToolsBar");
  421. var myul=ToolsBar.querySelector("ul");
  422. myul.style.width="1366px";
  423. var cov001li=addALink(myCovUrl,"cov001","封面","cov001.pdg");
  424. myul.appendChild(cov001li);
  425. var bok001li=addALink(myBokUrl,"bok001","书名","bok001.pdg");
  426. myul.appendChild(bok001li);
  427. var leg001li=addALink(myLegUrl,"leg001","版权","leg001.pdg");
  428. myul.appendChild(leg001li);
  429. var cov002li=addALink(myBacUrl,"cov002","封底","cov002.pdg");
  430. myul.appendChild(cov002li);
  431. var oneKeyDown=document.createElement("li");
  432. oneKeyDown.style="margin-left:6px;";
  433. var oneKeyDownlink=document.createElement("a");
  434. oneKeyDownlink.id="oneKeyDown";
  435. oneKeyDownlink.style="color: red;font-weight:bold;cursor: pointer;";
  436. oneKeyDownlink.innerHTML="一键下载";
  437. oneKeyDownlink.href="#";
  438. oneKeyDownlink.onclick=OneKeyDownAll;
  439. oneKeyDown.appendChild(oneKeyDownlink);
  440. myul.appendChild(oneKeyDown);
  441. }
  442. }};
  443. function GetBaoKuSSID()
  444. {
  445. var myssids=document.querySelectorAll("#myssid");
  446. if(myssids.length!=0)
  447. {
  448. return;
  449. }
  450. else
  451. {
  452. var mybooklist=document.querySelectorAll("ul[class='clearfix zli_item']");
  453. for(var i=0;i<mybooklist.length;i++)
  454. {
  455. var mybook=mybooklist[i].querySelector("li[class='fl zli_img']");
  456. var bookimg=mybook.querySelector("img");
  457. var myimgSrc=bookimg.src;
  458. console.log(myimgSrc);
  459. var myssid=GetSSID(myimgSrc);
  460. console.log(myssid);
  461. var ssidNode=CreateSSIDNode(myssid);
  462. mybook.appendChild(ssidNode);
  463. }
  464. }
  465. }
  466. function OneKeyDownAll()
  467. {
  468. var mylinksId=new Array("cov001","bok001","leg001","cov002");
  469. for(var i=0;i<mylinksId.length;i++)
  470. {
  471. var mylink=document.getElementById(mylinksId[i]);
  472. mylink.click();
  473. }
  474. }
  475. function addALink(urlStr,myIdStr,innerHTMLStr,downloadName)
  476. {
  477. var myli=document.createElement("li");
  478. myli.style="margin-left:6px;";
  479. var alink=document.createElement("a");
  480. alink.id=myIdStr;
  481. alink.innerHTML=innerHTMLStr;
  482. alink.href=urlStr;
  483. alink.style="color: green;font-weight:bold;cursor: pointer;";
  484. alink.download=downloadName;
  485. myli.appendChild(alink);
  486. return myli;
  487. }
  488. //切换藏书查询
  489. function switchSCG()
  490. {
  491. var newurl="";
  492. if(myurl.indexOf("&type=1")!=-1)
  493. {
  494. newurl=myurl.replace("&type=1","");
  495. }
  496. else
  497. {
  498. newurl=myurl+"&type=1";
  499. }
  500. window.location.href=newurl;
  501. }
  502. //跳转试读页
  503. function sdtz()
  504. {
  505. var d=getValueFromUrl("&d");
  506. var dxid=getValueFromUrl("&dxid");
  507. newurl="http://book.duxiu.com/readDetail.jsp?dxNumber=";
  508. newurl+=dxid;
  509. newurl+="&";
  510. newurl+="d="+d;
  511. window.open(newurl,"_blank");
  512. }
  513. //返回bookdetail
  514. function returnBookDetail()
  515. {
  516. var d=getValueFromUrl("&d");
  517. var dxid=getValueFromUrl("&dxid");
  518. newurl="http://book.duxiu.com/bookDetail.jsp?dxNumber=";
  519. newurl+=dxid;
  520. newurl+="&";
  521. newurl+="d="+d;
  522. window.location.href=newurl;
  523. }
  524. //从当前网址中提取某个字段,输入字段名称
  525. function getValueFromUrl(myfield)
  526. {
  527. var str=myfield+"=";
  528. if(myurl.indexOf(str)!=-1)
  529. {
  530. var reg =new RegExp(myfield+"\\=\\w+");
  531. var fieldStr = myurl.match(reg)[0];
  532. console.log(myfield.toString());
  533. var fieldValue = fieldStr.replace(myfield+"=", "");
  534. return fieldValue;
  535. }
  536. }
  537. //从当前网址中提取某个字段,输入字段名称
  538. function getValueFromUrl2(URL,myfield)
  539. {
  540. var str=myfield+"=";
  541. if(URL.indexOf(str)!=-1)
  542. {
  543. var reg =new RegExp(myfield+"\\=\\w+");
  544. var fieldStr = URL.match(reg)[0];
  545. var fieldValue = fieldStr.replace(myfield+"=", "");
  546. return fieldValue;
  547. }
  548. }
  549. //获取ssid或者dxid,当ssid不存在的时候,返回dxid
  550. //输入ssid的元素id以及读秀dxid的元素id
  551. function GetSSIDDXID(ssidNodeID,dxidNodeID)
  552. {
  553. //获取ssid
  554. var ssid=GetSSIDByID(ssidNodeID,"value");
  555. //获取dxid
  556. var dxid=GetSSIDByID(dxidNodeID,"value");
  557. //如果ssid不存在,则用dxid替代
  558. if (ssid == "") {
  559. ssid = dxid;
  560. }
  561. return ssid;
  562. }
  563. //获取ssid,输入元素的id、属性名称(一般为value)
  564. function GetSSIDByID(elementID,strAttribute)
  565. {
  566. var ssidNode=document.getElementById(elementID);
  567. var ssid=ssidNode.getAttribute(strAttribute);
  568. return ssid;
  569. }
  570. //创建默认的ssid节点,节点id为myssid
  571. function CreateSSIDNode(ssid)
  572. {
  573. var myid='myssid';
  574. return CreateSSIDNode2(ssid,myid);
  575. }
  576. //创建ssid节点,输入ssid和节点id
  577. function CreateSSIDNode2(ssid,strID)
  578. {
  579. var ssNode = document.createElement("p");
  580. ssNode.id=strID;
  581. ssNode.style=mystyle;
  582. ssNode.innerHTML=ssid;
  583. return ssNode;
  584. }
  585. //高级搜索页面显示ssid
  586. function showAdvSS() {
  587. //获取图书节点
  588. var mybooks = document.getElementsByClassName("books")[0];
  589. var booklists=mybooks.getElementsByTagName("li");
  590. for (var i = 0; i < booklists.length; i++) {
  591. //判断是否存在,如果存在,则跳过
  592. var myssid = document.getElementById("myssid" + i);
  593. if (myssid != null) {
  594. continue;
  595. }
  596. //获取ssid
  597. var ssid=GetSSIDDXID("ssid" + i,"dxid" + i);
  598. //创建插入节点
  599. var ssNode=CreateSSIDNode2(ssid,"myssid"+i);
  600. //修改dl最低高度
  601. var listDL=booklists[i].querySelector("dl");
  602. listDL.style.minHeight="210px";
  603. //插入数据
  604. var divImg=booklists[i].getElementsByClassName("divImg")[0];
  605. var infoAnchor=divImg.querySelector("a").href;
  606. var oldstr="bookDetail.jsp?dxNumber=";
  607. var newstr="book.do?go=showmorelib&type=1&dxid=";
  608. var scgAnchor="http://180.76.236.241:8089/sscx="+ssid;
  609. //存货查询
  610. var csgbutton=document.createElement("a");
  611. csgbutton.href=scgAnchor;
  612. csgbutton.target="_blank";
  613. csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  614. csgbutton.innerHTML="存货查询";
  615. var csgP=document.createElement("p");
  616. csgP.style="text-align:center;";
  617. csgP.appendChild(csgbutton);
  618. divImg.appendChild(ssNode);
  619. divImg.appendChild(csgP);
  620. }
  621. }
  622. function GetSSID(strImgSrc) {
  623. var ssid = "";
  624.     var iidStr=GetEncode(strImgSrc);
  625.     var ssidStr = DeCode(iidStr);
  626.     ssid = TrimString(ssidStr);
  627.     return ssid;
  628. }
  629. function GetEncode(strImgSrc) {
  630.     var reg = /iid\=\w+/;
  631.     var iidStr = strImgSrc.match(reg)[0];
  632.     iidStr = iidStr.replace("iid=", "");
  633.     return iidStr;
  634. }
  635. function TrimString(inputStr) {
  636.     var outPutStr = "";
  637.     inputStr = inputStr.replace(/\//g, "");
  638.     var reg = /\d{8,}/;
  639. outPutStr = inputStr.match(reg);
  640. outPutStr=outPutStr.toString();
  641.     return outPutStr;
  642. }
  643. function DeCode(EnCodeStr) {
  644.     var decodeStr = "";
  645.     var baseNumStr = EnCodeStr.substring(EnCodeStr.length - 2);
  646.     var baseNum = parseInt(baseNumStr, 16);
  647.     var myCodeStr = EnCodeStr.substring(0, EnCodeStr.length - 16);
  648.     for (var i = 0; i < myCodeStr.length; i = i + 2) {
  649.         decodeStr += GetSubString(myCodeStr, baseNum, i);
  650.     }
  651.     return decodeStr;
  652. }
  653. function GetSubString(EnCodeStr, BaseNum, startIndex) {
  654.     var s = "";
  655.     s = EnCodeStr.substring(startIndex, startIndex + 2);
  656.     //转换进制
  657.     var i = parseInt(s, 16) - BaseNum;
  658.     s = String.fromCharCode(i);
  659.     return s;
  660. }
  661. try {
  662. app.run();
  663. } catch (e) {
  664. console.log(e);
  665. }
复制代码

作者: codegay    时间: 2019-9-13 01:54

回复 2# Batcher


    浏览器脚本都是JS,chrome还有暴力猴Violentmonkey可以用,装了之后支持浏览器脚本。
作者: xp3000    时间: 2019-9-29 17:44

油猴还是很好用的




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2