微信读书脚本 の 功能介绍Bilibili
快捷键 功能说明 备注
1 复制 在打开编写想法的弹窗时无效
2 马克笔 在打开编写想法的弹窗时无效
3 波浪线 在打开编写想法的弹窗时无效
4 直线 在打开编写想法的弹窗时无效
5 写想法 在打开编写想法的弹窗时无效
6 查询 在打开编写想法的弹窗时无效
esc 关闭编辑想法的弹窗
backspace 删除下划线、删除想法 在打开编写想法的弹窗时无效
ctrl + enter
cmd + enter
发表想法

测试时所使用的输入设备(键盘)说明 目前使用的是 MX Keys Mini 键盘,这是一款非全尺寸键盘,键盘外观如下:
image.png

下面介绍的所有操作,都是基于当前这个键盘来操作的,有些朋友使用的也许是全尺寸键盘,全尺寸键盘的按键会相对多一些,多出的那些按钮并非没用,不过不会介绍那些按键的使用,有需要的朋友可以自行查询相关资料

👇🏻 这是全尺寸键盘:
image.png
以下介绍的操作,不依赖红色区域的这些按键。

微信读书桌面版安装包

脚本
  1. console.log('weread script called');
  2. document.onmouseup = () => {
  3. const toolbarContainer = document.querySelector('.reader_toolbar_container');
  4. if (!toolbarContainer) return; // 未出现工具栏
  5. let copyBtn = document.querySelector('.toolbarItem.copy'), // 复制按钮
  6. underlineBgBtn = document.querySelector('.toolbarItem.underlineBg'), // 马克笔按钮
  7. underlineHandWriteBtn = document.querySelector('.toolbarItem.underlineHandWrite'), // 波浪线按钮
  8. underlineStraightBtn = document.querySelector('.toolbarItem.underlineStraight'), // 直线按钮
  9. removeUnderlineBtn = document.querySelector('.toolbarItem.removeUnderline'), // 删除划线按钮
  10. reviewBtn = document.querySelector('.toolbarItem.review'), // 写想法按钮
  11. queryBtn = document.querySelector('.toolbarItem.query'), // 查询按钮
  12. submitIdeaBtn = document.querySelector('.writeReview_submit_button.wr_btn.wr_btn_Big'), // 发表想法按钮
  13. removeIdeaBtn = document.querySelector('.readerReviewDetail_item .actions .actionItem'), // 删除想法按钮
  14. closeIdeaBtn = document.querySelector('.readerWriteReviewPanel .closeButton'); // 关闭想法窗口按钮
  15. document.onkeydown = (e) => {
  16. const isCmdBtnPressed = e.metaKey, // 是否按下了 cmd 键
  17. isCtrlBtnPressed = e.ctrlKey; // 是否按下了 ctrl 键
  18. const keyCode = e.keyCode;
  19. console.log('keyCode: ', keyCode);
  20. if (keyCode === 49) {
  21. if (isVisible_ReaderWriteReviewPanel()) return;
  22. console.log('按下 1 复制');
  23. copyBtn && copyBtn.click();
  24. } else if (keyCode === 50) {
  25. if (isVisible_ReaderWriteReviewPanel()) return;
  26. console.log('按下 2 马克笔');
  27. underlineBgBtn && underlineBgBtn.click();
  28. } else if (keyCode === 51) {
  29. if (isVisible_ReaderWriteReviewPanel()) return;
  30. console.log('按下 3 波浪线');
  31. underlineHandWriteBtn && underlineHandWriteBtn.click();
  32. } else if (keyCode === 52) {
  33. if (isVisible_ReaderWriteReviewPanel()) return;
  34. console.log('按下 4 直线');
  35. underlineStraightBtn && underlineStraightBtn.click();
  36. } else if (keyCode === 53) {
  37. if (isVisible_ReaderWriteReviewPanel()) return;
  38. console.log('按下 5 写想法');
  39. reviewBtn && reviewBtn.click();
  40. e.preventDefault();
  41. } else if (keyCode === 54) {
  42. if (isVisible_ReaderWriteReviewPanel()) return;
  43. console.log('按下 6 查询');
  44. queryBtn && queryBtn.click();
  45. } else if (keyCode === 8) {
  46. if (isVisible_ReaderWriteReviewPanel()) return;
  47. console.log('按下 backspace 删除记录(包括想法的删除和下划线的删除)');
  48. // 删除按钮在鼠标抬起的那一刻,可能还没生成
  49. removeUnderlineBtn = document.querySelector('.toolbarItem.removeUnderline');
  50. removeUnderlineBtn && removeUnderlineBtn.click();
  51. removeIdeaBtn = document.querySelector('.readerReviewDetail_item .actions .actionItem');
  52. removeIdeaBtn && removeIdeaBtn.click();
  53. } else if ((isCmdBtnPressed && keyCode === 13 || isCtrlBtnPressed && keyCode === 13)) {
  54. console.log('按下 cmd + enter | ctrl + enter 提交想法');
  55. submitIdeaBtn = document.querySelector('.writeReview_submit_button.wr_btn.wr_btn_Big');
  56. submitIdeaBtn && submitIdeaBtn.click();
  57. } else if (keyCode === 27) {
  58. if (!isVisible_ReaderWriteReviewPanel()) return;
  59. console.log('按下 esc 关闭想法记录窗口');
  60. closeIdeaBtn = document.querySelector('.readerWriteReviewPanel .closeButton'); // 关闭想法窗口按钮
  61. closeIdeaBtn.click();
  62. }
  63. };
  64. /* help info
  65. 按下 cmd:e.metaKey === true 或 e.keyCode === 91
  66. 按下 ctrl:e.ctrlKey === true 或 e.keyCode === 17
  67. 按下 backspace:e.keyCode === 8
  68. 按下 enter:e.keyCode === 13
  69. 按下 esc:e.keyCode === 27
  70. 按下 1:e.keyCode === 49
  71. 按下 2:e.keyCode === 50
  72. 按下 3:e.keyCode === 51
  73. 按下 4:e.keyCode === 52
  74. 按下 5:e.keyCode === 53
  75. 按下 6:e.keyCode === 54
  76. */
  77. }
  78. /**
  79. * 记录想法的弹窗是否可见
  80. * @returns Boolean
  81. */
  82. function isVisible_ReaderWriteReviewPanel() {
  83. const dom = document.querySelector('.readerWriteReviewPanel');
  84. if (!dom) return false;
  85. return dom.style.display === 'none' ? false : true;
  86. }

