Telegram YouTube下载机器人代码报错:Dispatcher初始化参数错误
问题解决:Dispatcher初始化参数错误
原因
你遇到的错误是因为aiogram版本不兼容:你的代码是基于aiogram v2的写法,但当前环境安装的是aiogram v3,v3对Dispatcher的初始化逻辑做了重大调整,不再需要传入Bot实例作为参数。
两种解决方案
方案1:适配aiogram v3(推荐)
修改代码以符合v3的API规范,具体改动如下:
from aiogram import Bot, Dispatcher, types from aiogram.filters import CommandStart # 导入新的命令过滤器 from pytube import YouTube import aiofiles import asyncio # 新增asyncio依赖 TOKEN = '...' # 初始化Bot和Dispatcher(v3中Dispatcher无需传入Bot) bot = Bot(token=TOKEN) dp = Dispatcher() # 命令处理器改用新的装饰器和过滤器 @dp.message(CommandStart()) async def start(message: types.Message): await message.reply("Привет! Отправь мне ссылку на видео с YouTube, и я скачаю его для тебя.") @dp.message() async def download(message: types.Message): url = message.text video = YouTube(url) stream = video.streams.get_highest_resolution() filename = stream.default_filename await message.reply("Скачиваю видео...") stream.download(filename=filename) await message.reply("Отправляю видео...") async with aiofiles.open(filename, 'rb') as video_file: await bot.send_video(message.chat.id, video_file) if __name__ == '__main__': # v3使用asyncio.run启动轮询,需传入Bot实例 asyncio.run(dp.start_polling(bot, skip_updates=True))
关键改动点:
- 移除Dispatcher初始化时的Bot参数:
dp = Dispatcher() - 命令处理改用
@dp.message(CommandStart())替代旧的@dp.message_handler(commands=['start']) - 启动逻辑替换为
asyncio.run(dp.start_polling(bot, skip_updates=True)),不再使用executor模块
方案2:降级到aiogram v2
如果你想继续使用原有代码,只需将aiogram降级到v2版本:
pip install aiogram==2.25.2
额外提示
- 发送视频后可以添加文件删除逻辑,避免本地存储过多视频:在
send_video后加入import os; os.remove(filename) - pytube可能会遇到YouTube反爬限制,若出现解析失败,可尝试更新pytube:
pip install --upgrade pytube
内容的提问来源于stack exchange,提问作者Qaserd
相关产品推荐
相关产品推荐

