微信读书自动翻页

微信读书网页版自动翻页

目前为 2022-02-03 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name 微信读书自动翻页
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.1
  5. // @description 微信读书网页版自动翻页
  6. // @author bulan_zade
  7. // @match https://weread.qq.com/web/reader/*
  8. // @require https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js
  9. // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
  10. // @grant none
  11. // @license MIT
  12. // ==/UserScript==
  13.  
  14. async function sleep(ms)
  15. {
  16. return new Promise(resolve => setTimeout(resolve, ms))
  17. }
  18.  
  19. // 模拟键盘事件
  20. function fireKeyEvent(el, evtType, keyCode)
  21. {
  22. let evtObj;
  23. if (document.createEvent)
  24. {
  25. if (window.KeyEvent)
  26. {//firefox 浏览器下模拟事件
  27. evtObj = document.createEvent('KeyEvents');
  28. evtObj.initKeyEvent(evtType, true, true, window, true, false, false, false, keyCode, 0);
  29. }
  30. else
  31. {//chrome 浏览器下模拟事件
  32. evtObj = document.createEvent('UIEvents');
  33. evtObj.initUIEvent(evtType, true, true, window, 1);
  34.  
  35. delete evtObj.keyCode;
  36. if (typeof evtObj.keyCode === "undefined")
  37. {//为了模拟keycode
  38. Object.defineProperty(evtObj, "keyCode", { value: keyCode });
  39. }
  40. else
  41. {
  42. evtObj.key = String.fromCharCode(keyCode);
  43. }
  44.  
  45. if (typeof evtObj.ctrlKey === 'undefined')
  46. {//为了模拟ctrl键
  47. Object.defineProperty(evtObj, "ctrlKey", { value: true });
  48. }
  49. else
  50. {
  51. evtObj.ctrlKey = true;
  52. }
  53. }
  54. el.dispatchEvent(evtObj);
  55.  
  56. }
  57. else if (document.createEventObject)
  58. {//IE 浏览器下模拟事件
  59. evtObj = document.createEventObject();
  60. evtObj.keyCode = keyCode
  61. el.fireEvent('on' + evtType, evtObj);
  62. }
  63. }
  64.  
  65. window.onload = function()
  66. {
  67. let container = document.getElementsByClassName("readerControls")[0]
  68. let html = '<div class="readerControls_fontSize" id="autoScrollControl">\n' +
  69. ' <button title="自动滚动" id="autoScrollBtn" class="readerControls_item autoScroll" style="color:#5d646e;">滚动</button>\n' +
  70. ' <div class="fontSizeLabel left"><p style="color:#5d646e;">0</p></div>\n' +
  71. ' <div class="fontSizeSliderContainer">\n' +
  72. ` <input id="scrollSpeed" type="range" max="20" min="0" value="0"/>\n`+
  73. ' </div>\n' +
  74. ' <div class="fontSizeLabel right"><p style="color:#5d646e;margin-right:8px">20</p></div>\n' +
  75. ' </div>'
  76.  
  77. container.insertAdjacentHTML('beforeend',html)
  78. let control = document.getElementById("autoScrollControl")
  79. let btn = document.getElementById("autoScrollBtn")
  80. let scrollSpeed = document.getElementById("scrollSpeed");
  81. let timer
  82. let controlDisplaying = false;
  83. let onBtnClick = false
  84. let atBottom = false
  85.  
  86. scrollSpeed.onchange = function ()
  87. {
  88. if (scrollSpeed.value != 0)
  89. {
  90. clearInterval(timer)
  91. timer = setInterval(async() =>
  92. {
  93. console.log(document.documentElement.scrollHeight - document.documentElement.scrollTop === document.documentElement.clientHeight)
  94. if (!atBottom && document.documentElement.scrollHeight - document.documentElement.scrollTop === document.documentElement.clientHeight)
  95. {
  96. atBottom = true
  97. await sleep(2000)
  98. fireKeyEvent(document, "keydown", 39)
  99. await sleep(2000)
  100. atBottom = false
  101. }
  102. else
  103. {
  104. window.scrollBy(0, scrollSpeed.value)
  105. }
  106. }, 100)
  107. btn.innerText = "滚动中"
  108. }
  109. else
  110. {
  111. clearInterval(timer)
  112. btn.innerText = "滚动"
  113. }
  114. }
  115.  
  116. // 显示滚动控制条
  117. btn.onclick = function()
  118. {
  119. onBtnClick = true
  120. btn.setAttribute("style", "display:none")
  121. control.className += " expand"
  122. controlDisplaying = true
  123. }
  124.  
  125. // 点击空白区域时隐藏滚动控制条
  126. document.body.onclick = function()
  127. {
  128. if (controlDisplaying && !onBtnClick)
  129. {
  130. btn.removeAttribute("style")
  131. control.className = control.className.replace(" expand", "")
  132. }
  133. onBtnClick = false
  134. }
  135. }
  136.  

QingJ © 2025

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