PyTelegramBotAPI如何无需/命令触发读取过滤普通聊天消息
问题根因
你写的func=lambda message: True处理器本身语法没有问题,只能响应/开头命令的核心原因基本都是以下两点:
- 最常见的情况是Bot默认开启了隐私模式(Privacy Mode):Telegram Bot默认的隐私规则下,普通群成员身份的Bot只能接收到三类消息:以
/开头的命令消息、@提及Bot的消息、Bot自身发送的消息,普通闲聊内容根本不会推送给Bot,你的处理器自然无法触发。 - 次要原因是消息处理器优先级冲突:如果你在这个全匹配处理器之前定义了其他带
commands、content_types筛选规则的处理器,匹配到对应消息时会优先触发前面的处理器,不会走到全匹配逻辑。
实现步骤
1. 配置Bot消息接收权限
两种方案二选一即可:
- 方案一(推荐):关闭隐私模式。找@BotFather发送
/setprivacy,选择你使用的Bot账号,点击Disable选项,之后把Bot从群聊移出再重新拉入,等待1分钟左右配置就会生效,Bot就能收到群内所有普通消息。 - 方案二:将Bot设置为群管理员,管理员身份的Bot不受普通隐私模式限制,可以接收群内全量消息。
2. 编写无命令分数识别逻辑
直接把正则匹配规则写到消息处理器的筛选条件里,不需要用户输入命令,只要消息内容符合分数特征就会自动触发,参考代码如下:
import re import telebot # 替换为你自己的Bot Token bot = telebot.TeleBot("YOUR_BOT_TOKEN") # 分数匹配正则,可根据你们群的报分习惯自定义规则 # 示例规则:匹配连续2-5位数字、后面可选带空白字符+「分」字的内容,适配"1200分"、"打了3400 分"、"得分 5200"这类常见表述 score_pattern = re.compile(r"(\d{2,5})\s*分") @bot.message_handler(func=lambda msg: msg.text is not None and bool(score_pattern.search(msg.text))) def record_score(message): # 提取匹配到的分数 score = score_pattern.search(message.text).group(1) sender_name = message.from_user.first_name # 此处可替换为你自己的分数存储、排行计算逻辑 bot.reply_to(message, f"已记录{sender_name}的游玩分数:{score}") if __name__ == "__main__": # 开启长轮询,none_stop=True可避免临时网络波动导致Bot断连 bot.infinity_polling(none_stop=True)
优化提示
- 正则规则不需要做全句匹配,只要能从消息文本里抓到分数片段即可,完全不需要群成员遵循固定报分格式,日常聊天里提到分数就会自动识别记录。
- 调试阶段可以临时开一个全消息匹配的handler打印收到的内容,确认消息接收正常后就可以关掉,避免群内消息太多导致Bot刷屏。
- 如果需要排除误触发,可以给正则加上下文关键词,比如必须带“游戏”“打了”“得分”这类和报分相关的词才触发,进一步降低误判率。
内容的提问来源于stack exchange,提问作者Michael May
相关产品推荐
相关产品推荐

