在Telegram社群运营中,自动监听群消息并回复是最高频的需求之一。无论是客服答疑、关键词提醒,还是社群管理员的自动化辅助,一个能“听懂”群聊并即时响应的机器人,都能大幅提升效率。本文将从实战角度出发,手把手教你用Python实现Telegram机器人监听群消息并自动回复,覆盖两种主流方案,并给出可运行代码与优化建议。
方案对比:Bot API轮询 vs Telethon客户端模式
在开始之前,我们需要明确两种实现路径的区别,以便根据场景选择最合适的方式。
- Bot API轮询(getUpdates / Webhook):官方Bot API,通过HTTP请求获取更新。适合个人机器人和中小型群组,部署简单,但只能操作机器人自己可见的消息。
- Telethon客户端模式:基于MTProto协议,以用户身份登录,可以监听整个群组的消息(包括普通用户的消息),功能更强大,但需要用户账号授权,存在一定的账号风险。
如果你要监听的是“群内所有人的发言”,必须使用Telethon;如果只处理机器人收到的命令或回复(比如@机器人),则用Bot API即可。下面分别实战。
环境准备与机器人创建
无论哪种方案,都需要先安装Python环境(3.8+),并创建Telegram机器人。步骤如下:
- 在Telegram中搜索 @BotFather,发送
/newbot,按提示设置名称和用户名,获得BOT_TOKEN(形如123456:ABC-DEF...)。 - 安装必要的库:
(若只用Bot API,可仅安装pip install telethon python-telegram-botpython-telegram-bot)。 - 准备一个测试群组,并把机器人(或你的用户账号)加入群组,授予相应权限。
用Telethon监听群消息并回复(完整代码)
Telethon允许你以用户身份监听群内所有消息。下面是一个最简可用的示例:监听指定群聊中所有包含“订单”或“客服”关键词的消息,并自动回复一条固定文案。
import asyncio
from telethon import TelegramClient, events
# 在 https://my.telegram.org 获取 api_id 和 api_hash
api_id = 123456
api_hash = 'your_api_hash'
phone = '+8613900000000' # 手机号
client = TelegramClient('session_name', api_id, api_hash)
# 群组标识:可以是群名、群ID或邀请链接(需设置为可解析)
TARGET_GROUP = 'My Group'
@events.register(events.NewMessage(chats=TARGET_GROUP))
async def handler(event):
# 忽略自己发的消息,避免死循环
if event.out:
return
text = event.message.text or ''
# 关键词触发回复
if ('订单' in text) or ('客服' in text):
await event.reply('您好,已收到您的消息,客服将尽快处理,请稍候。')
async def main():
await client.start(phone=phone)
print('监听中... Ctrl+C 退出')
await client.run_until_disconnected()
if __name__ == '__main__':
asyncio.run(main())
注意事项:
chats参数支持群组名精确匹配,但建议使用群ID或邀请链接以提高准确率。- 更多过滤条件(如只回复图片、视频等)可通过
event.message.media判断。 - Telethon需要有效的手机号登录,并会提示输入验证码,请确保账号安全。
用Bot API轮询实现自动回复(Webhook与getUpdates)
使用官方Bot API,监听机器人被@或接收的消息。下面用 python-telegram-bot 实现简单轮询,监听群组中 /keyword 命令并回复。
from telegram.ext import Application, CommandHandler, MessageHandler, filters
BOT_TOKEN = '123456:ABC-DEF'
async def start(update, context):
await update.message.reply_text('机器人正常运行,发送 /help 查看指令。')
async def auto_reply(update, context):
# 非命令消息触发回复(按需过滤)
if update.message.chat.type in ('group', 'supergroup'):
if '你好' in update.message.text:
await update.message.reply_text('你好呀!我是本群助手机器人。')
async def help_cmd(update, context):
await update.message.reply_text('支持关键词:你好')
def main():
app = Application.builder().token(BOT_TOKEN).build()
app.add_handler(CommandHandler('start', start))
app.add_handler(CommandHandler('help', help_cmd))
# 只处理文本消息,忽略命令
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, auto_reply))
app.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == '__main__':
main()
这种方式仅当群内用户直接@机器人或发送命令时才会触发,默认收不到普通用户的纯消息。若需要监听所有群消息,请使用Telethon方案。
高级技巧:关键词匹配、白名单与防刷屏
实际生产环境中,直接回复所有消息可能造成骚扰。我们需要加入精细控制:
- 正则匹配:支持更灵活的关键词,例如价格、电话、邮箱等,使用
re.search。 - 用户白名单/黑名单:只回复特定用户,或忽略指定用户,避免机器人被滥用。
- 频率限制:同一用户短时间内多次触发,只回复一次,防止刷屏。
- 随机延时:模拟人工回复,降低被平台风控的概率。
下面是一个升级版的Telethon示例,整合了这些功能:
import asyncio, re, time
from telethon import TelegramClient, events
# ... 初始化同上 ...
# 配置
ALLOWED_USERS = None # None 表示所有用户,或写入用户ID集
BLACKLIST = {12345678}
LAST_REPLY = {} # 用于频率控制
@events.register(events.NewMessage(chats=TARGET_GROUP))
async def handler(event):
if event.out:
return
sender = await event.get_sender()
user_id = sender.id
if BLACKLIST and user_id in BLACKLIST:
return
if ALLOWED_USERS and user_id not in ALLOWED_USERS:
return
text = event.message.text or ''
# 正则匹配价格或订单号
if re.search(r'订单[0-9]{6,}|价格.*?\d', text):
# 防刷屏:同一用户120秒内只回复一次
now = time.time()
if user_id in LAST_REPLY and now - LAST_REPLY[user_id] < 120:
return
LAST_REPLY[user_id] = now
await event.reply('相关业务已提交工单,请耐心等待。')
潜在风险与合规建议
使用Telethon模拟用户登录会触犯Telegram服务条款,存在封号风险。建议:
- 优先使用官方Bot API,配合
getUpdates轮询或Webhook,安全稳定。 - 若必须监听群内消息,可使用群组添加机器人并设为管理员,机器人通过
chat_member或message更新(Bot API的gruop消息在特定条件下机器人也能获取?实际上Bot默认收不到普通消息,除非启用privacy mode(需通过BotFather设置)。设置后机器人也只能收到命令、被@和回复的消息,并非全部。若想全部,还是需要Telethon)。 - 对用户隐私保持尊重,只处理必要信息,避免存储敏感内容。
- 定期检查官方API文档,因为策略可能更新。
总结
本文从零开始演示了Telegram机器人监听群消息并自动回复的两种实现路径:官方Bot API适合标准场景,Telethon适合强监听需求。通过关键词匹配、白名单和频率控制,可以打造一个高效且不扰人的群管助手。建议先在小范围试用,逐步优化回复逻辑,最终部署到正式环境。记住,合规与安全永远是自动化脚本的基石。