1
kasusa 2023-04-25 09:53:43 +08:00
在网络请求层搞吧?
找一下发回已读的包,分析一下特征然后全都拦截掉。就不会已读了。 |
2
zwzwzwzwzxt 2023-04-25 10:40:16 +08:00 1
我搞过电脑端的。它的判断逻辑是在 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 里东一块西一块还是挺烦的。 |
3
zwzwzwzwzxt 2023-04-25 10:45:13 +08:00 1
我的定位这个函数的方法就是给飞书加一个启动参数:`--remote-debugging-port=9222`。这样用 chrome 访问 `chrome://inspect` 就能远程调试飞书的 js 代码了。打开飞书聊天页面,用元素审查器定位到聊天框。监听节点属性变化,然后一路单步调试找到的。希望能抛砖引玉一下。顺便一提,v 站不支持 markdown 的嘛。。
|
4
Bananana OP @zwzwzwzwzxt 牛逼。真的可以,感谢
|