浏览记录 · Browse History Logger
记录你在 Anki「卡片浏览器」里依次看过哪些卡 —— 这是 Anki 本身不提供的能力。
Anki 只记三类时间戳:added(添加)、edited(编辑)、rated / introduced(复习评分)。
浏览不属于其中任何一类 —— 既不发评分(不入 revlog),也不改内容(不动 mod),
在数据层等于没发生过,搜索语法里也没有 browsed:n 这样的过滤器。
本插件把这件事补上。
功能
| 能力 | 说明 |
|---|---|
| 记录浏览顺序 | 时间戳 + nid + cid + 牌组 + 题型 + 题干摘要 + 当时的搜索条件 |
| JSONL 日志 | 按月分文件,一行一条,UTF-8,可直接 grep |
| 查看界面 | 按日期分组、关键词过滤、点击表头正/反向排序(nid 按数值排)、双击跳回那张卡、导出 CSV(UTF-8-BOM,Excel 不乱码);快捷键 Ctrl+Shift+H 一键打开(可用 shortcut_view 配置修改或禁用) |
| 批量调出 | 一键把某天浏览过的卡在浏览器中打开(nid: 检索),或打开当前筛选结果(上限 2000 张) |
| 按月清理 | 勾选要删除的月份(连滚动备份一起删),或一键删除 N 个自然月之前的全部日志;也可用 retain_months 启动时自动清理 |
| 复习界面(可选) | also_log_reviewer: true 后也记录复习时看过的卡,来源标 reviewer |
设计原则
- 只读不写 —— 插件绝不修改任何卡片内容,只往自己的日志文件追加。
- 不影响 Anki —— 所有回调整体 try/except,异常写进插件目录的
error.log,绝不打断用户。
- 日志在插件目录外 —— 存在
<Anki2 数据目录>/browse_history_logs/,重装/升级插件不会丢历史。
(v1.0.0 起目录名从 浏览记录日志 改为 browse_history_logs,首次运行会自动改名迁移,历史记录不丢。)
- 不联网 —— 不做任何网络请求,数据全部留在本机。
- 界面语言自适应 —— 随 Anki 语言设置自动切换中文 / English,也可用
language 配置强制指定。
安装
从 AnkiWeb:工具 → 附加组件 → 获取附加组件 → 填入插件编号。
从文件:工具 → 附加组件 → 从文件安装… → 选 浏览记录_BrowseHistoryLogger.ankiaddon。
装完重启 Anki。
用法
浏览器 → 编辑 菜单:
浏览记录:查看… —— 打开查看界面
浏览记录:在浏览器中只看今天看过的卡 —— 用 nid: 调出今天浏览过的卡
浏览记录:打开日志文件 —— 直接看原始 JSONL
浏览记录:清理… —— 按月勾选删除日志,或一键删除 N 个月前的全部日志
主界面 → 工具 → 浏览记录… 也能打开查看界面。
配置
工具 → 附加组件 → 浏览记录 → 配置。详见插件内的 config.md。
最常用的两项:
min_dwell_ms:默认 0(记录全部,最忠实于浏览顺序)。习惯按住 ↓ 快速扫卡的话设 800,
只记录真正停下来看的那些。
log_front_preview:设 false 则日志只存 nid、不含任何卡片文字。
retain_months:设为 1/3/6/12 等,则每次启动 Anki 自动删除 N 个自然月前的日志(0 = 永久保留)。
日志格式
{"nid": 1759455728224, "src": "browser", "search": "nid:1759455728224",
"mid": 1789302047393, "notetype": "Note", "cid": 1759455728227,
"deck": "4-笔记卡", "front": "方程的综合问题 初中代数内容的学习过程…",
"ts": "2026-10-03T11:48:23"}
开发
本插件用到的 Anki API 已逐项对照 Anki 26.9.2 的字节码核实(不是凭记忆写的),
查出并规避了两处与常见写法不同的地方:
- 浏览器 Edit 菜单的属性名是
menuEdit(驼峰),26.x 里没有 menu_Edit;
- 读当前选中的卡要调
browser.table.get_current_note(),browser.current_note() 已不存在。
另外 browser.search 是「执行一次搜索」的方法而非字符串属性,误读会触发真实搜索 ——
代码里明确禁用了这条路径。
浏览记录插件/
├── browse_history_logger/ # 插件本体(打包时根目录放这几个文件)
│ ├── __init__.py # 全部逻辑
│ ├── manifest.json # 供 AnkiWeb 之外的渠道分发用
│ ├── config.json # 默认配置
│ ├── config.md # 配置说明(Anki 配置界面会渲染)
│ └── LICENSE # AGPL-3.0 全文
├── _build_addon.py # 打包 + 自检 + 安装到本机 Anki
├── _smoke_test.py # 桩模块烟雾测试(不需要启动 Anki)
└── 浏览记录_BrowseHistoryLogger.ankiaddon
python _smoke_test.py # 钩子注册 / 目录迁移 / 日志读写 / 多语言 / manifest
python _build_addon.py # 清理缓存 → 打包 → 自检 → 安装
兼容性
需要 Qt6 版 Anki(23.10 及以上)。已在 Anki 26.9.2 / Python 3.13.15 / Qt 6.11.2(Windows)上实测运行。
钩子是逐个挂载的 —— 万一将来某个钩子名失效,不会连累其余功能。
许可
AGPL-3.0-or-later。见 LICENSE。