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

Python TeleBot重复发送消息问题排查与修复咨询

Telegram机器人重复发送消息问题排查与修复

问题描述

开发的Telegram机器人用于转发用户消息给所有者,首次测试功能正常,修改代码后出现故障:用户发送消息后,用户和所有者都会收到两条消息,而非预期的一条。

原代码

import telebot
BOT_TOKEN= 'token'
bot = telebot.TeleBot(BOT_TOKEN)
@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, 'Тест бота.')
@bot.message_handler()
def reply(message):
    bot.reply_to(message, message.text)
    bot.send_message(owner_id, message.text)

bot.infinity_polling()

预期与实际流程

预期流程

User --> Message --> Bot;
Bot --> Message --> User(测试用),Owner;

实际流程

User --> Message --> Bot;
Bot --> Message --> User(测试用),Owner; (重复发送,用户和所有者各收到两条消息)

原因分析

  • 消息处理器无过滤,捕获机器人自身消息:@bot.message_handler()未设置任何过滤条件,会处理所有类型的消息,包括机器人自己发送的reply_to消息。当机器人第一次回复用户后,这条回复消息会被该处理器再次捕获,触发第二次回复和转发,导致重复发送。
  • 处理器匹配逻辑问题:telebot的消息处理器默认是不排他的,只要消息满足处理器的条件就会被触发。无过滤的处理器会匹配除/start命令外的所有消息,包括机器人自身输出的消息。

修复方法

方案1:过滤机器人自身发送的消息

在消息处理器中添加判断,仅处理来自非机器人账号的消息:

import telebot
BOT_TOKEN= 'token'
bot = telebot.TeleBot(BOT_TOKEN)
# 提前获取机器人自身ID
BOT_ID = bot.get_me().id

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, 'Тест бота.')

@bot.message_handler()
def reply(message):
    # 跳过机器人自己发送的消息
    if message.from_user.id == BOT_ID:
        return
    bot.reply_to(message, message.text)
    bot.send_message(owner_id, message.text)

bot.infinity_polling()

方案2:限制消息处理器的匹配范围

给消息处理器添加content_types参数,仅处理用户发送的文本消息,同时配合机器人ID过滤:

import telebot
BOT_TOKEN= 'token'
bot = telebot.TeleBot(BOT_TOKEN)
BOT_ID = bot.get_me().id

@bot.message_handler(commands=['start'])
def start(message):
    bot.send_message(message.chat.id, 'Тест бота.')

# 仅处理文本类型消息,且排除机器人自身消息
@bot.message_handler(content_types=['text'])
def reply(message):
    if message.from_user.id == BOT_ID:
        return
    bot.reply_to(message, message.text)
    bot.send_message(owner_id, message.text)

bot.infinity_polling()

额外注意事项

  • 确保owner_id已正确定义为所有者的Telegram聊天ID(数字类型)。
  • 若需要处理其他类型消息(如图片、文件),可扩展content_types的取值,如['text', 'photo', 'document']。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:05:24