项目

从“够着键盘翻页”到手机遥控:我做了「遥卷」

1639 字
8 分钟

项目地址:zhuimeng1233/yaojuan-reader
技术栈:Python / FastAPI / WebSocket / 原生 HTML、CSS、JavaScript

一个很小、但每天都会遇到的问题#

用电脑看长篇小说很舒服。屏幕够大,字号、行距和阅读宽度都能调,坐姿也比低头看手机轻松得多。

问题是,人不可能一直端坐在桌前。

想往后靠在椅背上,或者窝进沙发里,手还是要伸向键盘敲 PageDown,或者摸鼠标滚轮。偶尔看几页没什么,连续读上几个小时,这种反复够键盘的动作就很打断沉浸感。

用手机看当然也能解决姿势问题,但小屏幕装不下多少内容。字号放大后,一页只有几行字,手指需要不停地上滑。手机还会发热、耗电,屏幕上的正文也未必适合在公共场合一直亮着。

于是有了「遥卷」:电脑负责大屏排版,手机只负责遥控。

手机屏幕不显示小说正文,也不接收正文内容。它更像一个握在手里的无线触控手柄,负责翻页、滚动、切换分幕、调节字号和主题。人可以坐得舒服一点,文字仍然留在电脑的大屏幕上。

手机不做阅读器,只做手柄#

手机端和电脑端通过局域网 WebSocket 连接。电脑端生成一个 8 位临时 PIN 码,手机扫码或打开局域网地址后完成配对。

配对成功后,手机端只发送经过白名单校验的控制指令:

  • 上下翻页。
  • 在虚拟滑板上连续滚动。
  • 跳到上一幕或下一幕。
  • 调整字号。
  • 切换主题、目录和沉浸模式。
  • 回到章节顶部或底部。

电脑端会限制允许接入的手机数量,也可以查看当前设备并主动断开。PIN 刷新后,旧 PIN 无法继续建立新连接。

手机端中央是一块大面积的虚拟滑板。手指慢慢上下移动时,电脑上的页面会平滑滚动;轻点一下则向下翻页。触控事件按浏览器刷新节奏合并,并在发送缓冲区积压时丢弃高频滑动包,避免高刷新率手机把网络塞满。

如果小说里有二级分幕,手机上的“上一幕 / 下一幕”会在当前章节内部定位。到达章节边界后,再自然切换到相邻章节。

长文本的关键不是“全塞进去”,而是少渲染#

长篇小说的内容动辄数百万字、上千章。把所有正文和目录一次性塞进 DOM,首屏看似加载完了,后续滚动和目录操作却很容易变卡。

「遥卷」采用了两层控制:

  1. 章节级正文渲染:DOM 中只保留当前章节,切章时再替换正文节点。
  2. 百章目录分组:章节数量较多时按百章拆分,当前卷优先展开,其他卷按需加载。

后端读取大文件时使用线程池,避免文件 I/O 和编码转换阻塞事件循环。文本解码支持 UTF-8、GB18030、GBK,以及带 BOM 的 UTF-16。

全文搜索会显示章节、上下文摘要和高亮关键词。为了避免搜索过程冻结页面,扫描带主线程时间预算,优先保证阅读界面仍然可以操作。

局域网里,也不是所有接口都对外开放#

这是一个局域网工具,但“手机能连接”不等于“手机能读取整座书库”。

「遥卷」把访问范围拆成了两层:

  • 局域网设备可以打开手机遥控页,并建立带 PIN 鉴权的遥控连接。
  • 电脑阅读页、书单接口、正文接口和阅读端 WebSocket 只允许本机访问。

局域网请求访问状态接口时,只会拿到最低限度的连接信息,不会看到 PIN、设备列表或本机网卡地址。书库接口还有路径白名单和扩展名限制,正文读取会阻挡路径穿越和目录外文件。

这些限制不是为了把个人工具做成复杂的权限系统,而是为了守住一个最基本的隐私边界:手机可以控制翻页,但看不到电脑里的正文。

书架可以整理,但不会碰原文件#

阅读器会自动扫描 books/ 目录,也可以挂载外部文件夹,或者把 TXT、MD 文件直接拖进页面。

书架条目支持“从书架移除”和“恢复已移除”。移除只会改变当前浏览器里的书架显示,不会删除、移动或修改原文件。所有书都移除时,页面会显示明确的空书架状态,而不是一直停在加载动画。

阅读体验#

电脑阅读端提供 5 套主题:

  • 暖黄羊皮纸。
  • 豆沙淡绿。
  • 极简水墨白。
  • 夜间雅灰。
  • 纯黑 OLED。

字号、行距和正文宽度都可以即时调整。阅读位置会保存在浏览器本地,重新打开同一本书时继续从上次的章节和滚动位置读起。旧版本保存的设置、进度和遥控 PIN 也做了迁移兼容。

键盘操作仍然保留:空格和方向键翻页,B 打开目录,S 搜索,T 切换主题,F 进入全屏或沉浸模式。

开始使用#

Terminal window
git clone https://github.com/zhuimeng1233/yaojuan-reader.git
cd yaojuan-reader
pip install -r requirements.txt
python server.py

Windows 用户也可以直接双击 run.bat。脚本会检查 Python 和依赖,再启动本地服务。

仓库里放了四篇原创示例文本,覆盖双层分幕、普通 TXT 章节和无分幕 Markdown。启动后可以直接体验目录、分幕、搜索和手机遥控。

手机和电脑需要连接到同一个局域网。扫码打开遥控页并输入电脑端显示的临时 PIN 即可连接。

测试#

Terminal window
python test_server.py

测试覆盖入口、PIN 鉴权、设备数量上限、遥控指令白名单、局域网阅读隔离、路径穿越、递归书库扫描和遥控断开等边界。

GitHub Actions 会在 Python 3.10 和 3.12 上运行同一套测试。

为什么叫“遥卷”#

“遥”是隔着一块屏幕遥控,“卷”是长篇小说读不完的篇幅。

合在一起,就是我现在想要的阅读方式:

长卷在屏,翻页在手。

项目地址:https://github.com/zhuimeng1233/yaojuan-reader

从“够着键盘翻页”到手机遥控:我做了「遥卷」
https://www.zhuimeng.fun/posts/yaojuan-reader/
作者
坠梦
发布于
2026-10-18
许可协议
CC BY-NC-SA 4.0