我写了一段代码,将消息发送到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
可用?(=我可以查询转化)。
我也确保不会无限期地保留对话(如果存在)(这是请求更新可以产生空结果的另一个原因)
答案 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
时,您可能希望将有关用户和/或他们的请求的信息存储在数据库中。
基于此,机器人可以决定向他发送消息。
我也确信对话(如果存在)不会无限期保留(这是请求更新可能会产生空结果的另一个原因)
传入更新存储在服务器上,直到机器人以两种方式接收到它们为止,但它们的保存时间不会超过 24小时。
电报服务器上的Update
是生命周期较短的实体。
如果您尚未保存有关现有用户的信息或丢失了数据库,则无法从电报服务器检索该数据。
P.S .:作为旁注,我建议使用长轮询,因为Telegram Bot API is designed与long polling一起使用,如果您使用的是getUpdates
。最重要的是timeout
方法的getUpdates
请求参数:
(超时为)长时间轮询的超时(以秒为单位)。 默认为0 ,即通常的短轮询。应该为正,短轮询仅用于测试目的。
有问题的是,您正在使用短轮询。