You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 12:27:26