找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29220|回复: 5

80元求网页脚本

  [复制链接]
发表于 2019-9-11 09:54:58 | 显示全部楼层 |阅读模式
本帖最后由 lxh623 于 2019-9-14 17:58 编辑

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

谢谢!
发表于 2019-9-11 10:02:37 | 显示全部楼层
现有脚本是用什么语言写的?发出来看看
 楼主| 发表于 2019-9-11 10:42:16 | 显示全部楼层
深圳图书馆图书信息豆瓣脚本,这个失效了。
  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. })();
复制代码
 楼主| 发表于 2019-9-11 10:45:05 | 显示全部楼层
读秀超星电子书获取插件。
  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.                                
  56.                                 //获取ssid
  57.                                 var ssid=GetSSIDDXID("ssid" + i,"dxid" + i);
  58.                                 //创建插入节点
  59.                                 var ssNode=CreateSSIDNode2(ssid,"myssid"+i);
  60.                                 //插入节点
  61.                                 var divImg=mybooks[i].querySelector(".divImg");

  62.                                 //存货查询
  63.                                 var infoAnchor=divImg.querySelector("a").href;
  64.                                 var oldstr="bookDetail.jsp?dxNumber=";
  65.                                 var newstr="book.do?go=showmorelib&type=1&dxid=";
  66.                                 var scgAnchor="http://180.76.236.241:8089/sscx="+ssid;
  67.                                 var csgbutton=document.createElement("a");
  68.                                 csgbutton.href=scgAnchor;
  69.                                 csgbutton.target="_blank";
  70.                                 csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  71.                                 csgbutton.innerHTML="存货查询";
  72.                                 var csgP=document.createElement("p");
  73.                                 csgP.style="text-align:center;";
  74.                                 csgP.appendChild(csgbutton);

  75.                                 divImg.appendChild(ssNode);
  76.                                 divImg.appendChild(csgP);
  77.                         };
  78.                 }
  79.                 //深圳文献港,全国图书馆联盟搜索页
  80.                 else {
  81.                         var mybooks = document.getElementsByClassName("book1");
  82.                         for (var i = 0; i < mybooks.length; i++) {
  83.                                 //获取ssid
  84.                                 var ssid=GetSSIDDXID("ssid" + i,"dxid" + i);
  85.                                 //创建插入节点
  86.                                 var ssNode=CreateSSIDNode2(ssid,"myssid"+i);

  87.                                 //获取信息页地址
  88.                                 var infoUrl=document.getElementById("url"+i).value;
  89.                                 var dxid=getValueFromUrl2(infoUrl,"dxNumber");
  90.                                 var dValue=getValueFromUrl2(infoUrl,"&d");
  91.                                 var myhref="http://180.76.236.241:8089/sscx=";
  92.                                 myhref+=ssid;
  93.                                
  94.                                 var csgbutton=document.createElement("a");
  95.                                 csgbutton.href=myhref;
  96.                                 csgbutton.target="_blank";
  97.                                 csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  98.                                 csgbutton.innerHTML="存货查询";
  99.                                 var csgP=document.createElement("p");
  100.                                 csgP.style="text-align:center;";
  101.                                 csgP.appendChild(csgbutton);

  102.                                 //插入节点
  103.                                 var tdelems = mybooks[i].getElementsByTagName("td");
  104.                                 for (var j = 0; j < tdelems.length; j++) {
  105.                                         if (tdelems[j].id == "b_img") {
  106.                                                 var imgNode = tdelems[j];
  107.                                                 var insertPoint = imgNode.nextSibling;
  108.                                                 var myParentNode=insertPoint.parentNode;
  109.                                                 myParentNode.insertBefore(ssNode, insertPoint);
  110.                                                 myParentNode.insertBefore(csgP,insertPoint);
  111.                                         }
  112.                                 }
  113.                         }
  114.                 }
  115.         }

  116.         //信息页面显示ssid
  117.         if (myurl.indexOf("bookDetail.jsp?") != -1) {
  118.                 //读秀信息页面
  119.                 if (myurl.indexOf("/views/specific/") == -1) {
  120.                         //获取ssid
  121.                         var bookphoto=document.getElementById("bookphoto");
  122.                         var imgsrc=bookphoto.querySelector("img").src;
  123.                         var ssid=GetSSID(imgsrc);
  124.                         //创建插入节点
  125.                         var ssNode=CreateSSIDNode(ssid);
  126.                         var grade1=document.getElementById("grade1");
  127.                         bookphoto.insertBefore(ssNode,grade1);
  128.                        
  129.                         //获取三个按钮的根节点,如果没有,则创建一个
  130.                         var bnt_content=document.querySelector(".bnt_content");
  131.                         if(bnt_content==null)
  132.                         {
  133.                                 bnt_content=document.createElement("dd");
  134.                                 bnt_content.className="bnt_content";
  135.                                 var card_text=document.querySelector(".card_text");
  136.                                 var card_dl=card_text.querySelector("dl");
  137.                                 card_dl.appendChild(bnt_content);
  138.                         }
  139.                         var bnt_innerHtml=bnt_content.innerHTML;
  140.                         var d=getValueFromUrl("&d");
  141.                         var dxid=getValueFromUrl("dxNumber");
  142.                         /*有待解决d值的问题
  143.                         if(bnt_innerHtml.indexOf("图书馆文献传递")==-1)
  144.                         {
  145.                                 var wxcd=document.createElement("a");
  146.                                 wxcd.title="功能将您需要的全文发送到您的邮箱!";
  147.                                 wxcd.className="bnt_book leftF";
  148.                                 var wxcdUrl="javaScript:subtoRefer(true,'/gofirstdrs.jsp?dxNumber=";
  149.                                 wxcdUrl+=dxid+"&d="+d+"')";
  150.                                 wxcd.href=wxcdUrl;
  151.                                 wxcd.innerHTML="图书馆文献传递";
  152.                                 if(bnt_innerHtml.indexOf("部分阅读")==-1)
  153.                                 {
  154.                                         bnt_content.appendChild(wxcd);
  155.                                 }
  156.                                 else
  157.                                 {
  158.                                         bnt_content.insertBefore(wxcd,wxcd.firstElementChild);
  159.                                 }
  160.                         }
  161.                         */
  162.                         //部分阅读按钮
  163.                         if(bnt_innerHtml.indexOf("部分阅读")==-1)
  164.                         {
  165.                                 var bfydurl="http://book.duxiu.com/readDetail.jsp?dxNumber=";
  166.                                 bfydurl+=dxid;
  167.                                 bfydurl+="&";
  168.                                 bfydurl+="d="+d;

  169.                                 var bfyd=document.createElement("a");
  170.                                 bfyd.href=bfydurl;
  171.                                 bfyd.className="bnt_book leftF";
  172.                                 bfyd.innerHTML="部分阅读";
  173.                                 bnt_content.appendChild(bfyd);
  174.                         }

  175.                         //显示查询藏馆按钮
  176.                         var csgbutton=document.createElement("a");
  177.                         var oldstr="bookDetail.jsp?dxNumber=";
  178.                         var newstr="book.do?go=showmorelib&type=1&dxid=";
  179.                         var newAnchor="http://180.76.236.241:8089/sscx="+ssid;
  180.                         csgbutton.href=newAnchor;
  181.                         csgbutton.className="bnt_book leftF";
  182.                         csgbutton.innerHTML="存货查询";
  183.                         bnt_content.appendChild(csgbutton);
  184.                 }
  185.                 //深圳文献港,图书馆参考联盟图书信息页
  186.                 else {
  187.                         //获取ssid
  188.                         var tubookimg=document.querySelector(".tubookimg");
  189.                         var imgsrc=tubookimg.querySelector("img").src;
  190.                         var ssid=GetSSID(imgsrc);
  191.                         //创建插入节点
  192.                         var ssNode=CreateSSIDNode(ssid);
  193.                         tubookimg.appendChild(ssNode);

  194.                         //显示查询藏馆按钮
  195.                         var csgbutton=document.createElement("a");
  196.                         var dxid=getValueFromUrl("dxNumber");
  197.                         var dvalue=getValueFromUrl("&d");
  198.                         var myhref="http://180.76.236.241:8089/sscx=";
  199.                         myhref+=ssid;
  200.                        
  201.                         csgbutton.href=myhref;
  202.                         csgbutton.target="_blank";
  203.                         csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  204.                         csgbutton.innerHTML="存货查询";
  205.                         var pTemp=document.createElement("p");
  206.                         pTemp.style="text-align:center;";
  207.                         pTemp.appendChild(csgbutton);
  208.                         tubookimg.appendChild(pTemp);
  209.                 }
  210.         }

  211.         //高级搜索页面显示ssid
  212.         if (myurl.indexOf("advsearch") != -1) {
  213.                 //定义按钮
  214.                 var btnSSID = document.createElement("input");
  215.                 btnSSID.id = "btnshowSSID";
  216.                 btnSSID.class = "btnInput";
  217.                 btnSSID.type = "button";
  218.                 btnSSID.onclick = showAdvSS;
  219.                 btnSSID.value = "显示SS";
  220.                 btnSSID.style = "width:85px;height:27px;";

  221.                 //获取插入点,并插入
  222.                 var searchinfoDiv = document.getElementById("searchinfo");
  223.                 searchinfoDiv.appendChild(btnSSID);
  224.         }
  225.        
  226.         //电子书导航页
  227.         if(myurl.indexOf("book.do?go=guide")!=-1)
  228.         {
  229.                 var ulLists=document.getElementsByTagName("ul");
  230.                 var ulBooks=null;
  231.                 for(var i=0;i<ulLists.length;i++)
  232.                 {
  233.                         if(ulLists[i].className=="clearfix")
  234.                         {
  235.                                 ulBooks=ulLists[i];
  236.                         }
  237.                 }
  238.                 if(ulBooks!=null)
  239.                 {
  240.                         var bookLists=ulBooks.querySelectorAll("li");
  241.                         for(var j=0;j<bookLists.length;j++)
  242.                         {
  243.                                 var ImgDiv=bookLists[j].getElementsByClassName("divImg");
  244.                                 if(ImgDiv.length!=0)
  245.                                 {
  246.                                         var imgNode=ImgDiv[0];
  247.                                         var covimgs=imgNode.getElementsByTagName("img");
  248.                                         if(covimgs.length!=0)
  249.                                         {
  250.                                                 var covimg=covimgs[0];
  251.                                                 var imghref=covimg.src;
  252.                                                 var ssid = GetSSID(imghref);
  253.                                                 var ssidNode=CreateSSIDNode(ssid);
  254.                                                 imgNode.appendChild(ssidNode);
  255.                                         }
  256.                                 }

  257.                         }
  258.                 }
  259.         }

  260.         //电子书检索页
  261.         if(myurl.indexOf("searchEBook?")!=-1)
  262.         {
  263.                 var mybooks=document.querySelector(".books");
  264.                 var myBookLists=mybooks.querySelectorAll("li");
  265.                 for(var i=0;i<myBookLists.length;i++)
  266.                 {
  267.                         //调整列表最小高度
  268.                         var listDL=myBookLists[i].querySelector("dl");
  269.                         listDL.style.minHeight="190px";

  270.                         //获取ssid
  271.                         var ssid=GetSSIDDXID("ssid" + i,"dxid_" + i);

  272.                         //创建插入节点
  273.                         var ssNode=CreateSSIDNode2(ssid,"myssid"+i);

  274.                         var divImg=myBookLists[i].querySelector(".divImg");
  275.                         divImg.appendChild(ssNode);
  276.                 }
  277.         }
  278.         //藏馆页面
  279.         if(myurl.indexOf("book.do?go=showmorelib")!=-1)
  280.         {
  281.                 //显示ssid部分
  282.                 var headDiv=document.querySelector(".header");
  283.                 var flDiv=headDiv.querySelector("img");
  284.                 var imgSrc=flDiv.src;
  285.                 var ssid=GetSSID(imgSrc);
  286.                 var ssidLi=document.createElement("li");
  287.                 ssidLi.style="color:red;font-weight:bold;";
  288.                 console.log(ssid);
  289.                 console.log(ssid.length);
  290.                 if(ssid.length==8)
  291.                 {
  292.                         ssidLi.innerHTML="【SS号】"+ssid;
  293.                 }
  294.                 else
  295.                 {
  296.                         ssidLi.innerHTML="【DX号】"+ssid;
  297.                 }
  298.                 var infoUL=headDiv.querySelector("ul");
  299.                 var insertPoint=infoUL.firstElementChild.nextElementSibling;
  300.                 infoUL.insertBefore(ssidLi,insertPoint);

  301.                 //统一按钮风格
  302.                 var btnStyle= "min-width:90px;height:28px;margin-left:10px;font-weight:bold;color:red;";
  303.                 //显示切换按钮
  304.                 var switchButton=document.createElement("input");
  305.                 switchButton.id = "switchSCG";
  306.                 switchButton.type = "button";
  307.                 switchButton.onclick = switchSCG;
  308.                 if(myurl.indexOf("&type=1")!=-1)
  309.                 {
  310.                         switchButton.value = "纸质藏馆";
  311.                 }
  312.                 else
  313.                 {
  314.                         switchButton.value = "存货查询";
  315.                 }
  316.                 switchButton.style = btnStyle;
  317.                 var tabDiv=document.querySelector(".tab");
  318.                 tabDiv.appendChild(switchButton);

  319.                 //返回按钮
  320.                 var returnButton=document.createElement("input");
  321.                 returnButton.id="returnBtn";
  322.                 returnButton.type="button";
  323.                 returnButton.style =btnStyle;
  324.                 returnButton.onclick=returnBookDetail;
  325.                 returnButton.value="返回BookDetail";
  326.                 tabDiv.appendChild(returnButton);

  327.                 //试读按钮
  328.                 var sd=document.createElement("input");
  329.                 sd.id="sd";
  330.                 sd.type="button";
  331.                 sd.style= btnStyle;
  332.                 sd.value="试读";
  333.                 sd.onclick=sdtz;
  334.                 tabDiv.appendChild(sd);
  335.         }

  336.         //包库搜索页面显示ssid
  337.         if(myurl.indexOf("book/search")!=-1)
  338.         {
  339.                 var ztbg=document.querySelector("div[class='ztbg']");
  340.                 var h2Status=ztbg.querySelector("h2[class='fl zli_t']");
  341.                 var insertPoint=h2Status.nextElementSibling;
  342.                 //定义按钮
  343.                 var btnSSID = document.createElement("input");
  344.                 btnSSID.id = "btnshowSSID";
  345.                 btnSSID.class = "btnInput";
  346.                 btnSSID.type = "button";
  347.                 btnSSID.onclick = GetBaoKuSSID;
  348.                 btnSSID.value = "显示SSID";
  349.                 btnSSID.style = "width:85px;height:30px;color:red;margin-left:15px;";
  350.                 ztbg.insertBefore(btnSSID,insertPoint);
  351.         }

  352.         //试读页显示封面、书名、版权、封底四个按钮
  353.         if(myurl.indexOf("/n/jpgfs/book/base/")!=-1)
  354.         {
  355.                 var jpath="";
  356.                 var mySource=document.querySelector("html").outerHTML;
  357.                 var istart=0;
  358.                 var iend=0;
  359.                 var myIndexStr1="jpgPath:"";
  360.                 var myIndexStr2=""";
  361.                 istart=mySource.indexOf(myIndexStr1);
  362.                 istart+=myIndexStr1.length;
  363.                 iend=mySource.indexOf(myIndexStr2,istart);
  364.                 jpath=mySource.substring(istart,iend);

  365.                 var baseUrl="http://img.duxiu.com";
  366.                 var myCovUrl=baseUrl+jpath+"cov001?zoom=2";
  367.                 var myBokUrl=baseUrl+jpath+"bok001?zoom=2";
  368.                 var myLegUrl=baseUrl+jpath+"leg001?zoom=2";
  369.                 var myBacUrl=baseUrl+jpath+"cov002?zoom=2";
  370.                
  371.                 console.log("封面页:"+myCovUrl);
  372.                 console.log("书名页:"+myBokUrl);
  373.                 console.log("版权页:"+myLegUrl);
  374.                 console.log("封底页:"+myBacUrl);

  375.                 var t_content=document.querySelector("#t_content");
  376.                 t_content.style="width:815px;";
  377.                 var tc_right=document.querySelector("#tc_right");
  378.                 tc_right.style="width:240px;";
  379.                 var myul=tc_right.querySelector("ul");

  380.                 var cov001li=addALink(myCovUrl,"cov001","封面","cov001.pdg");
  381.                 cov001li.style.marginTop="7px";
  382.                 myul.appendChild(cov001li);

  383.                 var bok001li=addALink(myBokUrl,"bok001","书名","bok001.pdg");
  384.                 bok001li.style.marginTop="7px";
  385.                 myul.appendChild(bok001li);

  386.                 var leg001li=addALink(myLegUrl,"leg001","版权","leg001.pdg");
  387.                 leg001li.style.marginTop="7px";
  388.                 myul.appendChild(leg001li);

  389.                 var cov002li=addALink(myBacUrl,"cov002","封底","cov002.pdg");
  390.                 cov002li.style.marginTop="7px";
  391.                 myul.appendChild(cov002li);

  392.                 var oneKeyDown=document.createElement("li");
  393.                         oneKeyDown.style="margin-top: 7px;margin-left:6px;";
  394.                 var oneKeyDownlink=document.createElement("a");
  395.                         oneKeyDownlink.id="oneKeyDown";
  396.                         oneKeyDownlink.style="color: red;font-weight:bold;cursor: pointer;";
  397.                         oneKeyDownlink.innerHTML="一键下载";
  398.                         oneKeyDownlink.href="#";
  399.                         oneKeyDownlink.onclick=OneKeyDownAll;
  400.                 oneKeyDown.appendChild(oneKeyDownlink);
  401.                 myul.appendChild(oneKeyDown);
  402.         }

  403.         //包库在线阅读页显示封面、书名、版权、封底四个按钮
  404.         if(myurl.indexOf("/n/slib/book/slib/")!=-1)
  405.         {
  406.                 var jpath="";
  407.                 var mySource=document.querySelector("html").outerHTML;
  408.                 var istart=0;
  409.                 var iend=0;
  410.                 var myIndexStr1="jpgPath: "";
  411.                 var myIndexStr2=""";
  412.                 istart=mySource.indexOf(myIndexStr1);
  413.                 istart+=myIndexStr1.length;
  414.                 iend=mySource.indexOf(myIndexStr2,istart);
  415.                 jpath=mySource.substring(istart,iend);
  416.                 console.log(jpath);
  417.                 var baseUrl="http://img.sslibrary.com";
  418.                 var myCovUrl=baseUrl+jpath+"cov001?zoom=2";
  419.                 var myBokUrl=baseUrl+jpath+"bok001?zoom=2";
  420.                 var myLegUrl=baseUrl+jpath+"leg001?zoom=2";
  421.                 var myBacUrl=baseUrl+jpath+"cov002?zoom=2";
  422.                
  423.                 console.log("封面页:"+myCovUrl);
  424.                 console.log("书名页:"+myBokUrl);
  425.                 console.log("版权页:"+myLegUrl);
  426.                 console.log("封底页:"+myBacUrl);

  427.                 var ToolsBar=document.querySelector(".ToolsBar");
  428.                 var myul=ToolsBar.querySelector("ul");
  429.                 myul.style.width="1366px";


  430.                 var cov001li=addALink(myCovUrl,"cov001","封面","cov001.pdg");
  431.                 myul.appendChild(cov001li);

  432.                 var bok001li=addALink(myBokUrl,"bok001","书名","bok001.pdg");
  433.                 myul.appendChild(bok001li);

  434.                 var leg001li=addALink(myLegUrl,"leg001","版权","leg001.pdg");
  435.                 myul.appendChild(leg001li);

  436.                 var cov002li=addALink(myBacUrl,"cov002","封底","cov002.pdg");
  437.                 myul.appendChild(cov002li);

  438.                 var oneKeyDown=document.createElement("li");
  439.                         oneKeyDown.style="margin-left:6px;";
  440.                 var oneKeyDownlink=document.createElement("a");
  441.                         oneKeyDownlink.id="oneKeyDown";
  442.                         oneKeyDownlink.style="color: red;font-weight:bold;cursor: pointer;";
  443.                         oneKeyDownlink.innerHTML="一键下载";
  444.                         oneKeyDownlink.href="#";
  445.                         oneKeyDownlink.onclick=OneKeyDownAll;
  446.                 oneKeyDown.appendChild(oneKeyDownlink);
  447.                 myul.appendChild(oneKeyDown);
  448.         }
  449. }};


  450. function GetBaoKuSSID()
  451. {
  452.         var myssids=document.querySelectorAll("#myssid");
  453.         if(myssids.length!=0)
  454.         {
  455.                 return;
  456.         }
  457.         else
  458.         {
  459.                 var mybooklist=document.querySelectorAll("ul[class='clearfix zli_item']");
  460.                 for(var i=0;i<mybooklist.length;i++)
  461.                 {
  462.                         var mybook=mybooklist[i].querySelector("li[class='fl zli_img']");
  463.                         var bookimg=mybook.querySelector("img");
  464.                         var myimgSrc=bookimg.src;
  465.                         console.log(myimgSrc);
  466.                         var myssid=GetSSID(myimgSrc);
  467.                         console.log(myssid);
  468.                         var ssidNode=CreateSSIDNode(myssid);
  469.                         mybook.appendChild(ssidNode);
  470.                 }
  471.         }
  472. }

  473. function OneKeyDownAll()
  474. {
  475.         var mylinksId=new Array("cov001","bok001","leg001","cov002");
  476.         for(var i=0;i<mylinksId.length;i++)
  477.         {
  478.                 var mylink=document.getElementById(mylinksId[i]);
  479.                 mylink.click();
  480.         }
  481. }

  482. function addALink(urlStr,myIdStr,innerHTMLStr,downloadName)
  483. {
  484.         var myli=document.createElement("li");
  485.         myli.style="margin-left:6px;";
  486.         var alink=document.createElement("a");
  487.         alink.id=myIdStr;
  488.         alink.innerHTML=innerHTMLStr;
  489.         alink.href=urlStr;
  490.         alink.style="color: green;font-weight:bold;cursor: pointer;";
  491.         alink.download=downloadName;
  492.         myli.appendChild(alink);
  493.         return myli;
  494. }

  495. //切换藏书查询
  496. function switchSCG()
  497. {
  498.         var newurl="";
  499.         if(myurl.indexOf("&type=1")!=-1)
  500.         {
  501.                 newurl=myurl.replace("&type=1","");
  502.         }
  503.         else
  504.         {
  505.                 newurl=myurl+"&type=1";
  506.         }
  507.         window.location.href=newurl;
  508. }


  509. //跳转试读页
  510. function sdtz()
  511. {
  512.         var d=getValueFromUrl("&d");
  513.         var dxid=getValueFromUrl("&dxid");
  514.         newurl="http://book.duxiu.com/readDetail.jsp?dxNumber=";
  515.         newurl+=dxid;
  516.         newurl+="&";
  517.         newurl+="d="+d;
  518.         window.open(newurl,"_blank");
  519. }

  520. //返回bookdetail
  521. function returnBookDetail()
  522. {
  523.         var d=getValueFromUrl("&d");
  524.         var dxid=getValueFromUrl("&dxid");
  525.         newurl="http://book.duxiu.com/bookDetail.jsp?dxNumber=";
  526.         newurl+=dxid;
  527.         newurl+="&";
  528.         newurl+="d="+d;
  529.         window.location.href=newurl;
  530. }
  531. //从当前网址中提取某个字段,输入字段名称
  532. function getValueFromUrl(myfield)
  533. {
  534.         var str=myfield+"=";
  535.         if(myurl.indexOf(str)!=-1)
  536.         {
  537.                 var reg =new RegExp(myfield+"\\=\\w+");
  538.                
  539.                 var fieldStr = myurl.match(reg)[0];
  540.                 console.log(myfield.toString());
  541.                 var fieldValue = fieldStr.replace(myfield+"=", "");
  542.                 return fieldValue;
  543.         }
  544. }

  545. //从当前网址中提取某个字段,输入字段名称
  546. function getValueFromUrl2(URL,myfield)
  547. {
  548.         var str=myfield+"=";
  549.         if(URL.indexOf(str)!=-1)
  550.         {
  551.                 var reg =new RegExp(myfield+"\\=\\w+");
  552.                
  553.                 var fieldStr = URL.match(reg)[0];
  554.                 var fieldValue = fieldStr.replace(myfield+"=", "");
  555.                 return fieldValue;
  556.         }
  557. }

  558. //获取ssid或者dxid,当ssid不存在的时候,返回dxid
  559. //输入ssid的元素id以及读秀dxid的元素id
  560. function GetSSIDDXID(ssidNodeID,dxidNodeID)
  561. {
  562.         //获取ssid
  563.         var ssid=GetSSIDByID(ssidNodeID,"value");

  564.         //获取dxid
  565.         var dxid=GetSSIDByID(dxidNodeID,"value");
  566.        
  567.         //如果ssid不存在,则用dxid替代
  568.         if (ssid == "") {
  569.                 ssid = dxid;
  570.         }
  571.         return ssid;
  572. }
  573. //获取ssid,输入元素的id、属性名称(一般为value)
  574. function GetSSIDByID(elementID,strAttribute)
  575. {
  576.         var ssidNode=document.getElementById(elementID);
  577.         var ssid=ssidNode.getAttribute(strAttribute);
  578.         return ssid;
  579. }
  580. //创建默认的ssid节点,节点id为myssid
  581. function CreateSSIDNode(ssid)
  582. {
  583.         var myid='myssid';
  584.         return CreateSSIDNode2(ssid,myid);
  585. }
  586. //创建ssid节点,输入ssid和节点id
  587. function CreateSSIDNode2(ssid,strID)
  588. {
  589.         var ssNode = document.createElement("p");
  590.         ssNode.id=strID;
  591.         ssNode.style=mystyle;
  592.         ssNode.innerHTML=ssid;
  593.         return ssNode;
  594. }

  595. //高级搜索页面显示ssid
  596. function showAdvSS() {
  597.         //获取图书节点
  598.         var mybooks = document.getElementsByClassName("books")[0];
  599.         var booklists=mybooks.getElementsByTagName("li");
  600.         for (var i = 0; i < booklists.length; i++) {
  601.                 //判断是否存在,如果存在,则跳过
  602.                 var myssid = document.getElementById("myssid" + i);
  603.                 if (myssid != null) {
  604.                         continue;
  605.                 }
  606.                 //获取ssid
  607.                 var ssid=GetSSIDDXID("ssid" + i,"dxid" + i);

  608.                 //创建插入节点
  609.                 var ssNode=CreateSSIDNode2(ssid,"myssid"+i);

  610.                 //修改dl最低高度
  611.                 var listDL=booklists[i].querySelector("dl");
  612.                 listDL.style.minHeight="210px";

  613.                 //插入数据
  614.                 var divImg=booklists[i].getElementsByClassName("divImg")[0];

  615.                 var infoAnchor=divImg.querySelector("a").href;
  616.                 var oldstr="bookDetail.jsp?dxNumber=";
  617.                 var newstr="book.do?go=showmorelib&type=1&dxid=";
  618.                 var scgAnchor="http://180.76.236.241:8089/sscx="+ssid;
  619.                 //存货查询
  620.                 var csgbutton=document.createElement("a");
  621.                 csgbutton.href=scgAnchor;
  622.                 csgbutton.target="_blank";
  623.                 csgbutton.style="color:green;font-size:15px;font-weight:bold;text-decoration:none;";
  624.                 csgbutton.innerHTML="存货查询";
  625.                 var csgP=document.createElement("p");
  626.                 csgP.style="text-align:center;";
  627.                 csgP.appendChild(csgbutton);

  628.                 divImg.appendChild(ssNode);
  629.                 divImg.appendChild(csgP);
  630.         }
  631. }

  632. function GetSSID(strImgSrc) {
  633.         var ssid = "";
  634.     var iidStr=GetEncode(strImgSrc);
  635.     var ssidStr = DeCode(iidStr);
  636.     ssid = TrimString(ssidStr);
  637.     return ssid;
  638. }

  639. function GetEncode(strImgSrc) {
  640.     var reg = /iid\=\w+/;
  641.     var iidStr = strImgSrc.match(reg)[0];
  642.     iidStr = iidStr.replace("iid=", "");
  643.     return iidStr;
  644. }

  645. function TrimString(inputStr) {
  646.     var outPutStr = "";
  647.     inputStr = inputStr.replace(/\//g, "");
  648.     var reg = /\d{8,}/;
  649.         outPutStr = inputStr.match(reg);
  650.         outPutStr=outPutStr.toString();
  651.     return outPutStr;
  652. }

  653. function DeCode(EnCodeStr) {
  654.     var decodeStr = "";
  655.     var baseNumStr = EnCodeStr.substring(EnCodeStr.length - 2);
  656.     var baseNum = parseInt(baseNumStr, 16);
  657.     var myCodeStr = EnCodeStr.substring(0, EnCodeStr.length - 16);
  658.     for (var i = 0; i < myCodeStr.length; i = i + 2) {
  659.         decodeStr += GetSubString(myCodeStr, baseNum, i);
  660.     }
  661.     return decodeStr;
  662. }

  663. function GetSubString(EnCodeStr, BaseNum, startIndex) {
  664.     var s = "";
  665.     s = EnCodeStr.substring(startIndex, startIndex + 2);
  666.     //转换进制
  667.     var i = parseInt(s, 16) - BaseNum;
  668.     s = String.fromCharCode(i);
  669.     return s;
  670. }

  671. try {
  672.         app.run();
  673. } catch (e) {
  674.         console.log(e);
  675. }
复制代码
发表于 2019-9-13 01:54:50 | 显示全部楼层
回复 2# Batcher


    浏览器脚本都是JS,chrome还有暴力猴Violentmonkey可以用,装了之后支持浏览器脚本。
发表于 2019-9-29 17:44:05 | 显示全部楼层
油猴还是很好用的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:52 , Processed in 0.013992 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表