懒人小说下载器

通用网站内容抓取工具,可批量抓取小说、论坛内容等并保存为TXT文档

当前为 2022-01-01 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name DownloadAllContent
  3. // @name:zh-CN 懒人小说下载器
  4. // @name:zh-TW 懶人小説下載器
  5. // @name:ja 怠惰者小説ダウンロードツール
  6. // @namespace hoothin
  7. // @version 2.6.2
  8. // @description Fetch and download main content on current page, provide special support for chinese novel
  9. // @description:zh-CN 通用网站内容抓取工具,可批量抓取小说、论坛内容等并保存为TXT文档
  10. // @description:zh-TW 通用網站內容抓取工具,可批量抓取小說、論壇內容等並保存為TXT文檔
  11. // @description:ja ユニバーサルサイトコンテンツクロールツール、クロール、フォーラム内容など
  12. // @author hoothin
  13. // @include *
  14. // @grant GM_xmlhttpRequest
  15. // @grant GM_registerMenuCommand
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant unsafeWindow
  19. // @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/1.3.8/FileSaver.min.js
  20. // @license MIT License
  21. // @compatible chrome
  22. // @compatible firefox
  23. // @compatible opera 未测试
  24. // @compatible safari 未测试
  25. // @contributionURL https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=rixixi@sina.com&item_name=Greasy+Fork+donation
  26. // @contributionAmount 1
  27. // ==/UserScript==
  28.  
  29. (function() {
  30. 'use strict';
  31. var indexReg=/PART\b|^Prologue|分卷|Chapter\s*[\-_]?\d+|^序$|^序\s*言|^序\s*章|^前\s*言|^引\s*言|^引\s*子|^摘\s*要|^楔\s*子|^契\s*子|^后\s*记|^後\s*記|^附\s*言|^结\s*语|^結\s*語|^尾\s*声|^最終話|^最终话|^番\s*外|^\d+\s*\D*[^\d#\.]$|^[第(][\d〇零一二三四五六七八九十百千万萬-]+\s*(、|)|章|节|節|回|卷|折|篇|幕|集|话|話)/i;
  32. var innerNextPage=/下一[页頁张張]|next\s*page|次のページ/i;
  33. var lang = navigator.appName=="Netscape"?navigator.language:navigator.userLanguage;
  34. var i18n={};
  35. var rCats=[];
  36. var processFunc;
  37. switch (lang){
  38. case "zh-CN":
  39. case "zh-SG":
  40. i18n={
  41. fetch:"开始下载小说或其他【Ctrl+F9】",
  42. info:"本文是使用懒人小说下载器(DownloadAllContent)下载的",
  43. error:"该段内容获取失败",
  44. downloading:"已下载完成 %s 段,剩余 %s 段<br>正在下载 %s",
  45. complete:"已全部下载完成,共 %s 段",
  46. del:"设置文本干扰码的CSS选择器",
  47. custom:"自定义下载",
  48. customInfo:"输入网址或者章节CSS选择器",
  49. reSort:"按标题名重新排序",
  50. setting:"懒人小说下载设置",
  51. abort:"跳过此章",
  52. save:"临时保存",
  53. downThreadNum:"设置同时下载的线程数"
  54. };
  55. break;
  56. case "zh-TW":
  57. case "zh-HK":
  58. i18n={
  59. fetch:"開始下載小說或其他【Ctrl+F9】",
  60. info:"本文是使用懶人小說下載器(DownloadAllContent)下載的",
  61. error:"該段內容獲取失敗",
  62. downloading:"已下載完成 %s 段,剩餘 %s 段<br>正在下載 %s",
  63. complete:"已全部下載完成,共 %s 段",
  64. del:"設置文本干擾碼的CSS選擇器",
  65. custom:"自定義下載",
  66. customInfo:"輸入網址或者章節CSS選擇器",
  67. reSort:"按標題名重新排序",
  68. setting:"懶人小說下載設置",
  69. abort:"跳過此章",
  70. save:"保存當前",
  71. downThreadNum:"設置同時下載的綫程數"
  72. };
  73. break;
  74. default:
  75. i18n={
  76. fetch:"Download All Content[Ctrl+F9]",
  77. info:"The TXT is downloaded by 'DownloadAllContent'",
  78. error:"Failed in downloading current chapter",
  79. downloading:"%s pages are downloaded, there are still %s pages left<br>Downloading %s ......",
  80. complete:"Completed! Get %s pages in total",
  81. del:"Set css selectors for ignore",
  82. custom:"Custom to download",
  83. customInfo:"Input urls OR sss selectors for chapter links",
  84. reSort:"ReSort by title",
  85. setting:"DownloadAllContent Setting",
  86. abort:"Abort",
  87. save:"Save",
  88. downThreadNum:"Set threadNum for download"
  89. };
  90. break;
  91. }
  92. var firefox=navigator.userAgent.toLowerCase().indexOf('firefox')!=-1,curRequests=[];
  93. var rocketContent,txtDownContent,txtDownWords,txtDownQuit,txtDownDivInited=false;
  94.  
  95. function initTxtDownDiv(){
  96. if(txtDownDivInited)return;
  97. txtDownDivInited=true;
  98. rocketContent=document.createElement("div");
  99. document.body.appendChild(rocketContent);
  100. rocketContent.outerHTML=`
  101. <div id="txtDownContent">
  102. <div style="font-size:16px;color:#333333;width:360px;height:90px;position:fixed;left:50%;top:50%;margin-top:-25px;margin-left:-150px;z-index:100000;background-color:#ffffff;border:1px solid #afb3b6;border-radius:10px;opacity:0.95;filter:alpha(opacity=95);box-shadow:5px 5px 20px 0px #000;">
  103. <div id="txtDownWords" style="position:absolute;width:275px;max-height: 90%;border: 1px solid #f3f1f1;padding: 8px;border-radius: 10px;overflow: auto;">
  104. Downloading......
  105. </div>
  106. <div id="txtDownQuit" style="width:36px;height:28px;border-radius:10px;position:absolute;right:2px;top:2px;cursor: pointer;background-color:#ff5a5a;">
  107. <span style="height:28px;line-height:28px;display:block;color:#FFF;text-align:center;font-size:20px;">╳</span>
  108. </div>
  109. <div style="position:absolute;right:0px;bottom:2px;cursor: pointer;max-width:85px">
  110. <button id="abortRequest" style="background: #008aff;border: 0;padding: 5px;border-radius: 10px;color: white;float: right;margin: 1px;height: 25px;display:none;">${getI18n('abort')}</button>
  111. <button id="tempSaveTxt" style="background: #008aff;border: 0;padding: 5px;border-radius: 10px;color: white;float: right;margin: 1px;height: 25px;">${getI18n('save')}</button>
  112. </div>
  113. </div>
  114. </div>`;
  115. txtDownContent=document.querySelector("#txtDownContent");
  116. txtDownWords=document.querySelector("#txtDownWords");
  117. txtDownQuit=document.querySelector("#txtDownQuit");
  118. txtDownQuit.onclick=function(){
  119. txtDownContent.style.display="none";
  120. txtDownContent.parentNode.removeChild(txtDownContent);
  121. };
  122. initTempSave();
  123. }
  124.  
  125. function initTempSave(){
  126. var tempSavebtn = document.getElementById('tempSaveTxt');
  127. var abortbtn = document.getElementById('abortRequest');
  128. tempSavebtn.onclick = function(){
  129. var blob = new Blob([i18n.info+"\r\n"+document.title+"\r\n\r\n"+rCats.join("\r\n\r\n")], {type: "text/plain;charset=utf-8"});
  130. saveAs(blob, document.title+".txt");
  131. }
  132. abortbtn.onclick = function(){
  133. let curRequest = curRequests.pop();
  134. if(curRequest)curRequest[1].abort();
  135. }
  136. }
  137.  
  138. function indexDownload(aEles){
  139. if(aEles.length<1)return;
  140. initTxtDownDiv();
  141. if(GM_getValue("contentSort")){
  142. aEles.sort(function(a,b){
  143. return parseInt(a.innerText.replace(/[^0-9]/ig,"")) - parseInt(b.innerText.replace(/[^0-9]/ig,""));
  144. });
  145. }
  146. rCats=[];
  147. var insertSigns=[];
  148. // var j=0,rCats=[];
  149. var downIndex=0,downNum=0,downOnce=function(){
  150. if(downNum>=aEles.length)return;
  151. let curIndex=downIndex;
  152. let aTag=aEles[curIndex];
  153. let request=(aTag, curIndex)=>{
  154. return [curIndex,GM_xmlhttpRequest({
  155. method: 'GET',
  156. url: aTag.href,
  157. headers:{referer:aTag.href},
  158. timeout:15000,
  159. overrideMimeType:"text/html;charset="+document.charset,
  160. onload: function(result) {
  161. var doc = getDocEle(result.responseText);
  162. let nextPage=checkNextPage(doc);
  163. if(nextPage){
  164. var inArr=false;
  165. for(var ai=0;ai<aEles.length;ai++){
  166. if(aEles[ai].href==nextPage.href){
  167. inArr=true;
  168. break;
  169. }
  170. }
  171. if(!inArr){
  172. nextPage.innerText=aTag.innerText+"\t>>";
  173. aEles.push(nextPage);
  174. let targetIndex = curIndex;
  175. for(let a=0;a<insertSigns.length;a++){
  176. let signs=insertSigns[a],breakSign=false;
  177. if(signs){
  178. for(let b=0;b<signs.length;b++){
  179. let sign=signs[b];
  180. if(sign==curIndex){
  181. targetIndex=a;
  182. breakSign=true;
  183. break;
  184. }
  185. }
  186. }
  187. if(breakSign)break;
  188. }
  189. let insertSign = insertSigns[targetIndex];
  190. if(!insertSign)insertSigns[targetIndex] = [];
  191. insertSigns[targetIndex].push(aEles.length-1);
  192. }
  193. }
  194. downIndex++;
  195. downNum++;
  196. processDoc(curIndex, aTag, doc);
  197. let request=downOnce();
  198. if(request)curRequests.push(request);
  199. },
  200. onerror: function(e) {
  201. console.warn("error:");
  202. console.log(e);
  203. downIndex++;
  204. downNum++;
  205. processDoc(curIndex, aTag, null);
  206. let request=downOnce();
  207. if(request)curRequests.push(request);
  208. },
  209. ontimeout: function(e) {
  210. console.warn("timeout:");
  211. console.log(e);
  212. downIndex++;
  213. downNum++;
  214. processDoc(curIndex, aTag, null);
  215. let request=downOnce();
  216. if(request)curRequests.push(request);
  217. },
  218. })];
  219. }
  220. if(!aTag){
  221. let waitAtagReadyInterval=setInterval(function(){
  222. if(downNum>=aEles.length)clearInterval(waitAtagReadyInterval);
  223. aTag=aEles[curIndex];
  224. if(aTag){
  225. clearInterval(waitAtagReadyInterval);
  226. request(aTag, curIndex);
  227. }
  228. },1000);
  229. return null;
  230. }
  231. return request(aTag, curIndex);
  232. };
  233. function getDocEle(str){
  234. var doc = null;
  235. try {
  236. doc = document.implementation.createHTMLDocument('');
  237. doc.documentElement.innerHTML = str;
  238. }
  239. catch (e) {
  240. console.log('parse error');
  241. }
  242. return doc;
  243. }
  244. function sortInnerPage(){
  245. var pageArrs=[],maxIndex=0,i,j;
  246. for(i=0;i<insertSigns.length;i++){
  247. var signs=insertSigns[i];
  248. if(signs){
  249. for(j=0;j<signs.length;j++){
  250. var sign=signs[j];
  251. var cat=rCats[sign];
  252. rCats[sign]=null;
  253. if(!pageArrs[i])pageArrs[i]=[];
  254. pageArrs[i].push(cat);
  255. }
  256. }
  257. }
  258. for(i=pageArrs.length-1;i>=0;i--){
  259. let pageArr=pageArrs[i];
  260. if(pageArr){
  261. for(j=pageArr.length-1;j>=0;j--){
  262. rCats.splice(i+1, 0, pageArr[j]);
  263. }
  264. }
  265. }
  266. rCats = rCats.filter(function(e){return e!=null});
  267. }
  268. function processDoc(i, aTag, doc){
  269. curRequests = curRequests.filter(function(e){return e[0]!=i});
  270. rCats[i]=(aTag.innerText+"\r\n"+getPageContent(doc));
  271. txtDownContent.style.display="block";
  272. txtDownWords.innerHTML=getI18n("downloading",[downNum,(aEles.length-downNum),aTag.innerText]);
  273. if(downNum==aEles.length){
  274. txtDownWords.innerHTML=getI18n("complete",[downNum]);
  275. sortInnerPage();
  276. var blob = new Blob([i18n.info+"\r\n"+document.title+"\r\n\r\n"+rCats.join("\r\n\r\n")], {type: "text/plain;charset=utf-8"});
  277. saveAs(blob, document.title+".txt");
  278. }
  279. }
  280. var downThreadNum = parseInt(GM_getValue("downThreadNum"));
  281. downThreadNum=downThreadNum>0?downThreadNum:20;
  282. for(var i=0;i<downThreadNum;i++){
  283. let request=downOnce();
  284. if(request)curRequests.push(request);
  285. if(downIndex>=aEles.length-1 || downIndex>=downThreadNum-1)break;
  286. else downIndex++;
  287. }
  288.  
  289. /*for(let i=0;i<aEles.length;i++){
  290. let aTag=aEles[i];
  291. GM_xmlhttpRequest({
  292. method: 'GET',
  293. url: aTag.href,
  294. overrideMimeType:"text/html;charset="+document.charset,
  295. onload: function(result) {
  296. var doc = getDocEle(result.responseText);
  297. processDoc(i, aTag, doc);
  298. }
  299. });
  300. }*/
  301. }
  302.  
  303. function checkNextPage(doc){
  304. let aTags=doc.querySelectorAll("a"),nextPage=null;
  305. for(var i=0;i<aTags.length;i++){
  306. let aTag=aTags[i];
  307. if(innerNextPage.test(aTag.innerText) && /^http/i.test(aTag.href)){
  308. nextPage=aTag;
  309. break;
  310. }
  311. }
  312. return nextPage;
  313. }
  314.  
  315. function getPageContent(doc){
  316. if(!doc)return i18n.error;
  317. if(processFunc){
  318. return processFunc(doc);
  319. }
  320. if(doc.defaultView){
  321. [].forEach.call(doc.querySelectorAll("span,div,ul"),function(item){
  322. var thisStyle=doc.defaultView.getComputedStyle(item);
  323. if(thisStyle && (thisStyle.display=="none" || (item.tagName=="SPAN" && thisStyle.fontSize=="0px")))
  324. item.innerHTML="";
  325. });
  326. }
  327. var i,j,k,rStr="",pageData=(doc.body?doc.body:doc).cloneNode(true),delList=[];
  328. pageData.innerHTML=pageData.innerHTML.replace(/\<\!\-\-((.|[\n|\r|\r\n])*?)\-\-\>/g,"");
  329. [].forEach.call(pageData.querySelectorAll("font.jammer"),function(item){
  330. item.innerHTML="";
  331. });
  332. var selectors=GM_getValue("selectors");
  333. if(selectors){
  334. [].forEach.call(pageData.querySelectorAll(selectors),function(item){
  335. item.innerHTML="";
  336. });
  337. }
  338. [].forEach.call(pageData.querySelectorAll("script,style,link,img,noscript,iframe"),function(item){delList.push(item);});
  339. [].forEach.call(delList,function(item){item.innerHTML="";});
  340. var largestContent,contents=pageData.querySelectorAll("span,div,article,p,td"),largestNum=0;
  341. for(i=0;i<contents.length;i++){
  342. let content=contents[i],hasText=false,allSingle=true,item,curNum=0;
  343. for(j=content.childNodes.length-1;j>=0;j--){
  344. item=content.childNodes[j];
  345. if(item.nodeType==3){
  346. if(/^\s*$/.test(item.data))
  347. item.innerHTML="";
  348. else hasText=true;
  349. }else if(/^(I|A|STRONG|B|FONT|P|DL|DD|H\d)$/.test(item.tagName))hasText=true;
  350. }
  351. for(j=content.childNodes.length-1;j>=0;j--){
  352. item=content.childNodes[j];
  353. if(item.nodeType==1 && !/^(I|A|STRONG|B|FONT|BR)$/.test(item.tagName) && /^[\s\-\_\?\>\|]*$/.test(item.innerHTML))
  354. item.innerHTML="";
  355. }
  356. if(content.childNodes.length>1){
  357. for(j=0;j<content.childNodes.length;j++){
  358. item=content.childNodes[j];
  359. if(item.nodeType==1){
  360. for(k=0;k<item.childNodes.length;k++){
  361. var childNode=item.childNodes[k];
  362. if(childNode.nodeType!=3 && !/^(I|A|STRONG|B|FONT|BR)$/.test(childNode.tagName)){
  363. allSingle=false;
  364. break;
  365. }
  366. }
  367. if(!allSingle)break;
  368. }
  369. }
  370. }else{
  371. allSingle=false;
  372. }
  373. if(allSingle){
  374. curNum=(firefox?content.textContent.length:content.innerText.length);
  375. }else {
  376. if(!hasText)continue;
  377. if(pageData==document && content.offsetWidth<=0 && content.offsetHeight<=0)
  378. continue;
  379. [].forEach.call(content.childNodes,function(item){
  380. if(item.nodeType==3)curNum+=item.data.length;
  381. else if(/^(I|A|STRONG|B|FONT|P|DL|DD|H\d)$/.test(item.tagName))curNum+=(firefox?item.textContent.length:item.innerText.length);
  382. });
  383. }
  384. if(curNum>largestNum){
  385. largestNum=curNum;
  386. largestContent=content;
  387. }
  388. }
  389. if(!largestContent)return i18n.error;
  390. var childlist=pageData.querySelectorAll(largestContent.tagName);//+(largestContent.className?"."+largestContent.className.replace(/(^\s*)|(\s*$)/g, '').replace(/\s+/g, '.'):""));
  391. function getRightStr(ele, noTextEnable){
  392. let childNodes=ele.childNodes,cStr="\r\n",hasText=false;
  393. for(let j=0;j<childNodes.length;j++){
  394. let childNode=childNodes[j];
  395. if(childNode.nodeType==3 && childNode.data && !/^[\s\-\_\?\>\|]*$/.test(childNode.data))hasText=true;
  396. if(childNode.innerHTML){
  397. childNode.innerHTML=childNode.innerHTML.replace(/\<\s*br\s*\>/gi,"\r\n").replace(/\n+/gi,"\n").replace(/\r+/gi,"\r");
  398. }
  399. if(childNode.textContent){
  400. cStr+=childNode.textContent.replace(/ +/g," ").replace(/([^\r]|^)\n([^\r]|$)/gi,"$1\r\n$2");
  401. }
  402. if(childNode.nodeType!=3 && !/^(I|A|STRONG|B|FONT)$/.test(childNode.tagName))cStr+="\r\n";
  403. }
  404. if(hasText || noTextEnable || ele==largestContent)rStr+=cStr+"\r\n";
  405. }
  406. for(i=0;i<childlist.length;i++){
  407. var child=childlist[i];
  408. if(getDepth(child)==getDepth(largestContent)){
  409. if((!largestContent.className && child.className) || (largestContent.className && !child.className) || (largestContent.className && child.className && largestContent.className != child.className))continue;
  410. if((largestContent.className && largestContent.className==child.className)||largestContent.parentNode ==child.parentNode){
  411. getRightStr(child, true);
  412. }else {
  413. getRightStr(child, false);
  414. }
  415. }
  416. }
  417. return rStr.replace(/[\n\r]+$/,"");
  418. }
  419.  
  420. function getI18n(key, args){
  421. var resultStr=i18n[key];
  422. if(args && args.length>0){
  423. args.forEach(function(item){
  424. resultStr=resultStr.replace(/%s/,item);
  425. });
  426. }
  427. return resultStr;
  428. }
  429.  
  430. function getDepth(dom){
  431. var pa=dom,i=0;
  432. while(pa.parentNode){
  433. pa=pa.parentNode;
  434. i++;
  435. }
  436. return i;
  437. }
  438.  
  439. function fetch(forceSingle){
  440. processFunc=null;
  441. var aEles=document.querySelectorAll("a"),list=[];
  442. for(var i=0;i<aEles.length;i++){
  443. var aEle=aEles[i],has=false;
  444. if((!aEle.href || aEle.href.indexOf("javascript")!=-1) && aEle.dataset.href){
  445. aEle.href=aEle.dataset.href;
  446. }
  447. for(var j=0;j<list.length;j++){
  448. if(list[j].href==aEle.href){
  449. list.splice(j,1);
  450. list.push(aEle);
  451. has=true;
  452. break;
  453. }
  454. }
  455. if(!has && aEle.href && /^http/i.test(aEle.href) && ((aEle.innerText.trim()!="" && indexReg.test(aEle.innerText.trim())) || /chapter[\-_]?\d/.test(aEle.href))){
  456. list.push(aEle);
  457. }
  458. }
  459. if(list.length>2 && !forceSingle){
  460. indexDownload(list);
  461. }else{
  462. var blob = new Blob([i18n.info+"\r\n"+document.title+"\r\n\r\n"+getPageContent(document)], {type: "text/plain;charset=utf-8"});
  463. saveAs(blob, document.title+".txt");
  464. }
  465. }
  466.  
  467. document.addEventListener("keydown", function(e) {
  468. if(e.keyCode == 120 && e.ctrlKey) {
  469. fetch(e.shiftKey);
  470. }
  471. });
  472. function setDel(){
  473. var selValue=GM_getValue("selectors");
  474. var selectors=prompt(i18n.del,selValue?selValue:"");
  475. GM_setValue("selectors",selectors);
  476. selValue=GM_getValue("downThreadNum");
  477. var downThreadNum=prompt(i18n.downThreadNum,selValue?selValue:"20");
  478. GM_setValue("downThreadNum",downThreadNum);
  479. if(window.confirm(i18n.reSort)){
  480. GM_setValue("contentSort", true);
  481. }else{
  482. GM_setValue("contentSort", false);
  483. }
  484. }
  485. function customDown(){
  486. processFunc=null;
  487. var customRules=GM_getValue("DACrules_"+document.domain);
  488. var urls=window.prompt(i18n.customInfo,customRules?customRules:"https://xxx.xxx/book-[20-99].html, https://xxx.xxx/book-[01-10].html");
  489. if(urls){
  490. GM_setValue("DACrules_"+document.domain, urls);
  491. var processEles=[];
  492. if(/^http|^ftp/.test(urls)){
  493. [].forEach.call(urls.split(","),function(i){
  494. var varNum=/\[\d+\-\d+\]/.exec(i)[0].trim();
  495. var num1=/\[(\d+)/.exec(varNum)[1].trim();
  496. var num2=/(\d+)\]/.exec(varNum)[1].trim();
  497. var num1Int=parseInt(num1);
  498. var num2Int=parseInt(num2);
  499. var numLen=num1.length;
  500. var needAdd=num1.charAt(0)=="0";
  501. if(num1Int>=num2Int)return;
  502. for(var j=num1Int;j<=num2Int;j++){
  503. var urlIndex=j.toString();
  504. if(needAdd){
  505. while(urlIndex.length<numLen)urlIndex="0"+urlIndex;
  506. }
  507. var curUrl=i.replace(/\[\d+\-\d+\]/,urlIndex).trim();
  508. var curEle=document.createElement("a");
  509. curEle.href=curUrl;
  510. processEles.push(curEle);
  511. curEle.innerText=processEles.length.toString();
  512. }
  513. });
  514. }else{
  515. let urlsArr=urls.split("@@"),eles=document.querySelectorAll(urlsArr[0]);
  516. if(eles.length==0){
  517. eles=[];
  518. var eleTxts=urlsArr[0].split(/(?<=[^\\])[,,]/),exmpEles=[];
  519. [].forEach.call(document.querySelectorAll("a"),function(item){
  520. eleTxts.forEach(txt=>{
  521. if(item.innerText.indexOf(txt)!=-1){
  522. exmpEles.push(item);
  523. }
  524. });
  525. })
  526. exmpEles.forEach(e=>{
  527. var cssSelStr="a",pa=e.parentNode;
  528. if(e.className)cssSelStr+="."+CSS.escape(e.className);
  529. while(pa && pa.nodeName!="BODY"){
  530. cssSelStr=pa.nodeName+">"+cssSelStr;
  531. pa=pa.parentNode;
  532. }
  533. [].forEach.call(document.querySelectorAll(cssSelStr),function(item){
  534. if(eles.indexOf(item)==-1){
  535. eles.push(item);
  536. }
  537. });
  538. });
  539. }
  540. [].forEach.call(eles,function(item){
  541. let has=false;
  542. for(var j=0;j<processEles.length;j++){
  543. if(processEles[j].href==item.href){
  544. processEles.splice(j,1);
  545. processEles.push(item);
  546. has=true;
  547. break;
  548. }
  549. }
  550. if((!item.href || item.href.indexOf("javascript")!=-1) && item.dataset.href){
  551. item.href=item.dataset.href;
  552. }
  553. if(!has && item.href && /^http/i.test(item.href)){
  554. processEles.push(item.cloneNode(1));
  555. }
  556. });
  557. if(urlsArr[1]){
  558. processEles.forEach(ele=>{
  559. ele.href=ele.href.replace(new RegExp(urlsArr[1]), urlsArr[2]);
  560. });
  561. }
  562. if(urlsArr[3]){
  563. processFunc=data=>{return eval(urlsArr[3])};
  564. }else{
  565. var win=(typeof unsafeWindow=='undefined'? window : unsafeWindow);
  566. if(win.dacProcess){
  567. processFunc=win.dacProcess;
  568. }
  569. }
  570. }
  571. indexDownload(processEles);
  572. }
  573. }
  574. GM_registerMenuCommand(i18n.fetch, fetch);
  575. GM_registerMenuCommand(i18n.custom, customDown);
  576. GM_registerMenuCommand(i18n.setting, setDel);
  577. })();