Greasy Fork is available in English.

HyReadTW下载器

EPUB目前支持比较简陋

  1. // ==UserScript==
  2. // @name HyReadTW下载器
  3. // @namespace https://qinlili.bid
  4. // @version 0.1
  5. // @description EPUB目前支持比较简陋
  6. // @author 琴梨梨
  7. // @match https://service.ebook.hyread.com.tw/ebookservice/epubreader/hyread/v3/reader.jsp
  8. // @icon https://nju.ebook.hyread.com.cn/Template/standard/images/hyread_icon.jpg
  9. // @grant none
  10. // @run-at document-end
  11. // @require https://cdn.jsdelivr.net/npm/jszip@3.6.0/dist/jszip.min.js
  12. // @license MPLv2
  13. // ==/UserScript==
  14.  
  15. (async function() {
  16. 'use strict';
  17.  
  18.  
  19. console.log("正在初始化喵~");
  20. const dlFile = (link, name) => {
  21. let eleLink = document.createElement('a');
  22. eleLink.download = name;
  23. eleLink.style.display = 'none';
  24. eleLink.href = link;
  25. document.body.appendChild(eleLink);
  26. eleLink.click();
  27. document.body.removeChild(eleLink);
  28. }
  29. function waitUI() {
  30. return new Promise(resolve => {
  31. const observer = new MutationObserver(function(){
  32. if(document.getElementsByClassName("render").length){
  33. console.log("页面就绪了喵~走起~");
  34. resolve();
  35. observer.disconnect();
  36. }
  37. });
  38. observer.observe(document.documentElement, {childList: true,subtree: true });
  39. });
  40. };
  41. const originCreate=URL.createObjectURL;
  42. let imgTemp=[]
  43. var onPageChange = function () { };
  44. function waitLoading() {
  45. return new Promise(resolve => {
  46. setTimeout(()=>{resolve()},10000);
  47. onPageChange = () => {
  48. resolve();
  49. }
  50. });
  51. }
  52. let num=0;
  53. const count=()=>{
  54. num++;
  55. if(num==2){
  56. onPageChange();
  57. num=0;
  58. }
  59. }
  60. URL.createObjectURL=object=>{
  61. console.log(object);
  62. imgTemp[imgTemp.length]=object;
  63. count();
  64. return originCreate(object);
  65. };
  66. await waitUI();
  67. const nextPage=()=>{
  68. document.body.dispatchEvent(new KeyboardEvent("keyup",{
  69. bubbles: true,
  70. cancelable: true,
  71. code: "ArrowRight",
  72. key: "ArrowRight",
  73. keyCode: 39
  74. }))
  75. };
  76. const nextPageLeft=()=>{
  77. document.body.dispatchEvent(new KeyboardEvent("keyup",{
  78. bubbles: true,
  79. cancelable: true,
  80. code: "ArrowLeft",
  81. key: "ArrowLeft",
  82. keyCode: 37
  83. }))
  84. };
  85. const sleep = delay => new Promise(resolve => setTimeout(resolve, delay))
  86. console.log("准备中~");
  87. await sleep(2000);
  88. //推断类名
  89. const svgList=document.getElementsByTagName("svg");
  90. //建立下载按钮
  91. let dlBtn=document.createElement("div");
  92. dlBtn.className=svgList[6].parentElement.className;
  93. let dlIcon=document.createElement("img");
  94. dlIcon.src="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC4wMSIvPjxyZWN0IHg9IjYiIHk9IjYiIHdpZHRoPSIzNiIgaGVpZ2h0PSIzNiIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggZD0iTTMyIDI4TDI0IDM2TDE2IDI4IiBzdHJva2U9IiMzMzMiIHN0cm9rZS13aWR0aD0iMyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggZD0iTTI0IDIwVjM1LjUiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cGF0aCBkPSJNMTYgMTRIMzIiIHN0cm9rZT0iIzMzMyIgc3Ryb2tlLXdpZHRoPSIzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=";
  95. dlBtn.appendChild(dlIcon);
  96. svgList[6].parentElement.insertAdjacentElement('afterend',dlBtn);
  97. let clickTick=0;
  98. dlBtn.addEventListener("click",async ()=>{
  99. if(!clickTick){
  100. console.log("要开始了哟~");
  101. alert("请手动翻页,确保载入完成后再继续翻页,直到末尾,然后再次点击下载按钮");
  102. clickTick++;
  103. }else{
  104. alert("正在打包");
  105. console.log("在打包了喵~");
  106. let zip = new JSZip();
  107. let counter=0;
  108. imgTemp.forEach(imgBlob=>{
  109. counter++
  110. if(imgBlob.type.indexOf("image")==1){
  111. zip.file(counter+ ".jpg", imgBlob, { binary: true })
  112. }else{
  113. zip.file(counter+ ".html", imgBlob, { binary: true })
  114. }
  115. });
  116. let zipFile=await zip.generateAsync({ type: "blob" });
  117. dlFile(originCreate(zipFile),"000.zip");
  118. console.log("完成了喵~");
  119. }
  120. })
  121. console.log("准备就绪了喵~");
  122.  
  123. })();