NodeJS 如何在Telegram API中处理STATS_MIGRATE_4错误?

hgncfbus  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(125)

我使用node.js和gram-js库来处理TDlib。在我的项目中,我使用GetBroadcastStats调用从多个组收集统计数据。这是一个非常基本的调用,就像在文档中一样。

const stats = await client.invoke(
    new Api.stats.GetBroadcastStats({
        channel: channel,
        dark: true,
    })
);

它在大多数情况下都能正常工作,除了少数特定的通道。我得到以下错误

RPCError: 303: STATS_MIGRATE_4 (caused by stats.GetBroadcastStats)
    at RPCMessageToError (C:\Users\Igor\Desktop\work\telegram\tgStatistics\node_modules\telegram\errors\index.js:28:12)       
    at MTProtoSender._handleRPCResult (C:\Users\Igor\Desktop\work\telegram\tgStatistics\node_modules\telegram\network\MTProtoSender.js:517:58)
    at MTProtoSender._processMessage (C:\Users\Igor\Desktop\work\telegram\tgStatistics\node_modules\telegram\network\MTProtoSender.js:442:15)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async MTProtoSender._recvLoop (C:\Users\Igor\Desktop\work\telegram\tgStatistics\node_modules\telegram\network\MTProtoSender.js:418:17) {
  code: 303,
  errorMessage: 'STATS_MIGRATE_4'

经过对文档的一些研究,我找到了这个问题的原因。文件规定:query must be sent to the datacenter with ID channelFull.stats_dc, obtainable using channels.getFullChannel.在我的例子中,我有数据中心2的客户端,但数据中心4的通道。显然,这是与TDlib本身有关的问题。我不知道如何改变我的客户端的数据中心,甚至是可能的。当我测试的每个电报客户端都无缝地执行统计数据收集时,这个特定的操作需要如此多的额外操作,这似乎有点奇怪。我将感激任何帮助

zaqlnxep

zaqlnxep1#

经过几天的搜索,我终于找到了解决方案。因此,电报文档还包含有关切换服务器的信息。因此,从Telegram下载文件时可能会发生类似的错误。Gram-js库中已经添加了文件下载功能,所以我可以查看源代码如何做到这一点。使用它,我创建了自己的交换数据中心实现。

const fullChannel = await client.invoke(
    new Api.channels.GetFullChannel({
        channel: channel,
    })
);
const sender = await client.getSender(fullChannel.fullChat.statsDc);
const stats = await client.invoke(
    new Api.stats.GetBroadcastStats({
        channel: fullChannel.fullChat.id.value,
        dark: true
    }),
    sender
);

它在任何情况下对我都有效。但建议只在客户端dcId与fullChannel.fullChat.statsDc不同时实现服务器切换

相关问题