【发布时间】:2023-03-28 21:45:01
【问题描述】:
两天以来,我一直在探索 Telegram 机器人 API,它非常简洁。但有一件事我想不通。
当您不使用 webHook 而是使用 /getUpdates 调用时,您可以通过 offset 参数告诉 API 服务器处理哪条消息。
但是你如何在 webHook 就位的情况下做到这一点呢?我不断收到与更新相同的消息。这会导致服务器向用户发送相同的消息。
我想出的解决方案如下:
- 从 webhook 接收更新
- 保存
update_id - 回复用户
/sendMessage - 禁用 webHook
/setWebhook?url= - 设置偏移量
/getUpdates?offset={update_id+1} - 恢复 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