给飞书 Linux 桌面版(Electron,/opt/bytedance/feishu)打两个补丁,一个脚本搞定:
- 🕵️ 防撤回:对方撤回的消息,你仍能看到原文 —— 显示为「xxx撤回了一条消息**: 原文内容**」。
- 👀 防对方已读(回复才已读):你只看不回时,对方界面一直显示「未读」;只有你回复后,才把可视范围的消息标记为已读 —— 更自然、不易被察觉(复刻 Windows 吾乐吧行为)。
配套 systemd 自动重打:飞书自动更新覆盖补丁后自动重新打上,装一次基本一劳永逸。
💡 防撤回缓存法思路参考 Windows「吾乐吧」补丁 flydoos/FeiShuRevokeMsgPatcher; 防已读思路参考 starccy/feishu-unreadme。
📌 当前实测生效版本:飞书 Linux
7.58.14(记录于 2026-07)。其它版本可能因 minified JS 结构变化需重新锚定正则,脚本失配时会中止且不改原文件。
⚠️ 仅供学习研究与个人使用,风险自负。改的是飞书本地 asar 文件,不碰账号、不联网上传任何数据。
飞书桌面端是 Electron 应用,聊天逻辑在打包的 messenger-next.asar(JS)里。本补丁解包 → 正则注入 → 重打包。
桌面撤回会抹掉本地原文、只留「xxx撤回了一条消息」系统提示 —— 所以不能事后渲染,要提前缓存:
- 撤回前:在会话预览更新(
upsertPreviews)时,把每条消息的{id, 内容}存进localStorage; - 撤回时:系统提示渲染处按消息 id 取回缓存,拼到提示后面。
飞书看过消息后会调用 …info("updateMessagesMeRead", { …messageIds }) 把已读 id 上报服务器。所有触发(滚动看到 / 回复)都汇到这一个上报函数。
补丁把它改成门控:只在你刚发送消息的 2.5 秒窗口内放行上报,否则清空 →
- 纯浏览(窗口外)→ 上报被清空 → 对方一直未读;
- 你回复后(窗口内)→ 飞书对可视消息的已读上报被放行 → 对方看到已读。
t.messageIds = (globalThis.__flReadWin && Date.now() < globalThis.__flReadWin) ? t.messageIds : []窗口在发送函数(sendMessage/sendMessageV2)里开启:globalThis.__flReadWin = Date.now()+2500。
⚠️ 两个易错点:① 已读上报跑在 web worker,必须用globalThis(用window会ReferenceError崩整页);② 窗口必须开在与上报函数同一 realm 的发送函数里(开在 renderer 侧的onSendMessageSuccess里globalThis不共享、传不过去)。
详细逆向过程见
docs/防撤回-复盘-封档误判到缓存法破局.md。
- Linux + 飞书桌面版装在
/opt/bytedance/feishu(其它路径可作参数传入) - Python 3
sudo(asar 是 root 拥有)
git clone <本仓库>
cd feishu-linux-patch
# 打补丁(关掉飞书后执行)
sudo python3 patch_feishu.py # 默认 /opt/bytedance/feishu
# sudo python3 patch_feishu.py /自定义/飞书路径
# 重启飞书生效
pkill -9 -x feishu ; /opt/bytedance/feishu/feishu &首次运行会把原 asar 备份为 messenger-next.asar.bak。输出示例:
[已读门控·回复放行] 注入点: 2
[发送开窗] 注入点: 9
[防撤回·缓存写] 注入: 1
[防撤回·缓存读] 拼接: 2
✅ 已写入 …/messenger-next.asar
飞书自动更新会覆盖 asar、抹掉补丁。装上 systemd 自动重打,更新后自动补上:
sudo bash autopatch/install.sh # 部署 + 启用
journalctl -u feishu-autopatch.service -f # 看日志
sudo bash autopatch/uninstall.sh # 卸载.path监听 asar 变化(更新瞬间触发)+.timer开机/每 30 分钟兜底;- 幂等:补丁在位就跳过,缺失才重打,不循环、不空转;
- 详见
autopatch/README.md。
注:自动重打改的是磁盘文件,正在运行的飞书需重启一次才加载新补丁(飞书更新一般会自己重启)。
重跑一次即可:
sudo python3 patch_feishu.py && (pkill -9 -x feishu ; /opt/bytedance/feishu/feishu &)脚本会自动判断:当前 asar 是干净版(更新后)就把它设为新基线;已打补丁版才用现有 .bak。不会拿旧基线覆盖新版。
sudo cp /opt/bytedance/feishu/webcontent/messenger-next.asar.bak \
/opt/bytedance/feishu/webcontent/messenger-next.asar
pkill -9 -x feishu ; /opt/bytedance/feishu/feishu &ASAR=/opt/bytedance/feishu/webcontent/messenger-next.asar
grep -c recalledMessageCacheList "$ASAR" # 防撤回 >0
grep -cF '__flReadWin' "$ASAR" # 防已读(回复才已读) >0防撤回:缓存来自会话预览 = 各聊天最后一条,撤回最近消息最稳;很老的历史消息可能没缓存;只对打补丁后新到的消息有效;图片/表情显示 [图片]/[表情]。
防已读(只堵主入口):引用回复、给消息贴表情、接收对方文件仍会向对方泄露「已读」。
版本兼容:拦的是 minified JS 的结构特征,飞书大改版可能失配 —— 脚本会中止且不改原文件,日志会提示。届时按复盘文档思路重新锚定正则。
- 飞书新版实际加载的是
messenger-next.asar,不是遗留的messenger.asar(改错文件=形态全对但零效果)。用sudo lsof | grep asar可确认。 - 注入禁忌:别插在
let{...}=this.props后(截断声明表 → 飞书「页面异常」崩)。
patch_feishu.py 补丁脚本(防撤回 + 防已读)
patch_feishu_unread.py 旧版(仅防已读,保留备查)
asar.py asar 解包/打包库
autopatch/ systemd 自动重打(install/uninstall + 单元文件)
docs/ 逆向复盘文档
- 防撤回缓存法思路参考 Windows「吾乐吧」补丁 flydoos/FeiShuRevokeMsgPatcher。
- 防已读思路参考 starccy/feishu-unreadme。
asar.py源自 BeautifulDiscord(MIT)。
本项目仅用于个人学习研究。使用者需自行承担风险并遵守飞书用户协议与当地法律。作者不对任何后果负责。