文泉学堂PDF下载修复版

用于文泉学堂pdf下载

  1. // ==UserScript==
  2. // @name 文泉学堂PDF下载修复版
  3. // @namespace https://52pojie.cn
  4. // @version 0.550
  5. // @description 用于文泉学堂pdf下载
  6. // @author Culaccino
  7. // @author kv2036
  8. // @match https://*.wqxuetang.com/read/pdf*
  9. // @grant unsafeWindow
  10. // @require https://cdn.staticfile.org/jspdf/1.5.3/jspdf.min.js
  11. // @license 暂无
  12. // ==/UserScript==
  13.  
  14. (function () {
  15. const fuckwenquan = jsPDF;
  16. const downloadNum = 20 //每次达到此页数就自动保存,可根据实际情况改动
  17. var imgBox, nowPage, allPage, doc, size, name, startNum = 1, isStart = false, pageList, dataIndex, School, beginTime = new Date(), dataList = {}
  18. const baseURL = `https://${unsafeWindow.location.host}/`
  19. if (baseURL.indexOf("www") > -1) {
  20. unsafeWindow.location.href = unsafeWindow.location.href.replace("www", School)
  21. }
  22. const bid = getStr(unsafeWindow.location.href)[2]
  23. const headers = {
  24. "headers": {
  25. "User-Agent": navigator.userAgent,
  26. "Accept": "*/*",
  27. "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
  28. "Cache-Control": "max-age=0"
  29. },
  30. "referrer": unsafeWindow.location.href,
  31. "method": "GET"
  32. }
  33. Array.prototype.remove = function (val) {
  34. const index = this.indexOf(val);
  35. if (index > -1) this.splice(index, 1)
  36. }
  37. function print() {
  38. //console.log(...arguments)
  39. }
  40. function getStr(str) { //取中间字符
  41. let res = str.match(new RegExp(`https://(.*?).wqxuetang.com/read/pdf[?]bid=([0-9]*$)`))
  42. return res ? res : -1
  43. // https://wqbook.wqxuetang.com/read/pdf?bid=1142211
  44. }
  45. function sleep(min, max) {
  46. min *= 1000;
  47. max *= 1000;
  48. const time = !min ? max : Math.floor(Math.random() * (max - min + 1)) + min;
  49. print(time)
  50. return new Promise((resolve) => setTimeout(resolve, time));
  51. }
  52. function createList(now) {
  53. let arr = []
  54. for (let i = now || nowPage; i < Math.min((now || nowPage) + downloadNum, allPage + 1); i++) arr.push(i)
  55. startNum = arr[0]
  56. return arr
  57. }
  58. function addPDF(base64) {
  59. doc.addImage(base64, 'JPEG', 0, 0, size[0], size[1])
  60. }
  61. function savePDF(num) {
  62. doc.save(`${name}_${num !== allPage ? num - downloadNum + 1 : Math.max(Math.floor(num / downloadNum) * downloadNum + 1, nowPage)}-${num}.pdf`)
  63. if (num !== allPage) doc = fuckwenquan(size[0] < size[1] ? "p" : "l", 'pt', size)
  64. print("总耗时 " + parseInt((new Date() - beginTime) / 1000 / 60) + " 分钟")
  65. }
  66. function getInfo(url) {
  67. console.log(url)
  68. const data = fetch(url, headers).then(function (res) {
  69. if (res.status >= 200 && res.status < 300) return res.json();
  70. else throw new Error(res.statusText)
  71. })
  72. data.then(v => { name = v.data.name; print(name) })
  73. }
  74. function getImg(num) {
  75. const base64 = dataList[num];
  76. let img = new Image();
  77. img.src = base64;
  78. img.onload = function () {
  79. if (!isStart) {
  80. doc = new fuckwenquan(size[0] < size[1] ? "p" : "l", 'pt', size)
  81. isStart = !isStart
  82. }
  83. addPDF(base64)
  84. if (num === allPage) {
  85. isStart = !isStart
  86. savePDF(num)
  87. return
  88. } else if (num % downloadNum === 0) {
  89. dataList = {}
  90. savePDF(num)
  91. pageList = dataIndex = createList(num + 1)
  92. autoScroll(0)
  93. return
  94. }
  95. doc.addPage()
  96. getImg(num += 1)
  97. }
  98. }
  99. async function autoScroll(num, isCorrect = true) {
  100. if (pageList.length === 0) {
  101. isStart = !isStart
  102. getImg(startNum)
  103. return
  104. }
  105. if (pageList[num - 1] === pageList[pageList.length - 1]) num = 0
  106. print(pageList[num], num, pageList.length)
  107. //unsafeWindow.document.unsafeWindow.documentElement.scrollTop = imgBox[pageList[num]].offsetTop
  108. unsafeWindow.document.getElementById("scroll").scrollTop = imgBox[pageList[num]].offsetTop
  109. let src = imgBox[pageList[num]].firstChild.getAttribute("src")
  110. if (!src || src.indexOf("data:image/") === -1 || !isCorrect) {
  111. await sleep(8, 10)
  112. src = imgBox[pageList[num]].firstChild.getAttribute("src")
  113. }
  114. if (!src || src.indexOf("width=160") > -1) autoScroll(num += 1)
  115. else {
  116. let img = new Image();
  117. img.src = src;
  118. img.onload = async function () {
  119. let w = img.width, h = img.height
  120. if (!size) { size = [w, h] }
  121. print([w, h])
  122. if (size[0] - w > 200) {
  123. autoScroll(num += 1, false)
  124. } else {
  125. dataList[pageList[num]] = src
  126. pageList.remove(pageList[num])
  127. autoScroll(num)
  128. }
  129. }
  130. }
  131. }
  132. console.log(bid)
  133. let id = setInterval(() => {
  134. if (unsafeWindow.document.querySelector('#pagebox') !== null) {
  135. clearInterval(id);
  136. // 该干嘛干嘛
  137. console.log('pagebox渲染完成');
  138. unsafeWindow.document.getElementById("pagebox").ondblclick = function () {
  139. console.log(bid)
  140. if (!isStart) {
  141. const numBox = unsafeWindow.document.getElementsByClassName("page-head-tol")[0].innerHTML
  142. School = getStr(unsafeWindow.location.href)[1]
  143. getInfo("https://" + School + ".wqxuetang.com/v1/read/initread?bid=" + bid)
  144. imgBox = unsafeWindow.document.getElementsByClassName("page-img-box")
  145. nowPage = parseInt(numBox.slice(0, numBox.indexOf("/") - 1))
  146. allPage = imgBox.length - 1
  147. isStart = !isStart
  148. pageList = dataIndex = createList()
  149. autoScroll(0)
  150. } else return
  151. }
  152. }
  153. else {
  154.  
  155.  
  156. console.log("正在渲染pagebox")
  157. }
  158. }, 5);
  159.  
  160. unsafeWindow.onbeforeunload = function () { if (isStart) return "leave?" }
  161. })();

QingJ © 2025

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