这是 oh-my-efb,在Ehforwardbot中用AI总结聊天 的补充篇,介绍仓库里新加的 chatlog/:把 EFB 转发过的全部消息做成一个网页,可以按会话浏览、全文搜索、按人/类型/日期筛选,登录用通行密钥(指纹或面容)。EFB 本体(微信从端、Telegram 主端、话题群)的安装和配置见上一篇,本文默认这些已经跑起来了。Note隐私提醒网页里能看到所有经过 EFB 的聊天,包括私聊。服务器上的 archive.db 和 auth.db 都是明文,服务器本身的安全要靠你自己。1. 它是什么部分跑在哪做什么网页服务 `efb-chatlog serve`独立进程网页、接口、通行密钥登录;后台每 30 秒从 `tgdata.db` 增量同步一次消息中间件 `specialhua.chatlog`EFB 进程内只记下经过的消息的会话名和发言人名,不改消息、不发消息、不向微信拉列表要点:消息来源是 Telegram 主端的 tgdata.db(msglog 表),微信收到的和你从 Telegram 发回微信的都在里面,所以能导入全部历史,不是从启用那天才开始记。网页服务和 EFB 分开跑。网页随便改、随便重启,都不会碰到微信登录。中间件是补名字用的。tgdata.db 不存发言人名字:历史消息:会话名从 slavechatinfo 和微信从端的 wxpy_puid.pkl 补。按作者 2026-09 的备份,约 94% 的消息能对上会话名,群里约 55% 能对上发言人,其余显示 8 位 ID。启用中间件之后:会话名、群昵称、备注名实时记下,新消息不再缺名字。1.1 功能一览按会话浏览,向上/向下滚动加载更早或更新的消息。全文搜索全部聊天,或只在某个会话里搜。from:名字 按发言人筛选,from:我 只看自己发的。按消息类型筛选:文字、图片、语音、视频、文件、链接、表情等。按起止日期筛选(PR #2,已合并)。会话分成群聊、私聊、公众号、系统四类,并标出它在 Telegram 里的位置:Bot 私聊、话题、绑定群(PR #3,已合并)。搜索结果可以“查看上下文”,跳回原会话前后各 30 条。图片页内放大,视频、语音、文件经服务器代取。消息旁有“在 Telegram 中打开”,跳到 Telegram 里对应的位置。不用密码,只有登记过的设备能登录。2. 准备条件说明EFB 已部署用的是本仓库的 Telegram 主端,`tgdata.db` 在 `~/.ehforwarderbot/profiles/default/blueset.telegram/`Python ≥ 3.9和 EFB 共用一个 venv 即可(EFB 本身要求 3.10+)SQLite ≥ 3.34全文索引用 trigram 分词。Ubuntu 22.04、Debian 12 及以后自带的就够一个域名例如 `chat.example.com`,解析到服务器HTTPS 反向代理通行密钥只能在 HTTPS 下用。下文以 Caddy 为例检查 SQLite 版本:BASH复制source ~/efb-venv/bin/activate python -c "import sqlite3; print(sqlite3.sqlite_version)"3. 安装BASH复制cd ~/oh-my-efb git pull source ~/efb-venv/bin/activate pip install -e ./chatlog依赖:fastapi、uvicorn、webauthn>=2.0、requests、ruamel.yaml,会随 pip 一起装上。装完会多出一个命令 efb-chatlog。4. 配置配置和数据都在 ~/.ehforwarderbot/profiles/default/specialhua.chatlog/,首次运行任何 efb-chatlog 命令会自动建这个目录。BASH复制mkdir -p ~/.ehforwarderbot/profiles/default/specialhua.chatlog nano ~/.ehforwarderbot/profiles/default/specialhua.chatlog/config.yamlYAML复制domain: chat.example.com # 必填。网页域名,通行密钥绑定在它上面,改了以后所有设备都要重新登记 # listen: 127.0.0.1:8765 # 网页服务监听地址 # session_days: 30 # 登录一次管多少天 # sync_seconds: 30 # 后台同步间隔(秒) # tgdata_timezone: Asia/Shanghai # tgdata.db 里时间的时区,默认取服务器时区bot token 和管理员 ID 直接读 Telegram 主端的 blueset.telegram/config.yaml,不用再填。配置了辅助 bot 的话,它们的 token 也会一并读取,用来取回各自发出的媒体文件。目录里最终会有:文件内容删掉会怎样`config.yaml`配置服务起不来`archive.db`消息副本和全文索引下次同步从 `tgdata.db` 重新导入`auth.db`登记的设备和登录会话等于注销所有设备BASH复制chmod 600 ~/.ehforwarderbot/profiles/default/specialhua.chatlog/config.yamlNote用了其他配置档(不是 default)时,所有命令加 -p 档名,或设置环境变量 EFB_PROFILE。数据根目录可用 EFB_DATA_PATH 改。5. 导入历史BASH复制efb-chatlog sync首次会导入全部历史,屏幕上显示进度,结束时打印新增条数和用时。以后不用手动跑,网页服务会在后台增量同步。6. 启动网页服务写入 /etc/systemd/system/efb-chatlog.service:INI复制[Unit] Description=EFB chat log web After=network.target [Service] ExecStart=/root/efb-venv/bin/efb-chatlog serve Restart=on-failure [Install] WantedBy=multi-user.targetExecStart 里的路径按你的 venv 改。BASH复制sudo systemctl daemon-reload sudo systemctl enable --now efb-chatlog journalctl -u efb-chatlog -f7. 反向代理与 HTTPSCaddy 会自动申请证书,/etc/caddy/Caddyfile:TEXT复制chat.example.com { reverse_proxy 127.0.0.1:8765 }BASH复制sudo systemctl reload caddy注意:通行密钥只在 HTTPS 和配置的 domain 下可用。用 IP 或别的域名打开,页面会提示“当前地址不能使用通行密钥”。网页服务只信任来自 127.0.0.1 的 X-Forwarded-For,所以反向代理要和它在同一台机器上,否则登录频率限制看到的都是代理的 IP。8. 启用中间件不启用也能用,但新消息的发言人只能显示 ID,建议加上。在 ~/.ehforwarderbot/profiles/default/config.yaml 里加一行:YAML复制middlewares: - specialhua.summary - specialhua.chatlog然后重启 EFB:BASH复制sudo systemctl restart efb9. 登记设备在要登记的设备上打开 https://chat.example.com,点“登记这台设备”。bot 在 Telegram 私聊里发来一条登记链接,10 分钟内有效,只能用一次。消息里写着申请来源的 IP 和浏览器,不是你本人操作就忽略。在这台设备上打开那条链接,起个名字,用指纹或面容创建通行密钥。也可以在服务器上发起:BASH复制efb-chatlog enroll以后登录点“使用通行密钥登录”即可。苹果设备的通行密钥经 iCloud 钥匙串同步:Mac 上登记过,同一 Apple ID 的 iPhone 通常能直接登录,设备列表里会标出“已同步”。10. 使用10.1 浏览会话左侧是会话列表,可以按群聊、私聊、公众号、系统筛选,也可以搜会话名。点开一个会话,向上滚动加载更早的消息。会话分类的依据,按可靠程度依次是:中间件在消息经过时记下的类型(公众号靠微信从端带的公众号标记分出来)。Telegram 主端 slavechatinfo 里记的类型。都没有时看发言人:出现过群成员就是群聊,只有对方本人就是私聊,只有自己发过消息的算未知,只在“全部”里出现。会话旁另外标着它在 Telegram 里的位置(Bot 私聊、话题、绑定群),这只是投递位置,和群聊/私聊无关。没用话题分流以前,没绑定的群和私聊都发在 Bot 私聊里。10.2 搜索写法效果`报销`2 个字逐条匹配,百万条约 0.3 秒`发票抬头`3 个字及以上走全文索引,毫秒级`机票 周五`空格分隔,要求同时出现`from:张三 机票`只看张三发的,匹配昵称、群昵称、备注`from:我`只看自己发的链接消息的标题和摘要也会被搜到。在会话里搜索只搜这个会话。结果点“查看上下文”跳到原会话,前后各 30 条,上下滚动继续加载。10.3 按日期筛选消息区顶部选起止日期,只搜这段时间的消息(含结束那天)。不输关键词、只选日期:按时间倒序列出这段时间的消息。在某个会话里选日期:只看这个会话。10.4 媒体图片点击后页内放大,点击、Esc 或返回关闭。图片、音频、视频由服务器经 Bot API 实时代取;其他文件一律作为下载。超过 20MB 的文件 Bot API 下载不了。动态贴纸(.tgs)只显示占位文字。11. 与 efb-search-msg-middleware 的区别efb-search-msg-middleware(catbaron.search_msg)也是为了解决同一个问题:Telegram 不对中文分词,用自带搜索找微信消息几乎找不到。它的做法是在 Telegram 里发命令搜索。efb-search-msg-middlewarechatlog在哪搜Telegram 里发 `\sr 关键词 from:时间 to:时间`独立网页历史消息只有启用后经过它的消息从 `tgdata.db` 导入启用前的全部历史运行方式EFB 中间件,在 EFB 进程内网页服务独立进程;中间件只补名字,可选关键词单个词,不能含空白多个词同时出现;3 字以上走 trigram 全文索引按人回复某条消息再发命令;作者信息可能存成 `None`,不太可靠`from:名字`,匹配昵称、群昵称、备注按时间`from:` / `to:` 时间参数,默认最近 15 天日期选择器,默认不限按类型无文字、图片、语音、文件、链接等会话分类无群聊、私聊、公众号、系统结果怎么看结果列在 Telegram 里,可定位到原消息;条数由 `max_num` 控制网页列表,可查看上下文、看图、下载文件,也能跳到 Telegram登录不需要,借 Telegram 账号通行密钥,设备需经 bot 登记部署成本`pip install` + 改配置 + 重启 EFB另需域名、HTTPS 反向代理、systemd 服务维护状态0.1.0,2020-12-31 发布,作者自述早期开发版本仓库维护怎么选:只想在 Telegram 里偶尔搜一下最近的消息,不想多开端口和域名:用 efb-search-msg-middleware。它依赖 Python 3.6 / EFB 2.0 时代的环境,在新版本上能否正常工作需要自己测。想搜全部历史、按人按日期筛、在大屏上翻聊天记录:用 chatlog。两者不冲突,可以同时启用。12. 设备管理与安全12.1 管理设备网页右上角“设备”里可以看到所有设备、移除设备、退出登录。移除一个设备后,用它登录的会话立刻失效。命令行:BASH复制efb-chatlog devices # 列出设备 efb-chatlog revoke <ID> # 移除一个设备 efb-chatlog revoke all # 全部移除(手机丢了的时候用) efb-chatlog sync # 手动同步一次12.2 安全设计没有密码,也没有账号名。只认登记过的通行密钥,每次都要求设备本地验证(指纹、面容或设备密码)。登记链接和会话令牌在服务器上只存哈希;每个登录 challenge 只能用一次,5 分钟过期。Cookie 用 __Host- 前缀,带 HttpOnly、Secure、SameSite=Strict;所有写操作校验 Origin。严格的 CSP(脚本只认每次随机生成的 nonce),禁止被嵌入其他页面。媒体只有图片、音频、视频按原类型返回,其余作为下载并加 sandbox。频率限制:每个 IP 5 分钟内 20 次登录尝试;申请登记每个 IP 每分钟 1 次、全局每小时 3 次。每登记一台新设备,bot 都会通知你。13. 日常维护更新:BASH复制cd ~/oh-my-efb git pull source ~/efb-venv/bin/activate pip install -e ./chatlog sudo systemctl restart efb-chatlog只改了网页服务时,重启 efb-chatlog 即可,不影响微信登录。中间件有改动时才需要重启 EFB。备份:BASH复制cd ~/.ehforwarderbot/profiles/default tar czf ~/chatlog-backup-$(date +%F).tgz specialhua.chatlog/config.yaml specialhua.chatlog/auth.dbarchive.db 可以从 tgdata.db 重建,一般不用备份;要备份它,先停掉 efb-chatlog。auth.db 里是登记过的设备,不要外传。常见问题:现象处理启动报“缺少配置文件”检查 `specialhua.chatlog/config.yaml` 是否存在、`domain` 是否填了页面提示“当前地址不能使用通行密钥”用配置的域名、通过 HTTPS 打开改了 `domain` 后登录不了通行密钥绑定域名,所有设备需重新登记新消息发言人显示 8 位 ID没启用 `specialhua.chatlog` 中间件消息时间差了几个小时设置 `tgdata_timezone`想重建索引停服务,删 `archive.db`,`efb-chatlog sync`14. 限制只有经过 EFB 转发的消息。Telegram 里不经过 EFB 的普通聊天不在这里。媒体靠 Telegram 的 file_id 实时取回,超过 20MB 的取不了。动态贴纸只显示占位文字。历史消息的发言人名字只能补上一部分(见第 1 节)。15. 最后仓库地址:specialhua/oh-my-efb,部署说明以 chatlog/README.md 为准。
这是 oh-my-efb,在Ehforwardbot中用AI总结聊天 的补充篇,介绍仓库里新加的 chatlog/:把 EFB 转发过的全部消息做成一个网页,可以按会话浏览、全文搜索、按人/类型/日期筛选,登录用通行密钥(指纹或面容)。
EFB 本体(微信从端、Telegram 主端、话题群)的安装和配置见上一篇,本文默认这些已经跑起来了。
隐私提醒
网页里能看到所有经过 EFB 的聊天,包括私聊。服务器上的 archive.db 和 auth.db 都是明文,服务器本身的安全要靠你自己。
1. 它是什么
部分
跑在哪
做什么
网页服务 `efb-chatlog serve`
独立进程
网页、接口、通行密钥登录;后台每 30 秒从 `tgdata.db` 增量同步一次消息
中间件 `specialhua.chatlog`
EFB 进程内
只记下经过的消息的会话名和发言人名,不改消息、不发消息、不向微信拉列表
要点:
1.1 功能一览
2. 准备
条件
说明
EFB 已部署
用的是本仓库的 Telegram 主端,`tgdata.db` 在 `~/.ehforwarderbot/profiles/default/blueset.telegram/`
Python ≥ 3.9
和 EFB 共用一个 venv 即可(EFB 本身要求 3.10+)
SQLite ≥ 3.34
全文索引用 trigram 分词。Ubuntu 22.04、Debian 12 及以后自带的就够
一个域名
例如 `chat.example.com`,解析到服务器
HTTPS 反向代理
通行密钥只能在 HTTPS 下用。下文以 Caddy 为例
检查 SQLite 版本:
3. 安装
依赖:fastapi、uvicorn、webauthn>=2.0、requests、ruamel.yaml,会随 pip 一起装上。装完会多出一个命令 efb-chatlog。
4. 配置
配置和数据都在 ~/.ehforwarderbot/profiles/default/specialhua.chatlog/,首次运行任何 efb-chatlog 命令会自动建这个目录。
bot token 和管理员 ID 直接读 Telegram 主端的 blueset.telegram/config.yaml,不用再填。配置了辅助 bot 的话,它们的 token 也会一并读取,用来取回各自发出的媒体文件。
目录里最终会有:
文件
内容
删掉会怎样
`config.yaml`
配置
服务起不来
`archive.db`
消息副本和全文索引
下次同步从 `tgdata.db` 重新导入
`auth.db`
登记的设备和登录会话
等于注销所有设备
用了其他配置档(不是 default)时,所有命令加 -p 档名,或设置环境变量 EFB_PROFILE。数据根目录可用 EFB_DATA_PATH 改。
5. 导入历史
首次会导入全部历史,屏幕上显示进度,结束时打印新增条数和用时。以后不用手动跑,网页服务会在后台增量同步。
6. 启动网页服务
写入 /etc/systemd/system/efb-chatlog.service:
ExecStart 里的路径按你的 venv 改。
7. 反向代理与 HTTPS
Caddy 会自动申请证书,/etc/caddy/Caddyfile:
注意:
8. 启用中间件
不启用也能用,但新消息的发言人只能显示 ID,建议加上。在 ~/.ehforwarderbot/profiles/default/config.yaml 里加一行:
然后重启 EFB:
9. 登记设备
也可以在服务器上发起:
以后登录点“使用通行密钥登录”即可。
苹果设备的通行密钥经 iCloud 钥匙串同步:Mac 上登记过,同一 Apple ID 的 iPhone 通常能直接登录,设备列表里会标出“已同步”。
10. 使用
10.1 浏览会话
左侧是会话列表,可以按群聊、私聊、公众号、系统筛选,也可以搜会话名。点开一个会话,向上滚动加载更早的消息。
会话分类的依据,按可靠程度依次是:
会话旁另外标着它在 Telegram 里的位置(Bot 私聊、话题、绑定群),这只是投递位置,和群聊/私聊无关。没用话题分流以前,没绑定的群和私聊都发在 Bot 私聊里。
10.2 搜索
写法
效果
`报销`
2 个字逐条匹配,百万条约 0.3 秒
`发票抬头`
3 个字及以上走全文索引,毫秒级
`机票 周五`
空格分隔,要求同时出现
`from:张三 机票`
只看张三发的,匹配昵称、群昵称、备注
`from:我`
只看自己发的
10.3 按日期筛选
消息区顶部选起止日期,只搜这段时间的消息(含结束那天)。
10.4 媒体
11. 与 efb-search-msg-middleware 的区别
efb-search-msg-middleware(catbaron.search_msg)也是为了解决同一个问题:Telegram 不对中文分词,用自带搜索找微信消息几乎找不到。它的做法是在 Telegram 里发命令搜索。
efb-search-msg-middleware
chatlog
在哪搜
Telegram 里发 `\sr 关键词 from:时间 to:时间`
独立网页
历史消息
只有启用后经过它的消息
从 `tgdata.db` 导入启用前的全部历史
运行方式
EFB 中间件,在 EFB 进程内
网页服务独立进程;中间件只补名字,可选
关键词
单个词,不能含空白
多个词同时出现;3 字以上走 trigram 全文索引
按人
回复某条消息再发命令;作者信息可能存成 `None`,不太可靠
`from:名字`,匹配昵称、群昵称、备注
按时间
`from:` / `to:` 时间参数,默认最近 15 天
日期选择器,默认不限
按类型
无
文字、图片、语音、文件、链接等
会话分类
无
群聊、私聊、公众号、系统
结果怎么看
结果列在 Telegram 里,可定位到原消息;条数由 `max_num` 控制
网页列表,可查看上下文、看图、下载文件,也能跳到 Telegram
登录
不需要,借 Telegram 账号
通行密钥,设备需经 bot 登记
部署成本
`pip install` + 改配置 + 重启 EFB
另需域名、HTTPS 反向代理、systemd 服务
维护状态
0.1.0,2020-12-31 发布,作者自述早期开发版
本仓库维护
怎么选:
两者不冲突,可以同时启用。
12. 设备管理与安全
12.1 管理设备
网页右上角“设备”里可以看到所有设备、移除设备、退出登录。移除一个设备后,用它登录的会话立刻失效。
命令行:
12.2 安全设计
13. 日常维护
更新:
只改了网页服务时,重启 efb-chatlog 即可,不影响微信登录。中间件有改动时才需要重启 EFB。
备份:
archive.db 可以从 tgdata.db 重建,一般不用备份;要备份它,先停掉 efb-chatlog。auth.db 里是登记过的设备,不要外传。
常见问题:
现象
处理
启动报“缺少配置文件”
检查 `specialhua.chatlog/config.yaml` 是否存在、`domain` 是否填了
页面提示“当前地址不能使用通行密钥”
用配置的域名、通过 HTTPS 打开
改了 `domain` 后登录不了
通行密钥绑定域名,所有设备需重新登记
新消息发言人显示 8 位 ID
没启用 `specialhua.chatlog` 中间件
消息时间差了几个小时
设置 `tgdata_timezone`
想重建索引
停服务,删 `archive.db`,`efb-chatlog sync`
14. 限制
15. 最后
仓库地址:specialhua/oh-my-efb,部署说明以 chatlog/README.md 为准。