如何检测用户是否删除了 Telegram Bot 聊天?
How can I detect whether a user deletes the Telegram Bot chat?
是否可以通过 API 检查是否有人删除了 Telegram 中的 Bot Chat?
我的测试:目前如果用户删除聊天,新消息不会停止发送给用户。
没有。只有在向用户发送内容时出错。
如果用户阻止聊天,即使调用 sendChatAction 方法也不会 return 错误:
$ 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"}
你可以获得getChat
方法(https://core.telegram.org/bots/api#getchat)。如果用户停止并阻止 bot,此方法 return 403
status
其他答案有人建议使用getChat方法。
不要使用它有两个原因:
- 即使他们可以 return 一些特殊的错误,他们也可以随时更改。相反,任何发送方法都应该是安全的! (这是我几个月前联系官方支持得到的答案)
- 根据我的使用情况,我知道 getChat 结果可以缓存很多周,你不会得到安全的结果。也就是说,即使在他们将机器人踢出群组一个月后,我仍然能够使用 getChat 获得群组的常规结果。
那你能做什么?你可以使用 send 方法,我建议你使用 sendChatAction 这样你就不会打扰用户。
您可以处理异常并检查错误代码 returned(403 是本例的错误)。此外,目前我写这个答案,如果用户阻止了机器人,returned 字符串包含单词“blocked”,而如果他删除了帐户,字符串包含单词“deactivated”。
例如,对于我的机器人,我开发了一个自动按时间间隔运行的功能,它有一个 for 循环并尝试向每个用户发送聊天操作。我检查了错误的代码(403 是为了这个),我检查了错误的文本。如果它包含“blocked”,我只是在数据库中将用户标记为已阻止,因为我想保留首选项,否则如果它包含“deactivated”,我会从数据库中删除该用户。
我这样做是为了统计我的机器人有多少用户以及其中有多少人没有阻止机器人。
如果你想做这样的事情,还记得在 for 循环中添加一个睡眠,因为在达到限制之前你每秒只能使用 30 个 sendChatAction。
这由新的电报更新解决:
2021 年 3 月 9 日
机器人 API 5.1
添加了两种新的更新类型
添加了有关聊天中成员状态更改的更新,由 class ChatMemberUpdated 以及更新中的字段 my_chat_member 和 chat_member 表示class。该机器人必须是聊天中的管理员才能接收 chat_member 其他聊天成员的更新。默认情况下,仅 my_chat_member 接收有关机器人本身的更新。
更改日志 link : https://core.telegram.org/bots/api#march-9-2021
是否可以通过 API 检查是否有人删除了 Telegram 中的 Bot Chat?
我的测试:目前如果用户删除聊天,新消息不会停止发送给用户。
没有。只有在向用户发送内容时出错。
如果用户阻止聊天,即使调用 sendChatAction 方法也不会 return 错误:
$ 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"}
你可以获得getChat
方法(https://core.telegram.org/bots/api#getchat)。如果用户停止并阻止 bot,此方法 return 403
status
其他答案有人建议使用getChat方法。
不要使用它有两个原因:
- 即使他们可以 return 一些特殊的错误,他们也可以随时更改。相反,任何发送方法都应该是安全的! (这是我几个月前联系官方支持得到的答案)
- 根据我的使用情况,我知道 getChat 结果可以缓存很多周,你不会得到安全的结果。也就是说,即使在他们将机器人踢出群组一个月后,我仍然能够使用 getChat 获得群组的常规结果。
那你能做什么?你可以使用 send 方法,我建议你使用 sendChatAction 这样你就不会打扰用户。
您可以处理异常并检查错误代码 returned(403 是本例的错误)。此外,目前我写这个答案,如果用户阻止了机器人,returned 字符串包含单词“blocked”,而如果他删除了帐户,字符串包含单词“deactivated”。
例如,对于我的机器人,我开发了一个自动按时间间隔运行的功能,它有一个 for 循环并尝试向每个用户发送聊天操作。我检查了错误的代码(403 是为了这个),我检查了错误的文本。如果它包含“blocked”,我只是在数据库中将用户标记为已阻止,因为我想保留首选项,否则如果它包含“deactivated”,我会从数据库中删除该用户。 我这样做是为了统计我的机器人有多少用户以及其中有多少人没有阻止机器人。 如果你想做这样的事情,还记得在 for 循环中添加一个睡眠,因为在达到限制之前你每秒只能使用 30 个 sendChatAction。
这由新的电报更新解决:
2021 年 3 月 9 日 机器人 API 5.1
添加了两种新的更新类型
添加了有关聊天中成员状态更改的更新,由 class ChatMemberUpdated 以及更新中的字段 my_chat_member 和 chat_member 表示class。该机器人必须是聊天中的管理员才能接收 chat_member 其他聊天成员的更新。默认情况下,仅 my_chat_member 接收有关机器人本身的更新。
更改日志 link : https://core.telegram.org/bots/api#march-9-2021