【问题标题】:How to use offset on Telegram bot API webHook如何在 Telegram bot API webHook 上使用偏移量
【发布时间】:2023-03-28 21:45:01
【问题描述】:

两天以来,我一直在探索 Telegram 机器人 API,它非常简洁。但有一件事我想不通。

当您不使用 webHook 而是使用 /getUpdates 调用时,您可以通过 offset 参数告诉 API 服务器处理哪条消息。

但是你如何在 webHook 就位的情况下做到这一点呢?我不断收到与更新相同的消息。这会导致服务器向用户发送相同的消息。

我想出的解决方案如下:

  1. 从 webhook 接收更新
  2. 保存update_id
  3. 回复用户/sendMessage
  4. 禁用 webHook /setWebhook?url=
  5. 设置偏移量/getUpdates?offset={update_id+1}
  6. 恢复 webHook /setWebhook?url=https://mywebhook.domain.com

一定有更好的方法吧?有人吗?

【问题讨论】:

  • 相反,您将 webhook 保持原样,您的 webhook 处理代码会跟踪上次更新并跳过已处理的更新
  • 这也是我的第一个想法。但是在/getUpdate 通话中,我可以看到在我的测试用例中有超过 10 条消息,而 webHook 一次只给我 1 条消息。总是相同的消息(/getUpdate 呼叫的第一个消息)。并且在 Telegram 服务器上不断向我的服务器发送更新,即使所有相关消息都已处理(回复)。
  • true,但/getupdates 调用应该在每条消息中返回一个update_id。跟踪您本地的最后一个update_id,如果update_id 小于保存的ID,您可以假设它已处理
  • 是的,但这种方法存在问题。如果有人向我的机器人发送消息,webHook 会每 2 秒使用该特定消息调用我的服务器。如果其他人向我的机器人发送消息,我永远不会收到该消息。只有第一个(我每 2 秒收到一次)。所以用户 A 向我发送“/start” 10 秒后用户 B 向我发送“/something”,webhook 只向我发送“/start”消息,没有其他任何内容。

标签: api telegram-bot


【解决方案1】:

您必须告诉电报您已成功获取更新:

 - 200 response code
 &
 - empty json like this {}

【讨论】:

    【解决方案2】:

    在 webHook 上使用 This 从电报服务器获取数据:

    // get the raw POST data
    $rawData = file_get_contents("php://input");
    
    // this returns null if not valid json
    $jsonData = json_decode($rawData);
    

    【讨论】:

      【解决方案3】:

      好的,问题解决了。似乎只有 200 (OK) 是不够的(我的回复正文是 null。我已经在回复 {} 中添加了一个正文,并且知道它可以正常工作。 p>

      【讨论】:

        【解决方案4】:

        您在处理 webhook 的页面上返回什么 HTTP 状态代码? Telegram 可能正在尝试重试您的 webhook 端点,因为它没有收到您的状态 200 (OK)。

        【讨论】:

        • webhook 返回没有正文的 200。所以这不可能,或者你需要返回一些东西,但我找不到什么。
        猜你喜欢
        • 2015-10-22
        • 2017-12-17
        • 2016-04-10
        • 2018-03-12
        • 2017-05-31
        • 2017-07-22
        • 2015-09-12
        • 1970-01-01
        • 2017-01-11
        相关资源
        最近更新 更多