脚本的使用Bilibili评论

weread_script_use.mp4 (181.62MB)

脚本注入工具

image.png

为什么想到要写这个脚本?

在使用网页版的微信读书时,很多时候想要发表想法时,会碍于操作成本太高而放弃记录 📝 的行为。心想,如果有对应的快捷键就好了,这样记录的话就会方便很多,便给官方提了建议。隔天觉得官方可能不会采纳亦或者压根就看不到这条建议,而自己又急着用,想着自己好像也能实现,于是就 ……

image.png
image.png
问题描述:
微信读书的网页端 读书时,遇到了一个问题 —— 记录成本太高,影响阅读节奏。(尤其是在竖屏的情况下浏览)

给官方提的反馈日志 23-02-04 上午 9 点

在电脑上阅读时,希望可以添加一些快捷键,让记录更便捷

场景 1:菜单项的选择

  • 现在的操作:选中一段内容后,会在内容上方弹出一个菜单,此时需要使用鼠标去点击对应的菜单项才行。
  • 希望的操作:在弹出菜单项之后,可以通过键盘上的数字键(或者其它键)快速选择想要的操作,比如在弹出菜单后,按下键盘上的数字 1,就相当于点击了复制键

场景 2:想法的记录

  • 现在的操作:记录想法的时候,每次写完都要点击「发表」按钮才能将想法记录下来。
  • 希望的操作:写完想法后(比如在 mac 端),按下 cmd + enter 即可发表想法,这样就不需要再去摸一下鼠标,移动到发表按钮上,点击发布后才能发表了。这对于喜欢把显示器竖过来,在网页端读书的用户来说,太残忍了(每次移动鼠标的距离会特别长)。

PS:

  1. 微信读书是一个非常棒的读书平台,但是使用时遇到的上述问题,确实感觉到操作成本太高了,希望上述提到的问题在网页端可以解决一下。对开发来说,实现成本应该也不高,添加几个触发对应事件的快捷方式也许就可以实现了。
  2. 也许我提到的这俩问题其实都有对应的快捷键,但是我查阅了相关资料并没有找到,如果早就有了,希望能告知我。

邮箱 📮:dahuyou_top@163.com
希望该反馈会有专人查看,无论该建议是否被采纳,都非常希望接收到「微信读书」的回复,谢谢!

image.png
image.png

脚本功能扩展及后续更新问题

image.png

满足以下俩前提,就会做。

  • 有需要:
    • 「微信读书」没凉凉
    • 自己的在线阅读工具依旧是「微信读书」
    • 确实有这方面的记录需求
  • 有能力:新增的需求自己有能力实现

脚本没法正常使用怎么办重点

image.png

大概率是因为快捷方式冲突导致的,这种情况可以尝试换一个环境再试试看。

把脚本做成插件计划

image.png

一开始确实有这方面的打算,但是知识面有限,当时还不知道如何写插件(23.03.24现在知道了)所以就没做成插件了。不过后续会找时间将其设计为一个插件,然后再丢个视频出来吧。

做成插件的几点好处:

  • 图形操作界面:提供一个 GUI 图形操作界面,对用户来说更加友好
  • 可配置的快捷方式:可以将相关快捷方式都设计为可配置的,但凡是页面上能够点击的按钮,都可以绑定对应的快捷键