You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测Telegram Bot用户离开?群组事件不适用于私聊场景

检测Telegram机器人用户离开的实用方案

兄弟,我太懂你遇到的问题了!Telegram Bot API在私聊和群聊的事件支持上确实有差异,你提到的new_chat_participantleft_chat_participant本来就只针对群组场景,而new_chat_members压根就不是用来检测私聊用户的——它是给群组加新人用的。下面给你几个实打实的解决方案:

1. 实时检测:用my_chat_member事件抓拉黑/屏蔽

这是目前唯一能**实时检测私聊用户是否"离开"(拉黑、屏蔽机器人)**的方法!这个事件会在机器人自身在聊天中的状态变化时触发,比如用户在私聊里拉黑你,或者取消拉黑,都会收到通知。

举个Python的例子(用python-telegram-bot库):

from telegram import Update
from telegram.ext import CallbackContext, ChatMemberHandler, Updater

def track_bot_status(update: Update, context: CallbackContext):
    chat_member_info = update.my_chat_member
    user_id = chat_member_info.from_user.id
    new_status = chat_member_info.new_chat_member.status

    if new_status == "kicked":
        print(f"用户 {user_id} 拉黑机器人了!")
        # 这里写你要执行的逻辑:比如删用户数据、记日志
    elif new_status == "member":
        print(f"用户 {user_id} 取消拉黑了,欢迎回来!")

def main():
    updater = Updater("你的机器人Token")
    dp = updater.dispatcher
    # 注册my_chat_member事件处理器
    dp.add_handler(ChatMemberHandler(track_bot_status, ChatMemberHandler.MY_CHAT_MEMBER))
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

注意:这个事件要求Bot API版本在4.4以上,现在主流的Bot库都支持了,放心用就行。而且它还能处理群聊里机器人被踢的情况,一举两得。

2. 离线判断:通过用户活跃时间标记"失联"

如果不需要实时检测,只是想找出长期不互动的用户,那可以记录用户的最后活跃时间:

  • 每次收到用户的消息(不管是命令还是文本),就更新该用户ID对应的时间戳;
  • 定时跑个任务,比如每天检查一次,把超过阈值(比如30天)没互动的用户标记为"疑似离开"。

伪代码大概是这样:

import datetime

# 用字典存用户最后活跃时间,生产环境建议用数据库
user_last_active = {}

def handle_user_message(update, context):
    user_id = update.effective_user.id
    user_last_active[user_id] = datetime.datetime.now().timestamp()
    # 你的消息处理逻辑...

def check_inactive_users(context):
    # 设30天为失联阈值
    threshold = 30 * 24 * 3600
    now = datetime.datetime.now().timestamp()
    inactive_users = [uid for uid, ts in user_last_active.items() if now - ts > threshold]
    # 对这些用户做处理:比如清理数据、发提醒(如果还能发的话)

这个方法的缺点是不能实时,但胜在简单,适合做批量的用户生命周期管理。

为啥new_chat_members没触发?

最后给你补个知识点:new_chat_members是当有新用户加入群组/超级群时才会触发的,和私聊用户第一次发消息完全没关系。私聊里用户第一次找机器人,只会触发message事件,没有专门的"用户关注"事件——毕竟Telegram的私聊是用户主动发起的,机器人没法知道用户什么时候"加"了自己,只有用户发第一条消息才会收到通知。

总结一下:要实时抓拉黑用my_chat_member,要找长期不互动的用活跃时间统计,这俩方案基本能覆盖你的需求了。

内容的提问来源于stack exchange,提问作者HOSSEIN IZADI

火山引擎 最新活动