Telegram 如何从电报API获取最新/新消息

Telegram 如何从电报API获取最新/新消息,telegram,Telegram,我正在尝试从电报API获取最新消息(而不是bot API)。我目前正在使用messages.getHistory,但它会从一开始就返回所有消息。如果我收到新消息(自从我登录后),也可以 到目前为止,我的最佳选择是读取所有消息,然后跟踪偏移量,这样我就不会再读取相同的消息,但这太慢,而且资源成本太高。有一种更简单的方法可以从电报API获取实时更新 如果您将TCP连接设置为非轮询,则只要您的电报帐户有更新,消息就会被推送到您的手中 这消除了您提到的成本,而且您根本没有得到任何副本 对于我的Teleg

我正在尝试从电报API获取最新消息(而不是bot API)。我目前正在使用messages.getHistory,但它会从一开始就返回所有消息。如果我收到新消息(自从我登录后),也可以


到目前为止,我的最佳选择是读取所有消息,然后跟踪偏移量,这样我就不会再读取相同的消息,但这太慢,而且资源成本太高。

有一种更简单的方法可以从电报API获取实时更新

如果您将TCP连接设置为非轮询,则只要您的电报帐户有更新,消息就会被推送到您的手中

这消除了您提到的成本,而且您根本没有得到任何副本

对于我的Telegram客户端,我只需在启动时运行此功能即可成功完成此操作:

TL.invokewithlayer(layer, TL.initconnection(app_id, device_model, system_version, app_version, lang_code, TL.help_getconfig))

然后,我只需在连接的TCP套接字到达时处理传入的数据。

查尔斯的回答为我指明了正确的方向。对于那些对node.js版本感兴趣的人,我通过使用电报链接模块并将connectionType设置为TCP,成功地使其工作:

var telegramLink = require('telegram.link')();

// set the  environment
var app = {
    // NOTE: if you FORK the project you MUST use your APP ID.
    // Otherwise YOUR APPLICATION WILL BE BLOCKED BY TELEGRAM
    // You can obtain your own APP ID for your application here: https://my.telegram.org
    id: 12345,
    hash: 'somehashcode',
    version: require('../package.json').version,
    lang: 'en',
    deviceModel: os.type().replace('Darwin', 'OS_X'),
    systemVersion: os.platform() + '/' + os.release(),
    connectionType: 'TCP'
};

//var primaryDC = telegramLink.TEST_PRIMARY_DC;
var primaryDC = telegramLink.PROD_PRIMARY_DC;

...

telegramLink.createClient(app, dataCenter, function() {
...
简单的一点是,将其更改为TCP将为您提供所需的效果,并且您将在RegisterOnUpdate中获得推送给您的消息:

clientProxy.getClient().account.updateStatus(false).then(function() {
    clientProxy.getClient().registerOnUpdates(function(update) {
        console.log('update', update.toPrintable());

        clientProxy.getClient().messages.receivedMessages(update.id, function(err) { console.log(err); });
    });
...
注意收到的消息-如果你不打这个电话,电报将不会给你发送任何新的更新。如果未在电报链接中定义receivedMessages,请将以下代码添加到lib/api/messages.js:

// ***
// messages.**receivedMessages(max_id, [callback])**

// Return a Promise to Confirms receipt of messages by a client, cancels PUSH-notification sending.

// [Click here for more details](https://core.telegram.org/method/messages.receivedMessages)
Messages.prototype.receivedMessages = function(max_id, callback) {
    return utility.callService(api.service.messages.receivedMessages, this.client, this.client._channel, callback, arguments);
};

您是如何设置TCP连接的?您是在轮询数据,还是在侦听来自电报服务器的传入数据?我的连接没有问题,我可以完全检索信息。这不是聊天机器人(即没有轮询模式或webhook模式),但我的方式是轮询服务器的前20条消息,然后继续,直到没有消息留下为止。但关键是,我不需要旧的信息-我只需要新的信息,在我签署inI后,我会问另一个原因david。我知道这不是聊天机器人。有一种更简单的方法可以从电报API获取实时更新。请看下面我提出的解决方案,它对我有效。它可能有效,但我需要您的更多帮助。我使用的是Telegram Link foor node.js,所以看起来我们是一致的。很抱歉,我在api上找不到任何最新的电报参考。所以有两个问题;1-如何设置非轮询模式2-我应该使用什么方法获取消息?如果我按照你说的方式设置,只会将新消息推送到消息中。getHistory?实际上你甚至不需要发送任何消息。一旦您的TCP套接字或连接设置为活动模式,则可用字节将被简单地推送到您的计算机上。最新版本的语音呼叫电报等是第65层。你可以在这里看到scheme.tl:非常感谢,让我把它归结为一些特定的node.js代码,然后回来谢谢你为我指明了正确的方向。对于那些对node.js代码感兴趣的人,请参阅我的回答:谢谢,API缺少文档,您正在解决一个常见的PBG问题。您知道我们是否可以使用telegram.link通过node接收频道MSG?我不能让它工作@David@GuilhemFry我已经有一段时间没有这样做了,但当时我做到了;是的,我们可以,这没什么特别的