TGViewer
r/devs/ r/devs/ @ruadevs · 247 subscribers
Post #312 411
r/devs/ 标题栏的在线人数显示不准确
关于在线人数显示的一些细节

在实现群成员在线状态显示的时候,我偶然注意到标题栏显示的在线人数不太对劲,好像明显大于群成员列表里观察到在线群成员数。在进行了一番调查之后,发现 64Gram 确实对计算逻辑做了一些修改:

在 0e55720 中,64Gram 将计算方式从遍历群成员手动计数改为了直接调用 messages.getOnlines 来获取在线成员数量。没有任何问题,官方既然有这个接口那为什么不用呢?但是,为什么总感觉这个从接口获取到的在线人数不太对?

先把这个问题放一边,让我们看看这个接口在官方 tdesktop 里面是怎么用的吧,或许是我们的调用方式不太对呢?然而,令我感到奇怪的是,截止官方目前的最新提交,messages.getOnlines 这个接口在 tdesktop 中没有在任何地方被调用。难道是曾经用了但后来删掉了?但我翻遍了 tdesktop 的所有历史提交,似乎它真的从来没有用过这个接口。

那其他平台客户端呢?安卓和 ios 也没有使用吗?这里我让 codex 去找了一下,它给出的结果是安卓和 ios 客户端都是使用这个接口的,就连 tdlib 的实现也是使用了的,只不过不同客户端对使用这个接口的人数条件不太一样。那为什么就 tdesktop 没有使用这个接口呢?小编也很好奇,如果你是 tdesktop 的开发人员,欢迎在私聊中告诉我原因 :)

话再说回来这个接口本身,它返回的在线人数真的是准确的吗?这里根据我的测试,对于小于 200 人的群聊,它返回的数量似乎总是远大于逐个遍历成员得到的结果。具体来说,一个 89 人的群聊中,API 返回结果为在线 33 人,本地遍历结果为在线 9 人;在另一个 25 人的群聊中,API 返回在线 10 人,本地遍历得到在线 4 人。大于 200 人的群聊未实际测试。

所以这可能可以解释为什么在不同的官方客户端实现中,开发者总是优先选择本地遍历一遍群成员来获取在线数量,而不是直接调用 messages.getOnlines 来获取了。或许开发人员本来就知道这个接口的结果不准?或者说,至少它返回的结果不是一个 "完全实时" 的结果,可能是最近一段时间里的累计在线成员数量。

总而言之,最后我决定直接改成官方客户端的类似实现,对小于 200 人的群进行逐个计算,大于的话仍然调用接口来显示数量。哦对了,这里反复提到的 200 人实际上是服务端下发的 chat_size_max 云控值,根据定义,它的含义是 normal group (也就是非 supergroup) 的最大限制人数。
  • 🤔 2
  • 🤣 1
More from @ruadevs
  1. Oct 11, 2026windows x64 与 macos 版本均已通过 Actions 上传到 releases。 winarm qt6 版本不知道为什么最后又报错了,本来期待着这次所有 CI 能全…
  2. Oct 11, 2026Yurigram v7.3.1 更新日志 - 修复了一些 bug - 增强设置中新增「显示最近转发目标」选项 - 为 Win/MacOS 构建启用了自动更新,尚未测试 ———— 下…
  3. Oct 9, 2026由于 CI 又遇到了问题,windows 这次临时改发我本地构建的版本,macOS 再等等吧( #yurigram #win
  4. Oct 9, 2026Yurigram v7.3.0 更新日志 1. BotUse 模块: 使用 Bot 身份发送消息 现在可以直接在 Yurigram 中使用 Bot 账号登录,并在聊天中以 Bot…
  5. Oct 9, 2026https://github.com/telegramdesktop/tdesktop/releases/tag/v7.3.0 Money.
  6. Sep 27, 2026服务端不知道从什么时候已经开始限制新的 emoji 了。如果你之前设置过了,现在已经绝版了😉
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →