Telegram机器人/stats命令失效问题排查求助
解决Telegram机器人/stats命令无响应的问题
问题根源在于Telebot的消息处理器是按注册顺序匹配的:一旦某个处理器匹配成功,后续的处理器就不会被触发。你的代码中,@bot.message_handler(func=lambda message: True)这个通用处理器会匹配所有消息,且它的注册顺序在/stats命令处理器之前,导致发送/stats时,通用处理器先捕获了消息,send_stats函数完全没有执行的机会。
修复步骤
把通用消息处理器(echo_all)的定义移到所有命令处理器的后面,确保命令处理器能优先匹配到对应的指令。
修改后的完整代码
import telebot from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton import time # 填入你的机器人令牌 bot_token = '' # 创建机器人实例 bot = telebot.TeleBot(bot_token) # 存储统计数据的字典 statistics = {} total_messages = 0 unique_users = set() # /start命令处理器 @bot.message_handler(commands=['start']) def send_welcome(message): bot.reply_to(message, "Привет! Я бот, который будет отправлять сообщения из группы, в личную переписку!") # /stats命令处理器 @bot.message_handler(commands=['stats']) def send_stats(message): # 生成统计文本 stats_text = "Статистика по ключевым словам:\n\n" for keyword, count in statistics.items(): stats_text += f"{keyword}: {count}\n" # 添加唯一用户数量信息 unique_users_count = len(unique_users) stats_text += f"\nКоличество уникальных пользователей: {unique_users_count}" # 添加总消息数量信息 stats_text += f"\nОбщее количество сообщений: {total_messages}" # 在控制台输出统计信息 print(stats_text) # 发送统计信息到指定聊天 chat_id = 'CHAT_ID' bot.send_message(chat_id, stats_text) # 通用消息处理器(处理所有其他消息) @bot.message_handler(func=lambda message: True) def echo_all(message): global total_messages # 设定要筛选的关键词和标签 keywords = ['сайт'] # 检查消息是否包含指定关键词或标签 for keyword in keywords: if keyword.lower() in message.text.lower() or f'#{keyword}' in message.text: # 发送消息到指定聊天 chat_id = 'CHAT_ID' username = message.from_user.username text = f"Найдено сообщение с ключевым словом/хештегом '{keyword}':\n\n{message.text}" keyboard = [[InlineKeyboardButton("Написать заказчику", url=f"https://t.me/{username}")]] reply_markup = InlineKeyboardMarkup(keyboard) bot.send_message(chat_id, text, reply_markup=reply_markup) # 更新对应关键词的统计计数 if keyword in statistics: statistics[keyword] += 1 else: statistics[keyword] = 1 # 更新总消息计数 total_messages += 1 # 添加用户到唯一用户集合 unique_users.add(message.from_user.id) break # 启动机器人 bot.polling()
额外说明
- 所有命令处理器必须在通用处理器之前注册,才能确保命令被优先识别
- 调整顺序后,
/start和/stats命令会被正确匹配,通用处理器只会处理非命令类的消息
内容的提问来源于stack exchange,提问作者Larry Dog
相关产品推荐
相关产品推荐

