小鹅通PDF电子书保存

自动翻页并保存pdf图片,需要自行手动合并为PDF。

  1. // ==UserScript==
  2. // @name 小鹅通PDF电子书保存
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description 自动翻页并保存pdf图片,需要自行手动合并为PDF。
  6. // @author Canis
  7. // @match *://*.xiaoeknow.com/*
  8. // @grant GM_download
  9. // @grant GM_log
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. (function() {
  14. 'use strict';
  15.  
  16. let running = false;
  17. let startButton;
  18. let stopButton;
  19. let intervalId;
  20. let saveDelay = 1000;
  21.  
  22. // 创建开始和停止按钮
  23. function createButtons() {
  24. startButton = document.createElement('button');
  25. startButton.innerText = '开始保存';
  26. startButton.style.position = 'fixed';
  27. startButton.style.top = '16px';
  28. startButton.style.left = '16px';
  29. startButton.style.fontSize = '16px';
  30. startButton.style.padding = '4px';
  31. startButton.style.zIndex = 1000;
  32. startButton.onclick = startSaving;
  33. document.body.appendChild(startButton);
  34.  
  35. stopButton = document.createElement('button');
  36. stopButton.innerText = '停止保存';
  37. stopButton.style.position = 'fixed';
  38. stopButton.style.top = '64px';
  39. stopButton.style.left = '16px';
  40. stopButton.style.fontSize = '16px';
  41. stopButton.style.padding = '4px';
  42. stopButton.style.zIndex = 1000;
  43. stopButton.onclick = stopSaving;
  44. document.body.appendChild(stopButton);
  45.  
  46. // 创建输入框设置延迟
  47. let saveDelayLabel = document.createElement('label');
  48. saveDelayLabel.innerText = '保存延迟:';
  49. saveDelayLabel.style.position = 'fixed';
  50. saveDelayLabel.style.top = '112px';
  51. saveDelayLabel.style.left = '16px';
  52. saveDelayLabel.style.fontSize = '16px'
  53. saveDelayLabel.style.zIndex = 1000;
  54. document.body.appendChild(saveDelayLabel);
  55.  
  56. let saveDelayInput = document.createElement('input');
  57. saveDelayInput.type = 'number';
  58. saveDelayInput.value = saveDelay;
  59. saveDelayInput.style.position = 'fixed';
  60. saveDelayInput.style.top = '112px';
  61. saveDelayInput.style.left = '100px';
  62. saveDelayInput.style.fontSize = '16px';
  63. saveDelayInput.style.zIndex = 1000;
  64. saveDelayInput.style.width = '60px';
  65. saveDelayInput.onchange = () => { saveDelay = parseInt(saveDelayInput.value, 10); };
  66. document.body.appendChild(saveDelayInput);
  67. }
  68.  
  69. // 延迟函数,用于等待页面加载完成
  70. function delay(ms) {
  71. return new Promise(resolve => setTimeout(resolve, ms));
  72. }
  73.  
  74. async function saveImage() {
  75. // 获取图片的URL
  76. let imgElement = document.querySelector('#pdfImg');
  77. if (imgElement) {
  78. let imgUrl = imgElement.src;
  79. let currentPage = document.querySelector('.pdf-entity').getAttribute('page');
  80. let fileName = 'image-' + currentPage + '.jpg'; // 以当前页码命名图片
  81. GM_download(imgUrl, fileName);
  82. GM_log('图片已保存: ' + fileName);
  83. } else {
  84. GM_log('未找到目标图片');
  85. }
  86. }
  87.  
  88. async function nextPage() {
  89. // 获取当前页数和总页数
  90. let pageElement = document.querySelector('.pdf-entity');
  91. if (pageElement) {
  92. let currentPage = parseInt(pageElement.getAttribute('page'), 10);
  93. let totalPages = parseInt(document.querySelector('.percentage').innerText.split('/')[1].trim(), 10);
  94.  
  95. if (currentPage < totalPages) {
  96. // 模拟点击下一页按钮
  97. let nextPageBtn = document.evaluate("//span[text()='下一页']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  98. if (nextPageBtn) {
  99. nextPageBtn.click();
  100. } else {
  101. GM_log('未找到“下一页”按钮');
  102. return false;
  103. }
  104.  
  105. // 增加页数
  106. pageElement.setAttribute('page', currentPage + 1);
  107. GM_log(`翻到第 ${currentPage + 1} 页`);
  108.  
  109. // 更新按钮文字
  110. startButton.innerText = `正在保存:${currentPage + 1}/${totalPages}`;
  111. } else {
  112. GM_log('已到达最后一页');
  113. return false; // 到达最后一页,停止循环
  114. }
  115. } else {
  116. GM_log('未找到页面元素');
  117. return false;
  118. }
  119. return true;
  120. }
  121.  
  122. async function main() {
  123. // 获取总页数
  124. let totalPages = parseInt(document.querySelector('.percentage').innerText.split('/')[1].trim(), 10);
  125.  
  126. while (running) {
  127. await saveImage(); // 保存图片
  128. await delay(saveDelay); // 等待1秒,确保图片下载完成并且页面加载完成
  129. let hasNext = await nextPage(); // 翻页
  130. if (!hasNext) break;
  131. await delay(saveDelay); // 等待1秒,确保下一页加载完成
  132. }
  133.  
  134. // 恢复按钮初始文字
  135. startButton.innerText = '开始保存';
  136.  
  137. // 弹窗提示用户下载已完成
  138. if (!running) {
  139. alert('下载完成!');
  140. }
  141. }
  142.  
  143. function startSaving() {
  144. if (!running) {
  145. running = true;
  146. main();
  147. }
  148. }
  149.  
  150. function stopSaving() {
  151. running = false;
  152. GM_log('停止保存图片');
  153. alert('保存已停止');
  154. }
  155.  
  156. // 创建按钮
  157. createButtons();
  158. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址