我搞过电脑端的。它的判断逻辑是在 js 代码里的,特别好改。飞书安装目录的 `app/webcontent/messenger` 下面有一堆 js 文件,用文本搜索工具搜一下 `info("updateMessagesMeRead",` 代码片段,应该会在若干 js 文件中找到它。查看文件内容应该可以看到类似这样(我格式化了)的函数:
```js
function se(e) {
const t = function(e) {
const {channel: t, messageIds: n=[], foldIds: s} = e
, {maxPosition: r=-1, maxPositionBadgeCount: i=0} = e
, {threadId: a, threadMaxPosition: o, threadMaxPositionBadgeCount: c} = e;
return {
channel: t,
messageIds: n,
maxPosition: r,
maxPositionBadgeCount: i,
threadId: a,
threadMaxPosition: o,
threadMaxPositionBadgeCount: c,
foldIds: s
}
}(e);
return
d.Z.info("updateMessagesMeRead", (0,
N.$h)({
...t
}, ["channel", "maxPosition", "maxPositionBadgeCount", "messageIds", "threadId", "threadMaxPosition", "threadMaxPositionBadgeCount"])),
(0,
y.callApi)(I.b0f, t)
}
```
最后那个 `y.callApi` 就会把 t 传过去调 native 层的函数来向服务器发包。`messageIds` 就是要执行已读的消息 id 数组。我的做法是在 `return
d.Z.info` 之前加一条语句:`t.messageIds = [];`。把之前搜到的 js 文件都改一下(虽然好像只有一个真正会生效),重启下飞书就行了。
不过这个目前还不够完美,如果对其他人的消息贴表情或者回复他那一条消息,还是会把那个消息变成已读。估计它们应该走的不同的逻辑。确实还是在 native 层集中拦截网络包更好一些,js 里东一块西一块还是挺烦的。