2017-04-03 1229 views
2

我试图从Telegram API(而不是bot API)获取最新消息。我目前正在使用messages.getHistory,但它从头开始返回所有消息。如果我收到新消息(自登录以来)也可以。如何从Telegram API获取最新/新消息

到目前为止,我最好的选择是读取所有消息,然后跟踪偏移量,以免再次读取相同的消息,但这太慢且资源昂贵。

+0

您如何设置TCP连接?你是在轮询数据,还是在收听来自电报服务器的传入数据? –

+0

我的连接没有问题,我可以完全检索信息。这不是一个聊天机器人(即没有轮询模式或webhook模式),但我这样做的方式是轮询服务器的前20条消息,然后继续前进,直到没有消息。但重点是,我不需要旧的消息 - 我只需要新的消息,在我登录 –

+0

之后,我要求了一个不同的理由大卫。我知道这不是一个聊天机器人。从电报API获取实时更新有一个更简单的方法。看到我下面提出的解决方案,它适用于我 –

回答

1

从Telegram API获取实时更新有一个更简单的方法。

如果您将TCP连接设置为非轮询,那么只要您的电报帐户有更新,就会将消息推送给您。

这消除了你提到的成本,你根本没有得到任何重复。

对于我的电报的客户我已经通过简单地在启动时运行此成功做到了这一点:

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

然后,我只是从连接的TCP套接字处理传入的数据,因为它到达。

+0

它可以工作,但我需要更多的帮助。我使用的是电报链接foor node.js,所以看起来我们是一致的。对不起,但我在api上找不到任何最新的电报资料。所以有两个问题; 1-如何设置非轮询模式2-我应该使用什么方法来获取消息?如果我按照你说的方式设置它,只有新消息被推送到messages.getHistory? –

+0

你甚至不需要发送任何消息。一旦你的TCP套接字或连接被设置为所谓的主动模式,那么可用的字节将被推送给你。 –

+0

语音通话等电报的最新版本是65层。您可以在这里得到scheme.tl:https://raw.githubusercontent.com/telegramdesktop/tdesktop/dev/Telegram/Resources/scheme.tl –

2

查尔斯的回答指出了我的正确方向。对于那些有兴趣在Node.js的版本,我设法得到它的工作通过电报-Link模块和设置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会给你想要的效果,你会得到消息的registerOnUpdates推到你:

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 - 如果你不叫这个做,那么报文将无法收到任何新的更新。如果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); 
}; 
+0

感谢你的API文档缺乏的,而你解决一个共同的PB –

+0

你知道,如果我们可以使用telegram.link节点接收通道封邮件?我不能让它工作@大卫 –

+0

@GuilhemFry我还没有现在这样做了一段时间,但我没有时间;是的,我们可以,而且它没什么特别的 –