Telegram机器人监听群成员离开并自动发送欢送消息的完整实现

本文详解如何利用Telegram Bot API监听群组成员离开事件,并通过机器人自动发送欢送消息,涵盖原理、代码实现与部署建议。

阅读提示涉及账号和安全设置时,请边阅读边核对当前设备界面。

在Telegram群组运营中,成员离开是常见的场景。如果能让机器人自动识别成员退群并发送一条暖心的欢送消息,不仅能够维护良好的社群氛围,还能提升群组的管理效率。本教程将手把手教你通过Telegram Bot API监听群组成员离开事件,并发送自定义的欢送消息,即使你是初学者也能轻松上手。

一、准备工作

在开始编写代码之前,你需要完成以下准备工作:

  • 一个Telegram机器人:通过@BotFather创建,获取API Token。
  • 将机器人添加为目标群组的成员,并设置为群组管理员。
  • 确保机器人拥有“读取消息”和“查看成员”的权限(管理员权限中需勾选相应项)。
  • 一台可以运行Python的电脑或服务器(云服务器更佳)。

二、理解离开事件:chat_member更新

Telegram Bot API提供了多种更新类型,其中 chat_member 更新可用来检测群组成员变动。当机器人是群组管理员时,一旦有成员加入、退出或被移除,机器人都会收到一个 chat_member 对象。该对象中的 new_chat_member.status 字段表示成员的新状态,常见的状态有:

  • left:成员主动退出群组。
  • kicked:成员被管理员移除(被踢出)。
  • member:成员在群组中。
  • administrator:成员成为管理员。

我们通过判断状态为 leftkicked 即可触发离开事件。需要注意的是,chat_member 更新只有在机器人具备管理员权限时才会推送,所以务必确认权限设置。

三、使用Python编写监听代码

下面我们使用 requests 库直接调用Bot API,实现长轮询监听。你也可以使用 python-telegram-botaiogram 框架,但直接调用API能让我们更清楚地理解底层原理。

import requests
import time

TOKEN = 'YOUR_BOT_TOKEN'
BASE_URL = f'https://api.telegram.org/bot/'

def get_updates(offset=None):
    params = {'timeout': 30, 'offset': offset}
    resp = requests.get(BASE_URL + 'getUpdates', params=params)
    return resp.json()['result']

def send_message(chat_id, text):
    data = {'chat_id': chat_id, 'text': text}
    requests.post(BASE_URL + 'sendMessage', json=data)

def handle_update(update):
    if 'chat_member' in update:
        chat_member = update['chat_member']
        new_status = chat_member['new_chat_member']['status']
        if new_status in ['left', 'kicked']:
            chat_id = chat_member['chat']['id']
            user = chat_member['new_chat_member']['user']
            first_name = user.get('first_name', '这位朋友')
            # 可自定义欢送语
            text = f"欢送  离开群聊,江湖再见!👋"
            send_message(chat_id, text)

def main():
    offset = None
    while True:
        try:
            updates = get_updates(offset)
            for update in updates:
                handle_update(update)
                offset = update['update_id'] + 1
        except Exception as e:
            print(f"获取更新失败: ")
        time.sleep(1)

if __name__ == '__main__':
    main()

YOUR_BOT_TOKEN 替换为你自己的Token,然后运行脚本。现在,当有群成员退出或被踢出时,机器人就会在该群发送欢送消息。如果希望区分主动退出和被移除,可以分别设置不同的文案,例如:

if new_status == 'left':
    text = f" 主动离开了群聊,祝一切顺利!"
elif new_status == 'kicked':
    text = f" 被移除了群聊,再见!"

四、使用Webhook替代长轮询

在生产环境中,推荐使用Webhook方式,这样消息能够即时推送,减少资源占用。你需要有一个公网HTTPS地址,然后执行:

curl -F "url=https://你的域名/路径" https://api.telegram.org/bot<TOKEN>/setWebhook

Webhook的处理逻辑与轮询类似,只需将接收到的JSON数据解析并传递给 handle_update 函数。具体可参考Telegram官方文档,此处不再展开。

五、部署建议与进阶技巧

5.1 部署环境

建议将脚本部署到云服务器或轻量级容器中,使用systemd或Docker守护进程,保证7×24小时运行。你还可以参考站内已有的宝塔面板部署教程轻松上线。

5.2 避免消息发送频率限制

Telegram Bot API对发送消息有频率限制(每秒最多约30条)。如果群组人数众多,同时大量成员变动,可能会触发限制。建议在代码中加入简单的流量控制,或使用消息队列(如RabbitMQ)异步处理。

5.3 定制欢送内容

欢送消息可以支持HTML或Markdown格式,例如添加昵称链接、表情、甚至发送图片或GIF。你只需要在 send_message 中增加 parse_mode 参数即可。

六、常见问题FAQ

  • 为什么机器人收不到离开事件? 请确认机器人已经是群管理员,并且没有在群内被限制权限。
  • 如何区分成员主动退出和被踢? 通过 new_chat_member.status 字段:left 表示主动退出,kicked 表示被移除。
  • 机器人可以监听所有群吗? 只能监听机器人自己所在且具备管理员权限的群。
  • 欢送消息会显示谁发的吗? 消息由机器人发送,会显示为机器人的头像和名称。

七、总结

通过Telegram Bot API监听群成员离开事件并不复杂,本文提供了基于 chat_member 更新的完整方案和可直接运行的代码。你可以基于这个基础扩展更多实用功能,例如自动记录人员流动、统计退群原因等。希望本教程对你的群组管理有所帮助,欢迎在社群中分享你的机器人实践!

FAQ

下载与安装

常见问题

为什么我的机器人收不到成员离开事件?

最常见的原因是机器人没有被设为群组管理员,或者没有开启“查看成员”权限。请确保机器人是管理员,并重新添加或更新权限。另外,Telegram Bot API只会在机器人是管理员时推送chat_member更新。

如何区分成员是主动退出还是被管理员踢出?

通过chat_member更新中new_chat_member.status字段判断:status为left表示主动退出,为kicked表示被移除。你可以根据不同的状态设置不同的欢送文案。

欢送消息能不能带上用户名或链接?

可以。在sendMessage方法中设置parse_mode为HTML或Markdown,然后在文本中使用相应的格式,比如<a href="tg://user?id=...">昵称</a>。

如果群人数很多,频繁发送消息会被限制吗?

会的。Telegram Bot API对发送消息有频率限制(约30条/秒)。建议在代码中加入延迟或使用消息队列削峰,避免触发429错误。