如何确保chat_id存在?

时间:2019-05-11 13:13:43

标签: telegram telegram-bot

我写了一段代码,将消息发送到Telegram机器人。为此,我使用了通过getUpdates method检索的上一次会话的chat_id

id = requests.get(f"https://api.telegram.org/bot{token}/getUpdates").json()['result'][-1]['message']['chat']['id']

我的理解是,如果有人通过/start与该机器人启动了对话,那么该对话就存在。

如何从代码中发起对话以确保chat_id可用?(=我可以查询转化)。

我也确保不会无限期地保留对话(如果存在)(这是请求更新可以产生空结果的另一个原因)

1 个答案:

答案 0 :(得分:1)

  

我的理解是,如果有人通过/ start与漫游器启动对话,就会存在该对话。

是的,对话始终是initiated by a user

  

机器人无法发起与用户的对话。用户必须将它们添加到组中或先向他们发送消息。人们可以使用telegram.me/链接或用户名搜索来找到您的机器人。

请注意,/start不是这里唯一的选择。

如果您尝试向未开始与bot对话的用户发送消息,则会收到类似以下内容的信息:{"ok":false,"error_code":400,"description":"Bad Request: chat not found"}


  

如何从代码中发起对话以确保chat_id可用? (=我可以查询转换了。)

通常,您不必为此担心。 Bot不会使用getUpdates查询特定的用户操作/请求,而是会查询来自所有用户的所有互动,然后根据您提供的内部逻辑来决定要做什么。

每次在Update中收到来自特定用户的getUpdates时,您可能希望将有关用户和/或他们的请求的信息存储在数据库中。

基于此,机器人可以决定向他发送消息。


  

我也确信对话(如果存在)不会无限期保留(这是请求更新可能会产生空结果的另一个原因)

是的,docs clearly state

  

传入更新存储在服务器上,直到机器人以两种方式接收到它们为止,但它们的保存时间不会超过 24小时

电报服务器上的Update是生命周期较短的实体。

如果您尚未保存有关现有用户的信息或丢失了数据库,则无法从电报服务器检索该数据。


P.S .:作为旁注,我建议使用长轮询,因为Telegram Bot API is designedlong polling一起使用,如果您使用的是getUpdates。最重要的是timeout方法的getUpdates请求参数:

  

(超时为)长时间轮询的超时(以秒为单位)。 默认为0 ,即通常的短轮询。应该为正,短轮询仅用于测试目的

有问题的是,您正在使用短轮询。