我正在尝试从Telegram API( NOT bot API )获取最新消息。我目前正在使用messages.getHistory,但它从头开始返回所有消息。如果我收到新消息(因为我登录)也没关系。
到目前为止,我最好的选择是阅读所有消息,然后跟踪偏移量,以便我不会再次阅读相同的消息,但这太慢且资源成本太高。
答案 0 :(得分:2)
查尔斯'回答指出了我正确的方向。对于那些对node.js版本感兴趣的人,我设法通过使用telegram-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); });
});
...
注意收到的消息 - 如果您不打电话,那么Telegram不会向您发送任何新的更新。如果未在telegram-link中定义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);
};
答案 1 :(得分:1)
有一种更简单的方法可以从Telegram API获取实时更新。
如果您将TCP连接设置为非轮询,则只要您的电报帐户有更新,就会立即将消息推送给您。
这消除了您提到的成本,并且您根本没有得到任何重复。
对于我的Telegram客户,我已经成功完成了这项工作,只需在启动时运行:
TL.invokewithlayer(layer, TL.initconnection(app_id, device_model, system_version, app_version, lang_code, TL.help_getconfig))
然后我简单地处理来自连接的TCP套接字的传入数据。