如何在aiogram中结合FSM处理video_note?求助问题排查与实现
问题排查与解决方案
代码中的核心问题
- 语法错误:第二个
async with state.proxy()块直接定义在set_circle函数外部,既不在异步函数作用域内,也无法访问message和state变量,会直接导致运行时报错。 - 缺失核心逻辑:代码仅实现了保存
file_id的部分,缺少将保存的video_note发送给其他用户的关键逻辑。 - 状态流转不清晰:若无需进入下一个状态,直接调用
next()可能导致状态异常,需根据需求选择结束或流转状态。
修复后的完整实现方案
1. 正确定义FSM状态类
from aiogram.dispatcher.filters.state import State, StatesGroup class FSMUserRegistration(StatesGroup): user_circle = State() # 用于接收video_note的状态
2. 修复并完善消息处理函数
from aiogram import types from aiogram.dispatcher import FSMContext async def set_circle(message: types.Message, state: FSMContext): # 保存video_note的file_id到FSM存储 async with state.proxy() as data: data['user_circle'] = message.video_note.file_id await message.answer(f"已保存视频消息的file_id:{data['user_circle']}") # 将保存的video_note发送给目标用户(替换为实际目标用户ID) target_user_id = 123456789 try: await message.bot.send_video_note( chat_id=target_user_id, video_note=data['user_circle'] ) await message.answer("视频消息已成功发送给目标用户!") except Exception as e: await message.answer(f"发送失败:{str(e)}") # 根据需求选择状态操作:结束状态或流转到下一个状态 await state.finish() # 若无需后续状态,直接结束 # await FSMUserRegistration.next() # 若有后续状态,使用此语句
3. 正确注册消息处理器
确保Dispatcher已配置FSM存储(以内存存储为例):
from aiogram import Dispatcher from aiogram.contrib.fsm_storage.memory import MemoryStorage # 初始化Dispatcher并绑定FSM存储 storage = MemoryStorage() dp = Dispatcher(bot, storage=storage) def register_handlers_user(dp: Dispatcher): dp.register_message_handler( set_circle, content_types=[types.ContentType.VIDEO_NOTE], state=FSMUserRegistration.user_circle )
针对aiogram v3的适配调整
若使用aiogram v3,语法有部分变化,调整后的代码如下:
from aiogram import Router from aiogram.filters import StateFilter from aiogram.fsm.context import FSMContext from aiogram.types import Message, ContentType router = Router() @router.message( StateFilter(FSMUserRegistration.user_circle), content_types=ContentType.VIDEO_NOTE ) async def set_circle(message: Message, state: FSMContext): # 保存file_id到FSM await state.update_data(user_circle=message.video_note.file_id) data = await state.get_data() await message.answer(f"已保存file_id:{data['user_circle']}") # 发送给目标用户 target_user_id = 123456789 try: await message.bot.send_video_note( chat_id=target_user_id, video_note=data['user_circle'] ) await message.answer("发送成功!") except Exception as e: await message.answer(f"发送失败:{str(e)}") await state.clear()
关键注意事项
- 确保机器人已获得目标用户的对话权限(目标用户需先主动与机器人发起对话)。
- 若使用持久化存储(如Redis),需替换
MemoryStorage为对应存储类。 - 测试时可先打印
data内容,确认file_id是否正确保存。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

