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

Yoo*_*ian 6 telegram telegram-bot

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

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

小智 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"}


小智 6

这已通过新的电报更新解决:

2021 年 3 月 9 日机器人 API 5.1

添加了两种新的更新类型

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

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


91D*_*Dev 5

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

不要使用它有两个原因:

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

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

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

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