|
4 | 4 | // @name:zh-TW 懶人小説下載器 |
5 | 5 | // @name:ja 怠惰者小説ダウンロードツール |
6 | 6 | // @namespace hoothin |
7 | | -// @version 0.3 |
| 7 | +// @version 0.5 |
8 | 8 | // @description Fetch and download main content on current page |
9 | 9 | // @description:zh-CN 通用网站内容抓取工具,可批量抓取小说、论坛内容等并保存为TXT文档 |
10 | 10 | // @description:zh-TW 通用網站內容抓取工具,可批量抓取小說、論壇內容等並保存為TXT文檔 |
|
46 | 46 | var rocketContent=document.createElement("div"); |
47 | 47 | document.body.appendChild(rocketContent); |
48 | 48 | rocketContent.outerHTML=` |
49 | | -<div id="txtDownContent" style="display: none;"> |
50 | | - <div style="width:300px;height:50px;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;"> |
51 | | - <div id="txtDownWords" style="position:absolute;left:20px;top:10px;width:260px;"></div> |
52 | | - <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAA5FBMVEUAAAD+/v7////9/f7////////+/v7+/v7////+/v7+/v7////+/v7+/v7////+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7////////////+/v7+/v7+/v7+/v7+/v4uje3///82ke7s9P3N5PtQoPDI4fqCu/Tu9v5Im+/6/P+VxfZgqPFNnvDp8/3f7fq42Pmnz/d1tPNvsfNkq/JCmO/4+/7X6fz19/rn8PqYx/aNwfV8uPRqrvJZpfFUovAzkO3Q5vu92/mr0fieyva92fWx0vQ6lO5pygFTAAAAJHRSTlMAmfD+RMGwgj2mknlIKR/36+XGnIyHfnJfVDk2My8S4E1CJBvTatKDAAABY0lEQVQoz4WSZ1fCMBRA05ahLPfemkspBUFwgGz3+P//x/hK6ZBzvB/ak96+kZeoGCtFK5eziitqCSfWOnM2CuWUrOyQYPc0bjM2htHXh+/ffQ4lQ6zEPoZ6TwdUp10M56EtAe5MR7y0HGAeX7Ghe6MTzIZwFtTfBrepUzw4UFSGY8CUTTMGLo3eglv58By21pRnB7aNBqTwPfWq/OVey9sH22wZXiWo6Yr3GtRl/f0IRyoPYy14v97YWjVY12BPrcK9XvhaZPUdWCoLbR35yOoW5P7R8eQ3JrmbSp6HVmSrXuTrmNYyUAs2JkL6D6YjG1PgNGXK87F4nWAsUxmL2gyH6oVD7cuhdqFg9CE4T/oPE6CsgvBOP21715AP7ugaDFK+3YD1KyUcAG47bn0TSylxFd8WDTwMMByoBSUHw+jd9/3JbQODnVExygUS7FRUksPVtdDZW8dqCZm8lc1auxcq4gc02GVGTUchmgAAAABJRU5ErkJggg==" id="txtDownQuit" style="position:absolute;right:0px;top:0px;cursor: pointer;" /> |
53 | | - </div> |
54 | | -</div>`; |
| 49 | + <div id="txtDownContent" style="display: none;"> |
| 50 | + <div style="width:300px;height:50px;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;"> |
| 51 | + <div id="txtDownWords" style="position:absolute;left:20px;top:10px;width:260px;"> |
| 52 | + </div> |
| 53 | + <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAAA5FBMVEUAAAD+/v7////9/f7////////+/v7+/v7////+/v7+/v7////+/v7+/v7////+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7////////////+/v7+/v7+/v7+/v7+/v4uje3///82ke7s9P3N5PtQoPDI4fqCu/Tu9v5Im+/6/P+VxfZgqPFNnvDp8/3f7fq42Pmnz/d1tPNvsfNkq/JCmO/4+/7X6fz19/rn8PqYx/aNwfV8uPRqrvJZpfFUovAzkO3Q5vu92/mr0fieyva92fWx0vQ6lO5pygFTAAAAJHRSTlMAmfD+RMGwgj2mknlIKR/36+XGnIyHfnJfVDk2My8S4E1CJBvTatKDAAABY0lEQVQoz4WSZ1fCMBRA05ahLPfemkspBUFwgGz3+P//x/hK6ZBzvB/ak96+kZeoGCtFK5eziitqCSfWOnM2CuWUrOyQYPc0bjM2htHXh+/ffQ4lQ6zEPoZ6TwdUp10M56EtAe5MR7y0HGAeX7Ghe6MTzIZwFtTfBrepUzw4UFSGY8CUTTMGLo3eglv58By21pRnB7aNBqTwPfWq/OVey9sH22wZXiWo6Yr3GtRl/f0IRyoPYy14v97YWjVY12BPrcK9XvhaZPUdWCoLbR35yOoW5P7R8eQ3JrmbSp6HVmSrXuTrmNYyUAs2JkL6D6YjG1PgNGXK87F4nWAsUxmL2gyH6oVD7cuhdqFg9CE4T/oPE6CsgvBOP21715AP7ugaDFK+3YD1KyUcAG47bn0TSylxFd8WDTwMMByoBSUHw+jd9/3JbQODnVExygUS7FRUksPVtdDZW8dqCZm8lc1auxcq4gc02GVGTUchmgAAAABJRU5ErkJggg==" id="txtDownQuit" style="position:absolute;right:0px;top:0px;cursor: pointer;" /> |
| 54 | + </div> |
| 55 | + </div>`; |
55 | 56 | var txtDownContent=document.querySelector("#txtDownContent"); |
56 | 57 | var txtDownWords=document.querySelector("#txtDownWords"); |
57 | 58 | var txtDownQuit=document.querySelector("#txtDownQuit"); |
|
60 | 61 | txtDownContent.parentNode.removeChild(txtDownContent); |
61 | 62 | }; |
62 | 63 | var j=0,rCats=[]; |
| 64 | + function getDocEle(str){ |
| 65 | + var doc = null; |
| 66 | + try { |
| 67 | + doc = document.implementation.createHTMLDocument(''); |
| 68 | + doc.documentElement.innerHTML = str; |
| 69 | + } |
| 70 | + catch (e) { |
| 71 | + console.log('parse error'); |
| 72 | + } |
| 73 | + return doc; |
| 74 | + } |
| 75 | + function processDoc(i, aTag, doc){ |
| 76 | + j++; |
| 77 | + rCats[i]=(aTag.textContent+"\r\n"+getPageContent(doc)); |
| 78 | + txtDownContent.style.display="block"; |
| 79 | + txtDownWords.innerHTML="已下载完成 "+j+" 段,剩余 "+(aEles.length-j)+" 段"; |
| 80 | + if(j==aEles.length){ |
| 81 | + txtDownWords.innerHTML="已全部下载完成,共 "+j+" 段"; |
| 82 | + 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"}); |
| 83 | + saveAs(blob, document.title+".txt"); |
| 84 | + } |
| 85 | + } |
63 | 86 | for(let i=0;i<aEles.length;i++){ |
64 | 87 | let aTag=aEles[i]; |
65 | 88 | GM_xmlhttpRequest({ |
66 | 89 | method: 'GET', |
67 | 90 | url: aTag.href, |
68 | 91 | onload: function(result) { |
69 | | - var doc = null; |
70 | | - try { |
71 | | - doc = document.implementation.createHTMLDocument(''); |
72 | | - doc.documentElement.innerHTML = result.responseText; |
73 | | - } |
74 | | - catch (e) { |
75 | | - console.log('parse error'); |
76 | | - } |
| 92 | + var doc = getDocEle(result.responseText); |
77 | 93 | if (!doc) { |
78 | 94 | return; |
79 | 95 | } |
80 | | - j++; |
81 | | - rCats[i]=(aTag.textContent+"\r\n"+getPageContent(doc)); |
82 | | - txtDownContent.style.display="block"; |
83 | | - txtDownWords.innerHTML="已下载完成 "+j+" 段,剩余 "+(aEles.length-j)+" 段"; |
84 | | - if(j==aEles.length){ |
85 | | - txtDownWords.innerHTML="已全部下载完成,共 "+j+" 段"; |
86 | | - 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"}); |
87 | | - saveAs(blob, document.title+".txt"); |
| 96 | + var contentType=doc.querySelector("meta[http-equiv=Content-Type]"); |
| 97 | + if(contentType && !/utf\-?8/i.test(contentType.content)){ |
| 98 | + GM_xmlhttpRequest({ |
| 99 | + method: 'GET', |
| 100 | + url: aTag.href, |
| 101 | + overrideMimeType:contentType.content, |
| 102 | + onload: function(result) { |
| 103 | + var doc = getDocEle(result.responseText); |
| 104 | + if (!doc) { |
| 105 | + return; |
| 106 | + } |
| 107 | + processDoc(i, aTag, doc); |
| 108 | + } |
| 109 | + }); |
| 110 | + }else{ |
| 111 | + processDoc(i, aTag, doc); |
88 | 112 | } |
89 | 113 | } |
90 | 114 | }); |
|
0 commit comments