微信读书

经典阅读器:宽屏显示,更改浅色模式背景色,开启沉浸式阅读、自动阅读和挂机模式,平滑滚动,空格翻页,调整页脚按钮,隐藏滚动条;双栏阅读器:更改浅色模式背景颜色,开启沉浸式阅读、自动阅读模式,空格翻页,屏幕常亮,配置持久化;

  1. // ==UserScript==
  2. // @name 微信读书
  3. // @icon https://weread.qq.com/favicon.ico
  4. // @namespace https://greasyfork.org/users/878514
  5. // @version 20250405
  6. // @description 经典阅读器:宽屏显示,更改浅色模式背景色,开启沉浸式阅读、自动阅读和挂机模式,平滑滚动,空格翻页,调整页脚按钮,隐藏滚动条;双栏阅读器:更改浅色模式背景颜色,开启沉浸式阅读、自动阅读模式,空格翻页,屏幕常亮,配置持久化;
  7. // @author Velens
  8. // @match https://weread.qq.com/web/reader/*
  9. // @require https://code.jquery.com/jquery-3.6.0.min.js
  10. // @license MIT
  11. // @grant GM_addStyle
  12. // @grant GM_registerMenuCommand
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // ==/UserScript==
  16.  
  17.  
  18. /* globals jQuery, $, waitForKeyElements */
  19. const widths = [{titlew:"满列",width:"100%",align_items:"flex-end",margin_left:"45.5%"},{titlew:"宽列",width:"80%",align_items:"center",margin_left:"41.5%"},{titlew:"默认",width:"",align_items:"flex-start",margin_left:""}];
  20. const footers = [{titlet:"隐藏",padding:"20px"},{titlet:"显示",padding:"40px"},{titlet:"默认",padding:""}];
  21. const scrollbars = [{titles:"滚动条:显示",displays:"auto"},{titles:"滚动条:隐藏",displays:"none"},{titles:"滚动条:默认",displays:"auto"}];
  22. const colors = [{titlec:"豆沙绿",RGB:"#C7EDCC"},{titlec:"杏仁黄",RGB:"#FAF9DE"},{titlec:"秋叶褐",RGB:"#FFF2E2"},{titlec:"胭脂红",RGB:"#FDE6E0"},{titlec:"海天蓝",RGB:"#DCE2F1"},{titlec:"葛巾紫",RGB:"#E9EBFE"},{titlec:"极光灰",RGB:"#EAEAEF"},{titlec:"青草绿",RGB:"#E3EDCD"},{titlec:"银河白",RGB:"#FFFFFF"}];
  23. const screenLocks = ["锁定","常亮"];
  24. const spacePages = ["开启","关闭"];
  25. const playAutos = ["自动阅读:模式一","自动阅读:模式二","自动阅读:关闭"],playAutos1 = ["自动阅读:开启","自动阅读:关闭"];
  26. const scrollTops = ["阅读模式:沉浸式","阅读模式:默认"];
  27. let iw = GM_getValue("numw",0);
  28. let io = GM_getValue("numo",0);
  29. let is = GM_getValue("nums",0);
  30. let ic = GM_getValue("numc",0);
  31. let il = GM_getValue("numl",0);
  32. let iSpace = GM_getValue("numSpace",0);
  33. let iFlagp = GM_getValue("numFlagp",0),flagp = GM_getValue("flagp",true);
  34. let flagt = GM_getValue("flagt",true);
  35. var timeoutID,timePlay,timeStop,timeClick;
  36. var flagPlay = false,flagBOT = false;
  37. let timeStopmin = GM_getValue("timeStopmin",0);
  38. var readerControls = document.getElementsByClassName("readerControls");
  39. var readerTopBar = document.getElementsByClassName("readerTopBar");
  40.  
  41. if (document.querySelector(".wr_horizontalReader")){
  42. GM_registerMenuCommand("背景色:" + colors[ic].titlec,color);
  43. GM_addStyle(`.wr_whiteTheme .wr_horizontalReader .readerChapterContent,.wr_whiteTheme .readerControls_fontSize, .wr_whiteTheme .readerControls_item {background-color: ${colors[ic].RGB};}`);
  44. if(colors[ic].titlec != "银河白"){GM_addStyle(`.wr_whiteTheme .wr_horizontalReader .wr_horizontalReader_app_content .readerTopBar,.wr_whiteTheme .wr_horizontalReader .readerChapterContent_container {background: linear-gradient(#0000000d,#0000000d),${colors[ic].RGB};}`);};
  45. if(colors[ic].titlec != "银河白"){GM_addStyle(`.readerChapterContent {color: #000000CC !important;}`);};
  46. function color(){
  47. timeoutID = GM_getValue("timeoutID");
  48. clearTimeout(timeoutID);
  49. if(ic < colors.length-1){ic++;}
  50. else{ic = 0;}
  51. GM_setValue("numc",ic);
  52. GM_addStyle(`.wr_whiteTheme .wr_horizontalReader .readerChapterContent,.wr_whiteTheme .readerControls_fontSize, .wr_whiteTheme .readerControls_item {background-color: ${colors[ic].RGB};}`);
  53. GM_addStyle(`.wr_whiteTheme .wr_horizontalReader .wr_horizontalReader_app_content .readerTopBar,.wr_whiteTheme .wr_horizontalReader .readerChapterContent_container {background-image: linear-gradient(#0000000d,#0000000d);background-color: ${colors[ic].RGB};background-blend-mode: multiply;}`);
  54. timeoutID = setTimeout(() => location.reload(),10000);
  55. GM_setValue("timeoutID",timeoutID);
  56. };
  57.  
  58. GM_registerMenuCommand("空格翻页:" + spacePages[iSpace],spacePage);
  59. function spacePage(){
  60. if(iSpace < spacePages.length-1){iSpace++;}
  61. else{iSpace = 0;}
  62. GM_setValue("numSpace",iSpace);
  63. location.reload();
  64. }
  65. function nextPage () {
  66. const event = new KeyboardEvent('keydown', {
  67. key: 'ArrowRight',
  68. keyCode: 39
  69. });
  70. document.dispatchEvent(event);
  71. };
  72. if(iSpace == 0){
  73. $(document).keydown(function(event){
  74. if(event.keyCode == 32){
  75. nextPage ();}
  76. })};
  77.  
  78. if(flagp){
  79. GM_registerMenuCommand(playAutos1[0],playAuto1);
  80. $(window).on('load', function () {
  81. var buttonRead = "<button title='播放' class='readerControls_item readPlay'></button><button title='暂停' class='readerControls_item readStop'></button>"
  82. $('.readerControls').append(buttonRead);
  83. var iconPlay = "<span class='iconRead iconPlay'>播放</span>";
  84. var iconStop = "<span class='iconRead iconStop'>暂停</span>";
  85. $('.readPlay').append(iconPlay);
  86. $('.readStop').append(iconStop);
  87. GM_addStyle(`.iconRead{opacity:0.7;font-size: 12px;color:#fff}`);
  88. GM_addStyle(`.wr_whiteTheme .iconRead{color:#000;}`);
  89. $(".iconRead").mouseenter(function () {$(this).css("opacity", "1");});
  90. $(".iconRead").mouseleave(function () {$(this).css("opacity", ".7");});
  91.  
  92. let timePagedown = GM_getValue("timePagedown",20000);
  93. $('.readPlay').attr('title', "间隔:" + timePagedown + "(双击修改)");
  94. $('.readStop').attr('title', "时长:" + timeStopmin + "(双击修改)");
  95. let wakeLock = null;
  96. const requestWakeLock = async ()=>{
  97. try {wakeLock = await navigator.wakeLock.request('screen');}
  98. catch (err) {console.log(`${err.name}, ${err.message}`);}}
  99.  
  100. $('.readPlay').click(function () {
  101. clearTimeout(timeClick);
  102. timeClick = setTimeout(function(){
  103. flagPlay = true;
  104. GM_addStyle(`.readPlay{box-shadow: 0 0 5px 2px rgba(0,255,0,1) !important;}`);
  105. if(flagt){readerTopBar[0].style.opacity = 0;GM_addStyle(`.readerControls{opacity:0;}`);};
  106. clearInterval(timePlay);
  107. clearTimeout(timeStop);
  108. timePlay = setInterval(nextPage, timePagedown);
  109. if(timeStopmin != 0){timeStop = setTimeout(() => $('.readStop').click(),timeStopmin*60000);};
  110. if(il != 0){requestWakeLock();};
  111. },250);
  112. });
  113.  
  114. $('.readPlay').dblclick(function () {
  115. clearTimeout(timeClick);
  116. let timePagedown1 = timePagedown;
  117. timePagedown = prompt("请输入翻页间隔(毫秒)(默认:20000)", timePagedown);
  118. if(timePagedown != null && /^\d+$/.test(timePagedown)){
  119. if(timePagedown < 1000){timePagedown = 1000;}
  120. $('.readPlay').attr('title', "间隔:" + timePagedown + "(双击修改)");
  121. if(timePagedown != timePagedown1 && flagPlay){
  122. clearInterval(timePlay);
  123. timePlay = setInterval(nextPage, timePagedown);}
  124. GM_setValue("timePagedown",timePagedown);}
  125. else{timePagedown = GM_getValue("timePagedown");}
  126. })
  127.  
  128. $('.readStop').click(function () {
  129. flagPlay = false;
  130. GM_addStyle(`.readPlay{box-shadow: 0 4px 20px rgba(0,0,0,.03) !important;}`);
  131. clearInterval(timePlay);
  132. if(wakeLock != null){wakeLock.release().then(() => {wakeLock = null});};
  133. })
  134.  
  135. $('.readStop').dblclick(function () {
  136. timeStopmin = prompt("请输入暂停时长(分钟)(默认:0,不自动暂停)", timeStopmin);
  137. if(timeStopmin != null && /^\d+$/.test(timeStopmin)){
  138. $('.readStop').attr('title', "时长:" + timeStopmin + "(双击修改)");
  139. GM_setValue("timeStopmin",timeStopmin);}
  140. else{timeStopmin = GM_getValue("timeStopmin");}
  141. })
  142.  
  143. $(document).keydown(function(event){
  144. if(event.keyCode == 96){
  145. if(!flagPlay) {$('.readPlay').click();}
  146. else {$('.readStop').click();}}
  147. });
  148. })
  149. }else{GM_registerMenuCommand(playAutos1[1],playAuto1);}
  150. function playAuto1(){
  151. flagp = !flagp;
  152. GM_setValue("flagp",flagp);
  153. location.reload();
  154. };
  155.  
  156. if(flagp){
  157. GM_registerMenuCommand("屏幕状态:" + screenLocks[il],screenLock);
  158. function screenLock(){
  159. if(il < screenLocks.length-1){il++;}
  160. else{il = 0;}
  161. GM_setValue("numl",il);
  162. location.reload();
  163. };}
  164.  
  165. if(flagt){
  166. GM_registerMenuCommand(scrollTops[0],scrollTop);
  167. setTimeout(function(){
  168. readerTopBar[0].style.opacity = 0;
  169. readerControls[0].style.opacity = 0;
  170. readerTopBar[0].addEventListener('mouseenter', function(){ readerTopBar[0].style.opacity = 1});
  171. readerTopBar[0].addEventListener('mouseleave', function(){ readerTopBar[0].style.opacity = 0});
  172. readerControls[0].addEventListener('mouseenter', function(){ readerControls[0].style.opacity = 1});
  173. readerControls[0].addEventListener('mouseleave', function(){ readerControls[0].style.opacity = 0});
  174. },10000);
  175. }
  176. else{GM_registerMenuCommand(scrollTops[1],scrollTop);}
  177. function scrollTop(){
  178. flagt = !flagt;
  179. GM_setValue("flagt",flagt);
  180. location.reload();
  181. }
  182.  
  183. }else{
  184. GM_addStyle(`.reader-font-control-panel-wrapper .font-panel-content-arrow {display: none;}`);
  185. GM_addStyle(`.wr_whiteTheme .reader-font-control-panel-wrapper .font-panel-content-arrow {display: none;}`);
  186.  
  187. GM_registerMenuCommand("宽度:" + widths[iw].titlew,width)
  188. if(widths[iw].titlew != "默认"){
  189. GM_addStyle(`.readerContent .app_content, .readerTopBar {max-width: ${widths[iw].width};}`);
  190. GM_addStyle(`.readerControls {align-items: ${widths[iw].align_items};}`);
  191. GM_addStyle(`.readerControls {margin-left: ${widths[iw].margin_left};}`);}
  192. function width(){
  193. if(iw < widths.length-1){iw++;}
  194. else{iw = 0;}
  195. GM_setValue("numw",iw);
  196. location.reload();
  197. };
  198.  
  199. GM_registerMenuCommand("页脚:" + footers[io].titlet,Footer);
  200. if(footers[io].titlet != "默认"){
  201. GM_addStyle(`.readerFooter {padding: ${footers[io].padding};}`);
  202. GM_addStyle(".readerFooter_button {font-weight: 600;}");}
  203. if(footers[io].titlet == "隐藏"){
  204. GM_addStyle(` .readerFooter_button {background-color: #1C1C1D;}`);
  205. GM_addStyle(`.wr_whiteTheme .readerFooter_button {background-color: ${colors[ic].RGB};}`);}
  206. function Footer(){
  207. if(io < footers.length-1){io++;}
  208. else{io = 0;}
  209. GM_setValue("numo",io);
  210. location.reload();
  211. };
  212.  
  213. GM_registerMenuCommand(scrollbars[is].titles,scrollbar);
  214. GM_addStyle(`body::-webkit-scrollbar {display: ${scrollbars[is].displays};}`);
  215. if(scrollbars[is].titles == "滚动条:显示"){
  216. if(widths[iw].titlew != "满列"){GM_addStyle(`body.wr_whiteTheme::-webkit-scrollbar {background-image: linear-gradient(#0000000d,#0000000d);background-color: ${colors[ic].RGB};background-blend-mode: multiply;}`);}
  217. else{
  218. GM_addStyle(`body::-webkit-scrollbar {background-color: #1c1c1d;}`);
  219. GM_addStyle(`body.wr_whiteTheme::-webkit-scrollbar {background-color: ${colors[ic].RGB};}`);}
  220. GM_addStyle(`body::-webkit-scrollbar {width:6px;}`);
  221. GM_addStyle(`body::-webkit-scrollbar-thumb {border-radius: 10px;box-shadow: inset 0 0 6px rgba(255, 255, 255, .4);}`);
  222. GM_addStyle(`body.wr_whiteTheme::-webkit-scrollbar-thumb {border-radius: 10px;box-shadow: inset 0 0 6px rgba(0, 0, 0, .2);}`);}
  223. function scrollbar(){
  224. if(is < scrollbars.length-1){is++;}
  225. else{is = 0;}
  226. GM_setValue("nums",is);
  227. location.reload();
  228. };
  229.  
  230. GM_registerMenuCommand("背景色:" + colors[ic].titlec,color);
  231. GM_addStyle(`.wr_whiteTheme .readerContent .app_content, .wr_whiteTheme .readerTopBar, .wr_whiteTheme .readerControls_fontSize, .wr_whiteTheme .readerControls_item {background-color: ${colors[ic].RGB};}`);
  232. if(widths[iw].titlew != "满列" && colors[ic].titlec != "银河白"){GM_addStyle(`.wr_page_reader.wr_whiteTheme {background: linear-gradient(#0000000d,#0000000d),${colors[ic].RGB};}`);};
  233. if(colors[ic].titlec != "银河白"){GM_addStyle(`.readerChapterContent {color: #000000CC !important;}`);};
  234. function color(){
  235. timeoutID = GM_getValue("timeoutID");
  236. clearTimeout(timeoutID);
  237. if(ic < colors.length-1){ic++;}
  238. else{ic = 0;}
  239. GM_setValue("numc",ic);
  240. GM_addStyle(`.wr_whiteTheme .readerContent .app_content, .wr_whiteTheme .readerTopBar, .wr_whiteTheme .readerControls_fontSize, .wr_whiteTheme .readerControls_item {background-color: ${colors[ic].RGB};}`);
  241. if(scrollbars[is].titles == "滚动条:显示"){GM_addStyle(`body.wr_whiteTheme::-webkit-scrollbar {background-color: ${colors[ic].RGB};}`);}
  242. if(widths[iw].titlew != "满列"){GM_addStyle(`.wr_page_reader.wr_whiteTheme {background-image: linear-gradient(#0000000d,#0000000d);background-color: ${colors[ic].RGB};background-blend-mode: multiply;}`);};
  243. if(footers[io].titlet == "隐藏"){
  244. GM_addStyle(`.wr_whiteTheme .readerFooter_button {background-color: ${colors[ic].RGB};}`);}
  245. if(iFlagp != 2){GM_addStyle(`.wr_whiteTheme .autoReads{background-color:${colors[ic].RGB};}`)};
  246. timeoutID = setTimeout(() => location.reload(),10000);
  247. GM_setValue("timeoutID",timeoutID);
  248. };
  249.  
  250. if(iFlagp != 2){
  251. GM_registerMenuCommand("屏幕状态:" + screenLocks[il],screenLock);
  252. function screenLock(){
  253. if(il < screenLocks.length-1){il++;}
  254. else{il = 0;}
  255. GM_setValue("numl",il);
  256. location.reload();
  257. };}
  258.  
  259. function nextPage () {
  260. const event = new KeyboardEvent('keydown', {
  261. key: 'ArrowRight',
  262. keyCode: 39
  263. });
  264. document.dispatchEvent(event);
  265. };
  266. $(document).keydown(function(event){
  267. if(event.keyCode == 32){
  268. var totalTop = $(document).scrollTop();
  269. var scrollHeight = $(document).height() - $(window).height() - 10;
  270. if (totalTop >= scrollHeight){nextPage ();}}
  271. })
  272. GM_registerMenuCommand(playAutos[iFlagp],playAuto);
  273. if(iFlagp != 2){
  274. $(window).on('load', function () {
  275. var classRead = document.createElement("div");
  276. classRead.className = "autoRead";
  277. GM_addStyle(`.autoRead{width:48px;position:fixed;bottom:48px;z-index:5;margin-right:548px;right:50%;margin-right:${widths[iw].margin_left};}`);
  278. document.body.append(classRead);
  279. var buttonRead = "<button title='播放' class='autoReads readPlay'></button><button title='暂停' class='autoReads readStop'></button><button title='倍数' class='autoReads readSpeed'></button><button title='翻页' class='autoReads readPage'></button></button><button title='挂机' class='autoReads readBOT'></button>";
  280. GM_addStyle(`.autoReads{width:48px;height:48px;border-radius:24px;margin-top:24px;box-shadow: 0 8px 32px rgba(0,25,104,.1);background-color:#1C1C1D;}`);
  281. GM_addStyle(`.wr_whiteTheme .autoReads{background-color:${colors[ic].RGB};}`);
  282. $('.autoRead').append(buttonRead);
  283. var iconPlay = "<span class='iconRead iconPlay'>播放</span>";
  284. var iconStop = "<span class='iconRead iconStop'>暂停</span>";
  285. var iconSpeed = "<span class='iconRead iconSpeed'>倍速</span>";
  286. var iconPage = "<span class='iconRead iconPage'>翻页</span>";
  287. var iconBOT = "<span class='iconRead iconBOT'>挂机</span>";
  288. GM_addStyle(`.iconRead{opacity:0.7;width:48px;height:48px;display:inline-block;line-height:48px;text-align:center;color:#fff}`);
  289. GM_addStyle(`.wr_whiteTheme .iconRead{color:#000;}`);
  290. $('.readPlay').append(iconPlay);
  291. $('.readStop').append(iconStop);
  292. $('.readSpeed').append(iconSpeed);
  293. $('.readPage').append(iconPage);
  294. $('.readBOT').append(iconBOT);
  295. $(".iconRead").mouseenter(function () {$(this).css("opacity", "1");});
  296. $(".iconRead").mouseleave(function () {$(this).css("opacity", ".7");});
  297. if(flagt){
  298. classRead.addEventListener('mouseenter', function(){ classRead.style.opacity = 1});
  299. classRead.addEventListener('mouseleave', function(){ classRead.style.opacity = 0});
  300. setTimeout(() => GM_addStyle(`.autoRead{opacity:0;}`),10000);}
  301.  
  302. var timePage,timeBOT,numPlay=0;
  303. let ynumDown = GM_getValue("ynumDown",1);
  304. let timeMillisec = GM_getValue("timeMillisec",20);
  305. let flagPage = GM_getValue("flagPage",true);
  306. let timePagesec = GM_getValue("timePagesec",10000);
  307. let timeTopsec = GM_getValue("timeTopsec",0);
  308. $('.iconPlay').attr('title', "停留:" + timeTopsec + "(双击修改)");
  309. if(iFlagp == 0){$('.iconSpeed').attr('title', "步长:" + ynumDown);}
  310. if(iFlagp == 1){$('.iconSpeed').attr('title', "步长,间隔:" + ynumDown + "," + timeMillisec);}
  311. $('.iconStop').attr('title', "时长:" + timeStopmin + "(双击修改)");
  312. $('.iconPage').attr('title', "间隔:" + timePagesec + "(双击修改)");
  313. if(flagPage){GM_addStyle(`.readPage{box-shadow: 0 0 5px 2px rgba(0,255,0,1);}`);};
  314. let wakeLock = null;
  315. const requestWakeLock = async ()=>{
  316. try {wakeLock = await navigator.wakeLock.request('screen');}
  317. catch (err) {console.log(`${err.name}, ${err.message}`);}}
  318.  
  319. const autoPlay = async function () {
  320. if(iFlagp == 0){timePlay = window.requestAnimationFrame(autoPlay);}
  321. if(flagBOT){window.scrollBy(0,1);}
  322. else{window.scrollBy(0,ynumDown);};
  323. var totalTop = $(document).scrollTop();
  324. var scrollHeight = $(document).height() - $(window).height() - 10;
  325. if(totalTop <= 10 && timeTopsec != 0){
  326. ynumDown = 0;
  327. setTimeout(function(){ynumDown = GM_getValue("ynumDown");}, timeTopsec);};
  328. if(totalTop >= scrollHeight){
  329. if(numPlay<1){
  330. numPlay++;
  331. if(flagPage){timePage = setTimeout(() => nextPage (),timePagesec);};
  332. if(flagBOT){timeBOT = setTimeout(() => window.scrollTo(0, 0),10000);};
  333. }}
  334. else{
  335. if(numPlay>0){
  336. numPlay=0;
  337. clearTimeout(timePage);
  338. clearTimeout(timeBOT);
  339. }}
  340. }
  341.  
  342. $('.readPlay').click(function () {
  343. clearTimeout(timeClick);
  344. timeClick = setTimeout(function(){
  345. flagPlay = true;
  346. flagBOT = false;
  347. if(flagt){
  348. GM_addStyle(`.autoRead{opacity:0;}`);
  349. readerControls[0].style.opacity = 0;};
  350. GM_addStyle(`.readBOT{box-shadow: 0 8px 32px rgba(0,25,104,.1);}`);
  351. GM_addStyle(`.readPlay{box-shadow: 0 0 5px 2px rgba(0,255,0,1);}`);
  352. clearTimeout(timeBOT);
  353. clearTimeout(timeStop);
  354. if(iFlagp == 0){
  355. cancelAnimationFrame(timePlay);
  356. autoPlay();}
  357. if(iFlagp == 1){
  358. clearInterval(timePlay);
  359. timePlay = setInterval(autoPlay, timeMillisec);}
  360. if(timeStopmin != 0){timeStop = setTimeout(() => $('.readStop').click(),timeStopmin*60000);};
  361. if(il != 0){requestWakeLock();};
  362. },250);
  363. });
  364.  
  365. $('.readPlay').dblclick(function () {
  366. clearTimeout(timeClick);
  367. timeTopsec = prompt("请输入翻页停留(毫秒)(默认:0,不停留)", timeTopsec);
  368. if(timeTopsec != null && /^\d+$/.test(timeTopsec)){
  369. $('.iconPlay').attr('title', "停留:" + timeTopsec + "(双击修改)");
  370. GM_setValue("timeTopsec",timeTopsec);}
  371. else{timeTopsec = GM_getValue("timeTopsec");}
  372. })
  373.  
  374. $('.readStop').click(function () {
  375. flagPlay = false;
  376. flagBOT = false;
  377. numPlay=0;
  378. GM_addStyle(`.readPlay,.readBOT{box-shadow: 0 8px 32px rgba(0,25,104,.1);}`);
  379. if(iFlagp == 0){cancelAnimationFrame(timePlay);}
  380. if(iFlagp == 1){clearInterval(timePlay);}
  381. clearTimeout(timeStop);
  382. clearTimeout(timePage);
  383. clearTimeout(timeBOT);
  384. if(wakeLock != null){wakeLock.release().then(() => {wakeLock = null});};
  385. })
  386.  
  387. $('.readStop').dblclick(function () {
  388. timeStopmin = prompt("请输入暂停时长(分钟)(默认:0,不自动暂停)", timeStopmin);
  389. if(timeStopmin != null && /^\d+$/.test(timeStopmin)){
  390. $('.iconStop').attr('title', "时长:" + timeStopmin + "(双击修改)");
  391. GM_setValue("timeStopmin",timeStopmin);}
  392. else{timeStopmin = GM_getValue("timeStopmin");}
  393. })
  394.  
  395. $('.readSpeed').click(function () {
  396. if(!flagBOT){
  397. if(iFlagp == 0){
  398. ynumDown = prompt("请输入滚动步长(像素)(默认:1)", ynumDown);
  399. if(ynumDown != null && $.isNumeric(ynumDown)){
  400. $('.iconSpeed').attr('title', "步长:" + ynumDown);
  401. GM_setValue("ynumDown",ynumDown);}
  402. else{ynumDown = GM_getValue("ynumDown");}}
  403. if(iFlagp == 1){
  404. var speedVal = prompt('请输入滚动步长(像素),调用间隔(毫秒)(默认:1,20)', ynumDown + "," + timeMillisec);
  405. if(speedVal != null){
  406. var speedValsplit = speedVal.split(/[,|\uff0c]/,2)
  407. let timeMillisec1 = timeMillisec;
  408. ynumDown = speedValsplit[0];
  409. timeMillisec = speedValsplit[1];
  410. if(!$.isNumeric(ynumDown)){ynumDown = GM_getValue("ynumDown");};
  411. if(!$.isNumeric(timeMillisec)){timeMillisec = GM_getValue("timeMillisec");};
  412. if(timeMillisec != timeMillisec1 && flagPlay){
  413. clearInterval(timePlay);
  414. timePlay = setInterval(autoPlay, timeMillisec);}
  415. $('.iconSpeed').attr('title', "步长,间隔:" + ynumDown + "," + timeMillisec);
  416. GM_setValue("ynumDown",ynumDown);
  417. GM_setValue("timeMillisec",timeMillisec);}}
  418. }})
  419.  
  420. $('.readPage').click(function () {
  421. if(!flagBOT){
  422. clearTimeout(timeClick);
  423. timeClick = setTimeout(function(){
  424. if(!flagPage){
  425. flagPage = true;
  426. numPlay=0;
  427. GM_addStyle(`.readPage{box-shadow: 0 0 5px 2px rgba(0,255,0,1);}`);}
  428. else{
  429. flagPage = false;
  430. clearTimeout(timePage);
  431. GM_addStyle(`.readPage{box-shadow: 0 8px 32px rgba(0,25,104,.1);}`);}
  432. GM_setValue("flagPage",flagPage);
  433. },250);}
  434. //else{alert("当前为挂机模式,已关闭自动翻页");}
  435. })
  436.  
  437. $('.readPage').dblclick(function () {
  438. if(!flagBOT){
  439. clearTimeout(timeClick);
  440. timePagesec = prompt("请输入翻页间隔(毫秒)(默认:10000)", timePagesec);
  441. if(timePagesec != null && /^\d+$/.test(timePagesec)){
  442. if(timePagesec < 1000){timePagesec = 1000;}
  443. $('.iconPage').attr('title', "间隔:" + timePagesec + "(双击修改)");
  444. GM_setValue("timePagesec",timePagesec);}
  445. else{timePagesec = GM_getValue("timePagesec");}
  446. //else{alert("当前为挂机模式,已关闭自动翻页");}
  447. }})
  448.  
  449. $('.readBOT').click(function () {
  450. flagBOT = true;
  451. flagPlay = false;
  452. flagPage = false;
  453. numPlay=0;
  454. if(flagt){readerControls[0].style.opacity = 0;};
  455. GM_addStyle(`.autoReads{box-shadow: 0 8px 32px rgba(0,25,104,.1);}`);
  456. GM_addStyle(`.readBOT{box-shadow: 0 0 5px 2px rgba(0,255,0,1);}`);
  457. clearTimeout(timePage);
  458. clearTimeout(timeStop);
  459. if(iFlagp == 0){
  460. cancelAnimationFrame(timePlay);
  461. autoPlay();}
  462. if(iFlagp == 1){
  463. clearInterval(timePlay);
  464. timePlay = setInterval(autoPlay, 20);}
  465. if(timeStopmin != 0){timeStop = setTimeout(() => $('.readStop').click(),timeStopmin*60000);};
  466. if(il != 0){requestWakeLock();};
  467. GM_setValue("flagPage",flagPage);
  468. })
  469.  
  470. $(document).keydown(function(event){
  471. if(event.keyCode == 96){
  472. if(!flagPlay && !flagBOT) {$('.readPlay').click();}
  473. else {$('.readStop').click();}}
  474. });
  475.  
  476. })
  477. }
  478. function playAuto(){
  479. if(iFlagp < playAutos.length-1){iFlagp++;}
  480. else{iFlagp = 0;}
  481. GM_setValue("numFlagp",iFlagp);
  482. location.reload();
  483. };
  484.  
  485. if(flagt){
  486. GM_registerMenuCommand(scrollTops[0],scrollTop);
  487. $(window).scroll(function(){
  488. var scroll = $(this).scrollTop();
  489. var paddingtop = $(".navBarOffset").css("padding-top"),lineheight;
  490. if (document.querySelector(".readerHeaderButton")){
  491. lineheight = $(".readerHeaderButton").css("line-height");}
  492. else{lineheight = 0}
  493. var scrollTop = parseFloat(paddingtop) + parseFloat(lineheight);
  494. if(scroll <= scrollTop){
  495. // 顶部显示
  496. readerTopBar[0].style.opacity = 1;
  497. //readerControls[0].style.opacity = 1;
  498. }else{
  499. // 下滑隐藏
  500. readerTopBar[0].style.opacity = 0;
  501. if(!flagPlay && !flagBOT){
  502. readerControls[0].style.opacity = 0;
  503. if(iFlagp != 2){GM_addStyle(`.autoRead{opacity:0;}`)}}
  504. }
  505. readerTopBar[0].addEventListener('mouseenter', function(){ readerTopBar[0].style.opacity = 1});
  506. readerTopBar[0].addEventListener('mouseleave', function(){ if(scroll <= scrollTop){ readerTopBar[0].style.opacity = 1}else{ readerTopBar[0].style.opacity = 0}});
  507. readerControls[0].addEventListener('mouseenter', function(){ readerControls[0].style.opacity = 1});
  508. readerControls[0].addEventListener('mouseleave', function(){ readerControls[0].style.opacity = 0});
  509. });
  510. }
  511. else{GM_registerMenuCommand(scrollTops[1],scrollTop);}
  512. function scrollTop(){
  513. flagt = !flagt;
  514. GM_setValue("flagt",flagt);
  515. location.reload();
  516. };}