如何检测用户是否删除Telegram Bot聊天?

时间:2016-02-08 06:32:08

标签: telegram telegram-bot

是否可以通过API检查是否有人删除了Telegram中的Bot Chat?

我的测试:目前,如果用户删除聊天,新消息将不会停止发送给用户。

4 个答案:

答案 0 :(得分:7)

不。只有在向用户发送内容时才会收到错误。

如果用户阻止了聊天,即使调用sendChatAction方法也不会返回错误:

$ curl https://api.telegram.org/bot***/sendChatAction -d 'chat_id=7975895' -d "action=typing"
{"ok":true,"result":true}
$ curl https://api.telegram.org/bot***/sendMessage -d 'chat_id=81083738' -d "text=ololo"
{"ok":false,"error_code":403,"description":"[Error]: Bot was blocked by the user"}

答案 1 :(得分:5)

其他答案中有人建议使用getChat方法。

不要使用它有两个原因:

  • 即使他们可以返回一些特殊错误,他们也可以随时更改。相反,任何发送方法都应该安全! (这是我几个月前联系官方支持的答案)
  • 从我的用法中我知道getChat结果可以缓存很多周而且你不会有安全的结果。即使在他们从该组中踢出机器人一个月之后,我也可以使用getChat获得团体的常规结果。

那你能做什么?您可以使用发送方法,我建议您使用sendChatAction,这样您就不会打扰用户。

您可以处理异常并检查返回的错误的代码(403是这种情况下的错误)。此外,目前我写这个答案,如果用户阻止机器人,返回的字符串包含单词“blocked”,而如果他删除了该帐户,该字符串包含单词“deactivated”。

例如,对于我的机器人,我开发了一个按时间间隔自动运行的函数,它有一个for循环并尝试将sendChatAction发送给每个用户。我检查错误的代码(403就是这个),我检查错误的文本。如果它包含“被阻止”,我只是在数据库中将用户标记为已阻止,因为我想保留首选项,否则如果它包含“已停用”,我将从数据库中删除该用户。 我这样做有关于我的机器人有多少用户以及有多少用户没有阻止机器人的统计数据。 如果你想做这样的事情,还记得在for循环中添加一个sleep,因为在达到限制之前你每秒只能使用30个sendChatAction。

答案 2 :(得分:1)

此问题已通过新的电报更新解决:

2021 年 3 月 9 日 机器人 API 5.1

添加了两种新的更新类型

添加了有关聊天中成员状态更改的更新,由类 ChatMemberUpdated 以及更新类中的字段 my_chat_member 和 chat_member 表示。机器人必须是聊天中的管理员才能接收有关其他聊天成员的 chat_member 更新。默认情况下,仅接收 my_chat_member 机器人本身的更新。

更改日志链接:https://core.telegram.org/bots/api#march-9-2021

答案 3 :(得分:0)

您可以获得getChat方法(https://core.telegram.org/bots/api#getchat)。如果用户停止并阻止僵尸程序,则此方法返回403状态