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

如何在telebot中为不同文本消息创建不同处理函数?

问题与解决方案

问题

使用python-telebot开发机器人时,希望针对问候、数据请求等不同文本场景创建独立的处理函数,但当前只有第一个message_handler会被触发,后续的处理函数完全不执行。需求是仅通过message_handler实现文本触发,不使用命令(如/start),也不使用register_next_step_handler。

原代码示例:

@bot.message_handler(content_types=['text'])
def greetings(message):
    if message.text.lower()=='hello':
        bot.send_message(message.chat.id, f"Hello {message.from_user.first_name}")
    elif message.text.lower()=="bye":
        bot.send_message(message.chat.id, f"Good Bye {message.from_user.first_name}")
    else:
        pass

@bot.message_handler(content_types=['text'])
def requests(message):
    if message.text.lower()=='data':
        bot.send_message(message.chat.id, f"{message.from_user.first_name} which data do you want?")
    elif message.text.lower()=="forecast":
        bot.send_message(message.chat.id, f"{message.from_user.first_name} we have only historic data")

原因

python-telebot的message_handler按注册顺序匹配,当多个handler的匹配条件重叠时(比如两个都指定content_types=['text']),第一个匹配成功的handler会执行,后续handler不再被触发。原代码中第一个greetings函数会匹配所有文本消息,哪怕内容不是hello/bye,else: pass也会让这个handler“消耗”掉消息,导致后续requests函数永远得不到执行机会。

解决方案

给每个message_handler添加精准的匹配条件,让每个handler只处理符合自身场景的文本消息,避免条件重叠。可以通过func参数实现,该参数接受lambda函数,返回True则触发对应handler。

修改后的代码

# 仅处理hello/bye的问候消息
@bot.message_handler(func=lambda msg: msg.text.lower() in ['hello', 'bye'])
def greetings(message):
    if message.text.lower() == 'hello':
        bot.send_message(message.chat.id, f"Hello {message.from_user.first_name}")
    elif message.text.lower() == "bye":
        bot.send_message(message.chat.id, f"Good Bye {message.from_user.first_name}")

# 仅处理data/forecast的数据请求消息
@bot.message_handler(func=lambda msg: msg.text.lower() in ['data', 'forecast'])
def requests(message):
    if message.text.lower() == 'data':
        bot.send_message(message.chat.id, f"{message.from_user.first_name} which data do you want?")
    elif message.text.lower() == "forecast":
        bot.send_message(message.chat.id, f"{message.from_user.first_name} we have only historic data")

额外说明

如果需要匹配更复杂的文本(比如包含特定关键词的句子),可以在lambda中写更复杂的判断逻辑,或者使用regex参数:

# 匹配包含"weather"的文本消息
@bot.message_handler(regex=r'weather', case_sensitive=False)
def handle_weather(message):
    bot.send_message(message.chat.id, "Weather query received!")

这样每个handler只会响应符合自身条件的消息,不会互相干扰,完全通过message_handler实现了不同文本场景的独立处理。

内容的提问来源于stack exchange,提问作者Zaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:48:44