【问题标题】:How to get the latest/new messages from Telegram API如何从 Telegram API 获取最新/新消息
【发布时间】:2017-09-14 14:41:13
【问题描述】:

我正在尝试从 Telegram API (NOT bot API) 获取最新消息。我目前正在使用 messages.getHistory ,但这会从头开始返回所有消息。如果我收到新消息(因为我登录),那也很好。

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

【问题讨论】:

  • 您是如何设置 TCP 连接的?您是在轮询数据,还是在侦听来自 Telegram 服务器的传入数据?
  • 我的连接没有问题,我可以完全检索信息。这不是聊天机器人(即没有轮询模式或 webhook 模式),但我这样做的方式是轮询服务器以获取前 20 条消息,然后继续处理其余的消息,直到没有消息为止。但关键是,我不需要旧消息 - 我只需要登录后的新消息
  • 我问的是另一个原因,大卫。我知道这不是聊天机器人。有一种更简单的方法可以从 Telegram API 获取实时更新。请参阅下面我提出的解决方案,它适用于我
  • 我们可以使用电报机器人 api 做到这一点吗?

标签: telegram


【解决方案1】:

Charles 的回答为我指明了正确的方向。对于那些对 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会得到你想要的效果,你会在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 - 如果你不调用它,Telegram 将不会向你发送任何新的更新。如果您的电报链接中未定义 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);
};

【讨论】:

  • 太棒了,谢谢你,API 缺少文档,你正在解决一个常见的 pb
  • 你知道我们是否可以使用 telegram.link 接收带有节点的频道消息吗?我无法让它工作@David
  • @GuilhemFry 我已经有一段时间没有这样做了,但当时我做到了;是的,我们可以,这没什么特别的
【解决方案2】:

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

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

这消除了您提到的成本,并且您根本不会得到任何重复。

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

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

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

【讨论】:

  • 它可以工作,但我需要你的更多帮助。我正在使用针对 node.js 的 Telegram Link,所以看起来我们是一致的。很抱歉询问,但我在 api 上找不到任何最新的电报参考。所以两个问题; 1- 如何设置非轮询模式 2- 我应该使用什么方法来获取消息?如果我按照你说的方式设置,只会将新消息推送到messages.getHistory吗?
  • 您实际上甚至不需要发送任何消息。一旦您的 TCP 套接字或连接设置为所谓的活动模式,那么可用字节就会被简单地推送给您。
  • 具有语音通话等功能的 Telegram 最新版本是第 65 层。您可以在此处获取 scheme.tl:raw.githubusercontent.com/telegramdesktop/tdesktop/dev/Telegram/…
  • 非常感谢,让我把它归结为一些特定的 node.js 代码并返回
  • 感谢您为我指明了正确的方向。对node.js代码感兴趣的朋友请看我的回答
猜你喜欢
  • 2022-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
  • 2020-08-02
  • 2019-10-11
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多