百度云插件+APIKey

在百度云网盘的页面添加一个搜索框,调用搜索API搜索所有公开分享文件// To add a search frame that calls some api for searching some public shared files in BaiduYun cloud netdisk.

  1. // ==UserScript==
  2. // @name 百度云插件+APIKey
  3. // @namespace
  4. // @version 5.0.3
  5. // @description 在百度云网盘的页面添加一个搜索框,调用搜索API搜索所有公开分享文件// To add a search frame that calls some api for searching some public shared files in BaiduYun cloud netdisk.
  6. // @description For more imformation,please email me at wanghsinche@hotmail.com.
  7. // @include /https?\:\/\/(pan|yun)\.baidu\.com.*/
  8. // @grant GM_xmlhttpRequest
  9. // @run-at document-end
  10. // @copyright 2014,04,20 __By Wang Hsin-che
  11. // ==/UserScript==
  12.  
  13. /*thanks to the tutorial of mvc at
  14. https://alexatnet.com/articles/model-view-controller-mvc-javascript*/
  15.  
  16.  
  17. //Event is a simple class for implementing the Observer pattern:
  18. function Event(sender) {
  19. this._sender = sender;
  20. this._listeners = [];
  21. }
  22.  
  23. Event.prototype = {
  24. attach : function (listener) {//push the callback function into _listeners[];
  25. this._listeners.push(listener);
  26. },
  27. notify : function (args) {//pop all the callback functions and execute the functions with same args?
  28. var index;
  29.  
  30. for (index = 0; index < this._listeners.length; index += 1) {
  31. this._listeners[index](this._sender, args);//auto pass sender and args into callback function, so the default form of callback function is function(sender,args){}
  32. }
  33. }
  34. };
  35.  
  36. //Javascript-template-engine-in-just-20-line
  37. //by by Krasimir http://krasimirtsonev.com/blog/article/Javascript-template-engine-in-just-20-line
  38. var TemplateEngine = function(html, options) {
  39. var re = /<%([^%>]+)?%>/g, reExp = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g, code = 'var r=[];\n', cursor = 0, match;
  40. var add = function(line, js) {
  41. js? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
  42. (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
  43. return add;
  44. };
  45. while(match = re.exec(html)) {
  46. add(html.slice(cursor, match.index))(match[1], true);
  47. cursor = match.index + match[0].length;
  48. }
  49. add(html.substr(cursor, html.length - cursor));
  50. code += 'return r.join("");';
  51. return new Function(code.replace(/[\r\t\n]/g, '')).apply(options);
  52. };
  53.  
  54. /**
  55. * The Model. Model stores items and notifies
  56. * observers about changes.
  57. */
  58.  
  59. var BaseModel=function(engineLst){
  60. this.keyword="";
  61. this.engine="default";
  62. this.engineLst=engineLst;
  63. this.jsonObj={
  64. cursor: {
  65. estimatedResultCount: 0,
  66. resultCount: 0 },
  67. results: []
  68. };
  69. this.curr=1;
  70. this.totalPage=1;
  71. this.urls={default:'http://',};
  72. this.state=false;
  73. this.contentUpdated=new Event(this);
  74. this.requestEvent=new Event(this);
  75. };
  76. BaseModel.prototype={
  77. setEngine:function(engine){
  78. var tempObj = {};
  79. this.engine=engine;
  80. tempObj['engine'] = engine;
  81. window.localStorage.setItem('wxzYunpanSearcher',JSON.stringify(tempObj));
  82. tempObj = null;
  83. },
  84. updateCurr:function(curr){
  85. this.curr=curr;
  86. },
  87. updateKeyword:function(keyword){
  88. this.keyword=keyword;
  89. },
  90. request:function(){
  91. this.requestEvent.notify();
  92. var _this=this;
  93. GM_xmlhttpRequest({
  94. method: "GET",
  95. url: _this.compileUrl[_this.engine](_this),
  96. headers: {
  97. "User-Agent": "Mozilla/5.0", // If not specified, navigator.userAgent will be used.
  98. "Accept": "text/xml" // If not specified, browser defaults will be used.
  99. },
  100. onload: function(response) {
  101. _this.jsonObj=_this.toJson[_this.engine](response.responseText);
  102. _this.totalPage=(parseInt(_this.jsonObj.cursor.resultCount)-parseInt(_this.jsonObj.cursor.resultCount)%10)/10+1;
  103. _this.state=true;
  104. var _self=_this;
  105. _this.contentUpdated.notify(_self.state);
  106. },
  107. onerror: function() {
  108. _this.jsonObj={
  109. cursor: {
  110. estimatedResultCount: 0,
  111. resultCount: 0 },
  112. results: []
  113. };
  114. _this.totalPage=1;
  115. _this.state=false;
  116. var _self=_this;
  117. _this.contentUpdated.notify(_self.state);
  118. }
  119. });
  120. },
  121. destory:function(){
  122. this.jsonObj={};
  123. this.totalPage=0;
  124. this.state=false;
  125. this.curr=0;
  126. this.keyword="";
  127. },
  128. toJson:{
  129. default:function(text){
  130. var jsonObj = {
  131. cursor: {
  132. estimatedResultCount: 0,
  133. resultCount: 0 },
  134. results: []
  135. };
  136.  
  137. return jsonObj;
  138. },
  139. },
  140. compileUrl:{
  141. default:function(_this){
  142. return _this.url + _this.keyword + '+site%3Apan.baidu.com' + '&first=' + _this.curr;
  143. },
  144. },
  145. };
  146.  
  147. var Viewer=function(model,UIelements){
  148. this.model=model;
  149. this.UI=UIelements;
  150. this.searchClick=new Event(this);
  151. this.closeClick=new Event(this);
  152. this.nextClick=new Event(this);
  153. this.preClick=new Event(this);
  154. this.toPageClick=new Event(this);
  155. this.engineOptChange=new Event(this);
  156. var bodyNode = document.querySelector('body');
  157. var _self=this;
  158. this.UI.searchBtn.addEventListener('click',function(event) {
  159. /* Act on the event */
  160. var curr=1;
  161. var keyword=_self.UI.inputEle.value;
  162. if(keyword.replace(/\s*/,'')!==''){
  163. _self.searchClick.notify({curr:curr,keyword:keyword});
  164. }
  165. });
  166. this.UI.closeBtn.addEventListener('click',function(event) {
  167. /* Act on the event */
  168. _self.closeClick.notify();
  169. });
  170. // this.UI.inputEle.addEventListener('keyup',function(event) {
  171. // var clickEvent = new MouseEvent("click");
  172. // if (event.which == 13) {
  173. // _self.UI.searchBtn.dispatchEvent(clickEvent);
  174. // }
  175. // clickEvent = null;
  176. // });
  177. bodyNode.addEventListener('click',function(event){
  178. if (event.target.className.indexOf(_self.UI.engineBtnClassName) !== -1 ) {
  179. _self.engineOptChange.notify(event.target.getAttribute('data-engine'));
  180. }
  181. if (event.target.className.indexOf(_self.UI.toPageBtnClassName) !== -1 ) {
  182. _self.toPageClick.notify(parseInt(event.target.getAttribute('data-page'),10));
  183. }
  184. });
  185. };
  186. Viewer.prototype={
  187. refleshEngineLst:function(){
  188. var template='<%for(var i in this){%>'+
  189. '<li node-type="click-ele" data-engine="<%this[i]%>" class="li wxz-menu-option">'+
  190. 'by <%this[i]%>'+
  191. '</li>'+
  192. '<%}%>';
  193. var html=TemplateEngine(template,this.model.engineLst);
  194. this.UI.engineLst.innerHTML = html;
  195. },
  196. updateEngine:function(){
  197. this.UI.menu.textContent = this.model.engine;
  198. },
  199. show:function(){
  200. this.UI.myDiv.style.display = 'block';
  201. this.UI.bgNode.style.display = 'block';
  202. this.UI.myDiv.style.top = '50%';
  203. this.UI.myDiv.style.marginTop = (this.UI.myDiv.clientHeight / 2 * -1) + 'px';
  204. },
  205. reflesh:function(success){
  206. var template="<p align='right'>---- by <%this.engine%>.com Search </p><p white-space='normal' class='temp' >keyword is '<%this.keyword%>' found '<%this.jsonObj.cursor.resultCount%>' Results</p><p>--------------------------------------------------<p>";
  207. template+='<%for(var i in this.jsonObj.results){%>'+
  208. '<p><p class="myTitle">'+
  209. '<a href="<%this.jsonObj.results[i].unescapedUrl%>"target="_blank"><%this.jsonObj.results[i].titleNoFormatting%></a>'+
  210. '</p>'+
  211. '<p class="mySnippet"><%this.jsonObj.results[i].contentNoFormatting%></p>'+
  212. '<%}%>';
  213. template+='<p><p>-------------------------------------------------------------<p class="temp" margin-left="20px">" <%this.jsonObj.results.length%> " items have been load </p>';
  214. var html;
  215. if(success===false){
  216. html='<div class="loading-tips" align="center">出错了......</div>';
  217. }else{
  218. if(this.model.jsonObj.results.length===0){
  219. html='<div class="loading-tips" align="center">无搜索结果...换个关键词重新试试?</div>';
  220. }else{
  221. html=TemplateEngine(template,this.model);
  222. }
  223. }
  224.  
  225. this.UI.myContent.innerHTML = html;
  226. },
  227. close:function(){
  228. this.UI.myDiv.style.display = 'none';
  229. this.UI.bgNode.style.display = 'none';
  230. this.UI.inputEle.value = '';
  231. },
  232. loading:function(){
  233. this.UI.myContent.innerHTML = '<img width="600px" src="data:image/gif;base64,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" />';
  234. },
  235. refleshPageNavi:function(){
  236. var page={curr:1,totalPage:1,pre:true,next:true,lst:[]};
  237. page.curr=this.model.curr;
  238. page.totalPage=this.model.totalPage>=10?10:this.model.totalPage;
  239. page.pre=page.curr>1?true:false;
  240. page.next=page.totalPage>page.curr?true:false;
  241. for(var i=1;i<=page.totalPage;i++){
  242. page.lst.push(i);
  243. }
  244. var template= '\
  245. <div class="pagese "id="wxz-pagese">\
  246. <span class="page-content">\
  247. <a href="javascript:void(0)" class=" <% if(this.pre){ %> page-number <%}else{%> global-disabled <%}%> mou-evt" data-page="<%this.curr-1%>">上一页</a>\
  248. <%for(var i in this.lst){%>\
  249. <span class="page-number <%if(this.lst[i]==this.curr){%> global-disabled <%}%>" data-page="<%this.lst[i]%>"><%this.lst[i]%></span>\
  250. <%}%>\
  251. </span>\
  252. <a href="javascript:void(0)" class=" <% if(this.next){ %> page-number <%}else{%> global-disabled <%}%> mou-evt" data-page="<%this.curr+1%>">下一页</a>\
  253. </div>\
  254. ';
  255. var html=TemplateEngine(template,page);
  256. this.UI.pagese.innerHTML = html;
  257. }
  258. };
  259.  
  260.  
  261. var Controller=function(model,viewer){
  262. this.model=model;
  263. this.viewer=viewer;
  264.  
  265. var _self=this;
  266.  
  267. this.viewer.searchClick.attach(function(sender,args){
  268. _self.search(args.curr,args.keyword);
  269. });
  270. this.viewer.closeClick.attach(function(){
  271. _self.close();
  272. });
  273. this.viewer.engineOptChange.attach(function(sender,args){
  274. _self.setEngine(args);
  275. });
  276. this.viewer.toPageClick.attach(function(sender,args){
  277. _self.toPage(args);
  278. });
  279.  
  280. this.model.requestEvent.attach(function(){
  281. _self.loading();
  282. });
  283. this.model.contentUpdated.attach(function(state){
  284. _self.reflesh(state);
  285. });
  286.  
  287. };
  288. Controller.prototype={
  289. search:function(curr,args){
  290. this.model.updateCurr(curr);
  291. this.model.updateKeyword(args);
  292. this.model.request();
  293. this.viewer.show();
  294. },
  295. setEngine:function(engine){
  296. this.model.setEngine(engine);
  297. this.viewer.updateEngine();
  298. },
  299. toPage:function(toPageNum){
  300. this.model.updateCurr(toPageNum);
  301. this.model.request();
  302. },
  303. close:function(){
  304. this.model.destory();
  305. this.viewer.close();
  306. },
  307. loading:function(){
  308. this.viewer.loading();
  309. },
  310. reflesh:function(){
  311. this.viewer.reflesh();
  312. this.viewer.refleshPageNavi();
  313. },
  314. refleshEngineLst:function(){
  315. this.viewer.refleshEngineLst();
  316. },
  317. };
  318.  
  319.  
  320.  
  321. function newInit () {
  322. //remove advs
  323. //create search bar
  324. var targetNode = document.querySelector('.find-light-icon').parentNode.parentNode;
  325. if (targetNode.parentNode.lastChild.getAttribute("node-type")=="header-union") {
  326. targetNode.parentNode.lastChild.remove();
  327. }
  328. var wxzSearchBarNode = document.createElement('dd');
  329. wxzSearchBarNode.setAttribute('class','header-wxzbar header-info');
  330. //wxzSearchBarNode.setAttribute('node-type','header-apps');
  331. wxzSearchBarNode.innerHTML =
  332. '<span class="wxz-menu wxz-dropdown">\
  333. <span class="user-name" id="wxzMenuDisplay">google</span>\
  334. <em class="icon icon-dropdown-arrow"></em>\
  335. <ul class="wxz-menu-content" id="wxz_engineLst">\
  336. </ul>\
  337. </span>\
  338. <form class="search-form" id="wxz_searchForm">\
  339. <input class="search-query" placeholder=" 搜索公开分享文件" id="wxz_input">\
  340. <input type="button" value="GO" class="search-button" id="wxz_searchButton">\
  341. </form>';
  342. //insert after target node
  343. targetNode.parentNode.insertBefore(wxzSearchBarNode,targetNode.nextSlibing);
  344. //background
  345. var wxzbgNode = document.createElement('div');
  346. wxzbgNode.setAttribute('class','wxz-bg');
  347. wxzbgNode.style.display = 'none';
  348. document.querySelector('body').appendChild(wxzbgNode);
  349.  
  350. //create display frame
  351. var wxzDialogNode = document.createElement('div');
  352. wxzDialogNode.setAttribute('class','dialog dialog-gray');
  353. wxzDialogNode.setAttribute('id','wxz_myDiv');
  354. wxzDialogNode.setAttribute('style','z-index:99;postion:absolute;');
  355. wxzDialogNode.style.width = window.innerWidth / 3 * 2 + 'px';
  356. wxzDialogNode.style.left = '50%';
  357. wxzDialogNode.style.marginLeft = (-1 * window.innerWidth / 3) + 'px';
  358. wxzDialogNode.innerHTML =
  359. '\
  360. <div class="dialog-header" id="wxz_myDiv_title">\
  361. <h3 ><span class="dialog-header-title">搜索</span></h3>\
  362. <div class="dialog-control" id="wxz_closeButton"><span class="dialog-icon dialog-close icon icon-close"><span class="sicon">×</span></span></div>\
  363. </div>\
  364. <div class="dlg-bd g-clearfix offline-list-dialog">\
  365. <div class="wxz-content">\
  366. </div>\
  367. <div class="offline-bottom">\
  368. <div class="offline-pageing">\
  369. <div class="pagese " id="wxz-pagese">\
  370. </div>\
  371. </div>\
  372. </div>\
  373. ';
  374.  
  375. //append to body
  376.  
  377. document.querySelector('body').appendChild(wxzDialogNode);
  378.  
  379.  
  380. var wxzStyleNode = document.createElement('style');
  381. wxzStyleNode.textContent =
  382. '\
  383. .wxz-menu{cursor:pointer; height:100%; display:inline-block; vertical-align:middle;position:relative;}\
  384. .wxz-menu:hover .wxz-menu-content{display:block; z-index:99}\
  385. .wxz-menu:hover .icon-dropdown-arrow{transform:rotate(180);}\
  386. .wxz-menu-option{text-align:center;line-height:30px;cursor:pointer;background:white;color:black;border:1px solid #eff4f8;border-collapse: collapse;}\
  387. #wxz_searchForm{display:inline-block; vertical-align:middle;}\
  388. #wxz_input{padding:0 4px; border: 1px solid #c0d9fe;border-radius: 4px;line-height: 22px;}\
  389. #wxz_searchButton{cursor:pointer; background: #3b8cff;border: 2px solid #3b8cff;color: #f8fbff;border-radius: 6px;}\
  390. .wxz-menu-content{display:none; position:absolute;top:100%;left:0;width:80px;}\
  391. #wxzMenuDisplay{line-height: 40px; display:inline-block; width:40px;}\
  392. .wxz-bg{position: fixed; left: 0px; top: 0px; bottom: 0px; right: 0px; z-index: 50; background: rgb(0, 0, 0); opacity: 0.5;}\
  393. .wxz-content{height: 500px;line-height: 200%;text-align: left;white-space: normal;padding:0 10px;overflow:auto;}\
  394. .wxz-close{margin-right:20px;important;height:20px;cursor:pointer}\
  395. .wxz-next{margin-right:20px;float:right;height:20px;cursor:pointer}\
  396. .wxz-front{margin-right:40px;float:right;height:20px;cursor:pointer}\
  397. .wxz-content a{color:#0066FF!important;font: 14px/1.5 arial,sans-serif!important;}\
  398. ';
  399. document.querySelector('head').appendChild(wxzStyleNode);
  400.  
  401.  
  402.  
  403.  
  404. var bdModel=new BaseModel(['bing','google']);
  405.  
  406. bdModel.urls.bing='https://cn.bing.com/search?q=';
  407. bdModel.urls.google='https://www.googleapis.com/customsearch/v1element?key=AIzaSyCVAXiUzRYsML1Pv6RwSG1gunmMikTzQqY&rsz=filtered_cse&num=10&hl=en&prettyPrint=true&source=gcsc&gss=.com&sig=bb73d6800fca299b36665ebff4d01037&cx=018177143380893153305:yk0qpgydx_e&cse_tok=AHKYotWVmvV1wohA3g8oNFAm_6cK:1495660148313&q=';
  408. bdModel.toJson.bing=function(html){
  409. var data = { cursor: { estimatedResultCount: 0, resultCount: 0 }, results: [] };
  410. //其中一条结果:
  411. //<li class="b_algo"><h2>
  412. //<a href="http://pan.baidu.com/wap/link?uk=2923110658&amp;shareid=3468815834&amp;third=3" target="_blank" h="ID=SERP,5101.1">YFK-<strong>RK3368</strong>-8189-20150821.rar_免费高速下载|百度云 网盘 ...</a></h2>
  413. //<div class="b_caption"><p>文件名:YFK-<strong>RK3368</strong>-8189-20150821.rar 文件大小:497.55M 分享者:晨芯FAE 分享时间:2015-8-21 14:07 下载次数:5 ... 登录百度云客户端送2T空间 电脑版</p>
  414. //<div class="b_attribution" u="0|5058|4835271386991248|8OMhcGIIj8GW08I41R5UoSyJpl2_5Pny"><cite><strong>pan.baidu.com</strong>/wap/link?uk=2923110658&amp;shareid=3468815834&amp;...</cite><span class="c_tlbxTrg">
  415. //<span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5102.1"></span></span></div></div></li>
  416. //http://www.jb51.net/article/49083.htm在JS中解析HTML字符串示例代码:
  417. var rawResultHTML = html.match(/<li\sclass="b_algo">(.*?)<\/li>/g);
  418. var b_results = document.createElement('ul');
  419. b_results.innerHTML = rawResultHTML;
  420. var b_algo_Arry = Array.prototype.slice.call(b_results.getElementsByClassName('b_algo'));
  421. b_algo_Arry.forEach(function(ele, index) {
  422. var tempResult = {
  423. unescapedUrl: "",
  424. titleNoFormatting: "",
  425. contentNoFormatting: ""
  426. };
  427. tempResult.unescapedUrl = ele.querySelector('h2 a').getAttribute('href');
  428. tempResult.titleNoFormatting = ele.querySelector('h2 a').textContent;
  429. tempResult.contentNoFormatting = ele.querySelector('.b_caption p').textContent;
  430. data.results.push(tempResult);
  431. });
  432. ////处理统计结果,
  433.  
  434. var rawResultCount=(html.match(/"sb_count">([^<]+)/) && html.match(/"sb_count">([^<]+)/)[1]) || '0';
  435. var matchLst=[];
  436. matchLst=rawResultCount.match(/([0-9]{1,3}(,[0-9]{3})+)/g);
  437. if(matchLst!==null){//匹配100,000,111之类的情况
  438. data.cursor.resultCount=matchLst[0].replace(',','');
  439. }else{
  440. matchLst=rawResultCount.match(/\d+/g);
  441. if(matchLst!==null){//匹配10 个结果之类的情况,以及1-11,共11个的情况
  442. data.cursor.resultCount=matchLst.pop();
  443. }else{//匹配无的情况
  444. data.cursor.resultCount=0;
  445. }
  446. }
  447.  
  448. data.cursor.resultCount = parseInt( data.cursor.resultCount.toString(),10);
  449. data.cursor.estimatedResultCount = data.cursor.resultCount;
  450. return data;
  451. };
  452. bdModel.toJson.google=function(responseText){
  453. var data=JSON.parse(responseText);
  454. data.cursor.resultCount=parseInt(data.cursor.resultCount.split(',').join(''));
  455. return data;
  456. };
  457.  
  458. bdModel.compileUrl.bing=function(_self){
  459. //return 'https://cn.bing.com/search?q=lala+site%3Apan.baidu.com&first=10';
  460. return _self.urls.bing + _self.keyword + '+site%3Apan.baidu.com' + '&first=' + (_self.curr-1)*10;
  461. };
  462. bdModel.compileUrl.google=function(_self){
  463. return _self.urls.google + _self.keyword + '&start=' + (_self.curr-1)*10;
  464. };
  465.  
  466. var bdView=new Viewer(bdModel,{
  467. inputEle:document.querySelector('#wxz_input'),
  468. searchBtn:document.querySelector('#wxz_searchButton'),
  469. closeBtn:document.querySelector('#wxz_closeButton'),
  470. myDiv:document.querySelector('#wxz_myDiv'),
  471. myContent:document.querySelector('.wxz-content'),
  472. menu:document.querySelector('#wxzMenuDisplay'),
  473. engineBtnClassName:'wxz-menu-option',
  474. engineLst:document.querySelector('#wxz_engineLst'),
  475. pagese:document.querySelector('#wxz-pagese'),
  476. toPageBtnClassName:'page-number',
  477. bgNode:wxzbgNode
  478. });
  479. var bdController=new Controller(bdModel,bdView);
  480. bdController.refleshEngineLst();
  481. //这里写的不好
  482. var tempStr = '';
  483. var tempObj;
  484. tempStr = window.localStorage.getItem('wxzYunpanSearcher');
  485. if (tempStr) {
  486. tempObj = JSON.parse(tempStr);
  487. bdController.setEngine(tempObj.engine);
  488. }
  489. else{
  490. bdController.setEngine('bing');
  491. }
  492.  
  493. }
  494.  
  495. var counter = 0;
  496.  
  497. var
  498. t = window.setInterval(function() { //百度云把一些内容放到后面加载,因此我设置了一个延时循环,每隔200ms选择一下所需的元素,当所需的元素存在时,开始脚本,同时停止延时循环
  499. if (document.querySelector(".find-light-icon") !== null) {
  500. window.clearInterval(t);
  501. newInit();
  502. }
  503. else{
  504. if(counter < 100){
  505. console.log('waiting');
  506. counter ++;
  507. }
  508. else{
  509. window.clearInterval(t);
  510. console.log('out of time');
  511. }
  512. }
  513. }, 200);