lofterDown

lofter頁面內容下載

  1. // ==UserScript==
  2. // @name lofterDown
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.00
  5. // @description lofter頁面內容下載
  6. // @author You
  7. // @match *.lofter.com/*
  8. // @require https://cdn.jsdelivr.net/npm/file-saver@1.3.8/FileSaver.min.js
  9. // @require http://libs.baidu.com/jquery/2.0.0/jquery.min.js
  10. // @grant GM_xmlhttpRequest
  11. // ==/UserScript==
  12.  
  13. (function () {
  14. "use strict";
  15.  
  16. //http://miyamayukimi06288.lofter.com&t=1583587016128
  17.  
  18. async function gethtml(url) {
  19. return new Promise((resolve, reject) => {
  20. GM_xmlhttpRequest({
  21. url: url,
  22. method: "GET",
  23. onload: function (response) {
  24. resolve(response.responseText);
  25. },
  26. });
  27. });
  28. }
  29.  
  30. async function downone(url) {
  31. try {
  32. const txt = await gethtml(url);
  33. let doc = $("<html></html>");
  34. doc.html(txt);
  35. const tlist = doc.find(".postinner .ct");
  36. if (tlist.length == 0) return;
  37.  
  38. const title = doc.find(".postinner .ct .ttl");
  39.  
  40. var blob = new Blob([tlist.text()], {
  41. type: "text/plain;charset=utf-8",
  42. });
  43. saveAs(blob, `${title.text()}.txt`);
  44. console.log(`${url} ok`);
  45. return true;
  46. } catch (e) {
  47. console.log(`${url} error`);
  48. setTimeout(() => {
  49. alert(`${url} error`);
  50. }, 100);
  51. return false;
  52. }
  53. }
  54.  
  55. function downpageall() {
  56. const num = $(".num").text();
  57. const maxnum = parseInt(num.split("/")[1].trim());
  58. // console.log(maxnum);
  59.  
  60. for (let pagenum = 1; pagenum < maxnum; pagenum++) {
  61. const pageurl = `${document.baseURI}/?page=${pagenum}`;
  62. if (!downpageone(pageurl)) return;
  63. }
  64. }
  65.  
  66. async function downpageone(pageurl) {
  67. const txt = await gethtml(pageurl);
  68. const doc = $("<html></html>");
  69. doc.html(txt);
  70. const tlist = doc.find(".m-postlst .postinner .ttl a");
  71. if (tlist.length == 0) return;
  72. for (let i = 0; i < tlist.length; i++) {
  73. //console.log(tlist[i].href);
  74. const re = await downone(tlist[i].href);
  75. if (!re) return;
  76. }
  77. }
  78.  
  79. function addbuttonallpage() {
  80. const t = document.querySelector(".m-nav");
  81. // console.log(t);
  82. if (t) {
  83. let e = document.createElement("button");
  84. e.id = "TALLDownBtnpage";
  85. e.textContent = "下载所有頁";
  86. e.className = "btn btn-md btn-default";
  87. e.onclick = downpageall;
  88. t.parentNode.insertBefore(e, t);
  89. }
  90. }
  91.  
  92. function addbuttonnoepage() {
  93. const t = document.querySelector(".m-nav");
  94. // console.log(t);
  95. if (t) {
  96. let e = document.createElement("button");
  97. e.id = "TONEDownBtnpage";
  98. e.textContent = "下载本頁";
  99. e.className = "btn btn-md btn-default";
  100. e.onclick = function () {
  101. downpageone(location.href);
  102. };
  103. t.parentNode.insertBefore(e, t);
  104. }
  105. }
  106.  
  107. function addbuttonnoe() {
  108. const t = document.querySelector(".m-nav");
  109. // console.log(t);
  110. if (t) {
  111. let e = document.createElement("button");
  112. e.id = "TONEDownBtn";
  113. e.textContent = "下载本頁";
  114. e.className = "btn btn-md btn-default";
  115. e.onclick = function () {
  116. downone(location.href);
  117. };
  118. t.parentNode.insertBefore(e, t);
  119. }
  120. }
  121.  
  122. async function run() {
  123. if (/lofter\.com\/post/.test(location.href)) {
  124. addbuttonnoe();
  125. } else {
  126. addbuttonnoepage();
  127. addbuttonallpage();
  128. }
  129. }
  130. run();
  131. // Your code here...
  132. })();