微信读书自动翻页

微信读书网页版自动翻页

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

QingJ © 2025

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