WebDAV 同步
路径:阅读器标题栏 → 设置 → WebDAV 同步。
设备先读取本地、远端和上次基线,再按类别三方合并并使用 ETag 写回;普通记录、翻译缓存和离线 Topic 保持各自对象边界。
WebDAV 用一个小型 JSON 文件在多个浏览器之间交换普通本地记录。通知历史、互动历史和离线 Topic 使用独立对象,不挤占也不读取主 sync.json:两类历史各保存一份按站点账号隔离的可搜索记录清单;离线 Topic 使用轻量清单和每个 Topic 独立的 HTML。普通记录按成功同步基线执行三方合并;历史清单按记录单调累积,不把尚未回填到本机的旧消息误判为删除。所有写入都使用 ETag 条件请求,远端在同步期间变化时会重新读取并重试,不会把 412 冲突当成成功;主文件、账号 scope、类别或记录无墓碑却消失时按远端回滚处理,以本机副本安全重建。

凭据区未进入截图;离线 Topic 默认关闭,开启后才同步完整明文 HTML。
坚果云配置
在坚果云安全设置中创建第三方应用密码,然后填写:
| 字段 | 坚果云示例 | 说明 |
|---|---|---|
| WebDAV 地址 | https://dav.jianguoyun.com/dav/ | 必须使用 HTTPS,地址中不能嵌入用户名或密码 |
| 用户名 | 坚果云账号邮箱 | 不是昵称 |
| 应用密码 | 单独创建的第三方应用密码 | 不使用坚果云登录密码 |
| 远端文件 | ALR-Lite/v2/sync.json | 必须同时包含目录和文件名,目录缺失时自动创建 |
凭据只保存在 userscript 专属存储,不写入远端 JSON、设置导出、请求 URL 或显式业务请求头。已保存的应用密码不会回填到页面输入框;地址和用户名不变时留空保存会继续使用本机密码,切换地址或用户名时则必须填写新密码,避免把旧凭据带到另一目标。保存后先点“测试连接”,成功后再点“立即同步”。
配置字段与类型
| 字段 | 类型与允许值 | 校验结果 |
|---|---|---|
endpoint | HTTPS URL 字符串 | 不允许内嵌账号、密码、查询参数或片段;路径会规范化为结尾带 / |
username | 字符串 | 执行连接时不能为空;只保存在本机凭据存储 |
password | 字符串 | 执行连接时不能为空;页面不会回填已经保存的值 |
remotePath | 目录加文件名的相对路径字符串 | 至少两段;空段、.、.. 或超长路径段会拒绝 |
categories | 12 个固定键组成的布尔对象 | 每个类别只有 true / false;至少启用一类 |
autoSyncEnabled | 布尔值 | 默认 false |
autoSyncIntervalMinutes | 15、30、60、180 或 360 | 其他值不会作为有效间隔;默认 60 分钟 |
远端主文件同样执行精确类型校验:format 和写入者为字符串,schemaVersion 为当前结构版本,时间戳必须是非负有限数值,删除标记必须是布尔值,活动记录必须携带 value。字段存在但类型不对时会停止同步,不会把损坏内容当成旧版本缺字段。
可选同步内容
十二类数据分别开关,关闭的类别不会上传、下载或删除:
| 类别 | 同步内容 | 明确不包含 |
|---|---|---|
| 浏览历史 | 主题、最近阅读楼层、已读楼层和查看时间 | 帖子正文 |
| 收藏记录 | 收藏链接、标题和定位信息 | 不替代或修改原站收藏 |
| 通知历史缓存 | 可搜索的普通通知记录,按账号指纹写入独立清单 | 私信、未读状态、原生通知 ID、原始接口响应 |
| 回复、Boost 与表情回应历史 | 当前缓存中的三类可搜索记录,按账号指纹写入独立清单 | 原始分页响应、请求游标、限流状态、普通收藏 |
| 设置配置 | Lite 外观、布局、性能和阅读交互设置 | WebDAV 凭据 |
| 阅读队列 | 主题链接、固定状态和入口楼层 | 帖子正文 |
| 阅读位置与窗口状态 | 最近位置、讨论窗口锚点和全屏窗口几何 | 页面 DOM |
| 自定义适用站点 | 用户添加的 HTTPS Discourse 站点 | 登录会话 |
| Connect 本机观察历史 | Connect 指标历史和服务器确认已读指纹 | Cookie 与接口响应正文 |
| AI 服务集合 | 共用 API URL、缓存模型目录、翻译业务选型及参数;API Key 使用 WebDAV 应用密码加密 | WebDAV 密码、未加密 API Key |
| 已翻译 Section 缓存 | 最近使用的译文 Section | 原文、页面 DOM |
| 离线 Topic 下载(HTML 正文) | 下载历史、完整离线 HTML 与选择范围;清单和 HTML 分开存放 | 图片和附件二进制、Cookie、页面缓存 |
普通帖子正文、图片、附件、原始分页响应、请求游标、短期限流状态和普通页面缓存不会进入 WebDAV;历史同步只读取已经存在的可搜索记录,不会为了 WebDAV 额外请求 Discourse。旧历史一般不变,因此清单按 identity 单调合并,同一记录只在内容较新时更新,不传播“本机暂时没缓存到”造成的删除。只有主动开启“离线 Topic 下载”时,完整 HTML 才会作为独立明文文件上传。默认只启用浏览历史、收藏记录和阅读队列;两类历史缓存、离线 Topic、翻译服务集合与译文缓存都必须分别主动开启。
十二类同步开关是当前设备的独立授权策略,不写入远端,也不会被另一台设备反向开启。要让两台设备交换“设置配置”,必须在两端都开启该类别、保存设置,再分别执行同步;若需要一次复制地址、远端路径、类别开关和定时策略,可使用设置导出/导入,用户名和密码仍需在每台设备本机确认。
1.3.0 之后的字段兼容
当前同步结构不仅保留 1.3.0 已有条目,也会合并后续仍有用户意义的字段:浏览历史中的分类、标签、精确楼层/滚动锚点和岁月史书状态;收藏与互动历史中的分类、标签和定位信息;AI 服务中的模型列表、模型能力目录、业务参数和动画;离线 Topic 清单中的归档状态。较新设备同步到较旧记录时,空占位不会抹掉另一端已经保存的有效分类、标签或阅读位置。
1.3.0 生成的离线 Topic v1 清单没有归档状态,1.5.0 会只把该缺失字段升级为“无存档状态”,完整 HTML 仍可导入;字段存在但类型错误时则拒绝,不能把损坏内容当成旧版迁移。主同步文件、十二类 payload、离线清单和加密 API Key 信封都使用精确字段与类型校验;加密盐、IV、迭代次数或密文结构被篡改时会在解密和本机应用前停止。
设置偏好按同一份远端快照联合校验,而不是把每个字段脱离兄弟字段单独判断。图片配置中的“共享三种形态”与浮窗/全屏/移动比例、性能预设与细项、回复树联动开关等组合会一起归一化;合法组合可以跨设备导入,字符串冒充数字、未知字段或内部不一致的组合仍会在写入和本机应用前拒绝。
与导入、重置和缓存清理的联动
- 导出设置只保存 WebDAV 地址、远端路径、类别和定时策略,不保存用户名或密码。
- 导入同一 WebDAV 地址时可以复用本机已有凭据;地址变化或凭据不完整时,定时同步会保持关闭,直到用户重新确认连接。
- 恢复全部默认 会恢复 WebDAV 默认配置并清空本机用户名和密码,但不会主动删除远端文件。
- 清理本机缓存不会生成远端删除标记;同步过的历史或收藏投影可能在下一轮从远端恢复。
- 需要迁移设备时,先在旧设备执行一次成功的“立即同步”,再在新设备配置同一地址、账号、远端文件和类别并执行“立即同步”。
手动同步与首次同步
“立即同步”始终执行合并:
- 读取远端文件及 ETag。
- 比较本机记录、远端记录与上次成功同步基线。
- 普通类别合并新增、更新和删除标记;历史缓存按 identity 单调合并。
- 条件写入成功后,才把合并结果应用到本机并更新基线。
同步开始前还会核对所有已勾选类别是否都有当前运行时端口;只要一类不可用,整轮会在读取或写入远端前停止并列出类别,不会跳过后报告部分成功。当前 schema 不认识的未来类别会原样保留但不会执行,未知未来偏好则会停止设置类别同步,避免旧客户端把新数据误判为删除。
因此,在新浏览器中清空本地队列后再同步,只要远端仍保存队列记录,就会下载并显示;如果某台设备在一次成功同步后明确删除队列项,该删除会作为删除标记传播。通知和互动历史是缓存投影,清理本机缓存不会删除远端旧历史;本机后台回填或新消息出现后,下次同步只补充或更新对应记录。远端文件、scope、类别或单条记录直接消失不等于协议删除:只有 tombstone 才会反向删除另一设备的数据。认证失败、网络中断、解析失败或冲突重试耗尽时,本机现有记录不会被清空。
定时同步
定时同步默认关闭。启用后仅在页面可见时运行,启动后先等待 30 秒,再按所选间隔串行执行。可选间隔为 15 分钟、30 分钟、1 小时、3 小时和 6 小时;坚果云按请求计数,通常建议 1 小时。
切换设备后需要立刻看到变化时,直接使用“立即同步”,不必等待下一次定时任务。若旧配置的定时同步正在进行,保存新连接配置后触发的立即同步会等待旧事务收尾,再按新目标完整执行。多个标签页或设备同时同步时仍走同一 ETag 冲突处理,不会静默覆盖较新的远端文件。
故障判断
401或403:检查账号邮箱和第三方应用密码,不要改用登录密码。404:连接测试只验证 WebDAV 根地址和账号;首次同步或已同步主文件后来消失时,会抛弃该目标的旧主文件基线并用本机安全重建目录和文件,不会把 404 当成逐条删除。若创建仍失败,检查远端路径是否包含目录与文件名。412:远端在本轮同步期间被其他设备更新,阅读器会重新读取并重试;持续出现时稍后再同步。远端 WebDAV preferences 记录 … 身份不一致:先确认两端均使用当前版本再重试。当前版本会把同一远端快照中的联动偏好一起校验;仍报错表示对应字段类型或组合确实损坏,阅读器会保留本机设置且不会写回远端。- 新设备没有记录:确认两端连接到同一个地址、账号和远端文件,并且对应类别在两端都已开启。
- 清空后记录消失:区分“只清了本地缓存”与“成功同步过删除”。前者可从远端恢复;后者会传播删除标记。
- 翻译 API Key 解密失败:确认当前 WebDAV 应用密码与加密该配置时一致;阅读器不会把无法解密的 Key 当成空值覆盖远端。
- 离线 Topic 恢复失败:确认两端都开启“离线 Topic 下载”,并检查远端
offline-topics目录中的清单和对应 HTML 对象是否都存在;对象缺失或 SHA-256 不匹配时,阅读器会报错并保留本机副本。
修改远端路径相当于切换到另一份同步文件,不会自动迁移旧路径内容。本地同步基线按 WebDAV 服务地址、WebDAV 账号、远端文件和当前站点账号隔离;切换目标后的首次同步不会套用旧目标的删除判断。更换账号或路径前先在现有配置执行一次成功同步,并记录原路径以便回退。
