如何修复aiogram机器人重复发送同一张照片的问题
解决aiogram机器人重复发送照片问题
你的代码核心问题是在消息处理器内部嵌套注册另一个消息处理器:每次用户发送“Загрузить фото”触发func5时,都会向Dispatcher注册一个新的photo_handler。后续用户发送照片时,所有已注册的photo_handler都会执行,导致同一张照片被重复发送多次。
解决方案:使用FSM状态机跟踪对话流程
采用aiogram的有限状态机(FSM)来管理用户的对话状态,这是处理这类分步引导场景的标准方案,能彻底避免重复注册处理器的问题。
修正后的完整代码
from aiogram import Bot, Dispatcher, types from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import State, StatesGroup from aiogram.utils import executor # 定义对话状态类 class PhotoUpload(StatesGroup): waiting_for_photo = State() # 初始化Bot和Dispatcher(替换为你的机器人Token) API_TOKEN = '你的机器人Token' storage = MemoryStorage() bot = Bot(token=API_TOKEN) dp = Dispatcher(bot, storage=storage) @dp.message_handler(text="Загрузить фото") async def func5(message: types.Message): if message.chat.type == "private" and message.from_user.language_code == 'ru': await message.answer('Отправьте мне фото и, после проверки, оно будет загружено в PofTW') # 将用户状态切换为「等待上传照片」 await PhotoUpload.waiting_for_photo.set() # 仅响应处于「等待上传照片」状态的用户发送的照片 @dp.message_handler(content_types=['photo'], state=PhotoUpload.waiting_for_photo) async def photo_handler(message: types.Message, state: FSMContext): photo_id = message.photo[-1].file_id # 兼容无username的用户 answer_user_name = message.chat.username or '匿名用户' photo_caption = f'Автор фото - {answer_user_name}' # 替换为你的目标群组ID await bot.send_photo(chat_id='目标群组ID', photo=photo_id, caption=photo_caption, protect_content=True) # 重置状态,避免后续照片被误触发 await state.finish() await message.answer('Фото успешно отправлено!') if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
关键说明
- 状态标记:用
PhotoUpload.waiting_for_photo标记用户是否处于等待上传照片的状态,photo_handler只会处理处于该状态的用户消息,不会响应无关的照片发送。 - 状态重置:处理完照片后调用
await state.finish()清除用户状态,确保下次交互不会残留旧状态。 - 全局注册:所有处理器都是全局注册,不会重复添加,从根源解决了重复执行的问题。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

