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

如何在aiogram中结合FSM处理video_note?求助问题排查与实现

问题排查与解决方案

代码中的核心问题

  1. 语法错误:第二个async with state.proxy()块直接定义在set_circle函数外部,既不在异步函数作用域内,也无法访问message和state变量,会直接导致运行时报错。
  2. 缺失核心逻辑:代码仅实现了保存file_id的部分,缺少将保存的video_note发送给其他用户的关键逻辑。
  3. 状态流转不清晰:若无需进入下一个状态,直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:01:55