Python Aiogram开发Telegram Bot遇Dispatcher初始化参数错误
Aiogram中Dispatcher初始化错误的解决方法
问题原因
你遇到的TypeError: Dispatcher.__init__() takes 1 positional argument but 2 were given错误,是因为代码采用了Aiogram 2.x版本的写法,但当前安装的是Aiogram 3.x版本。两个版本在Dispatcher的初始化逻辑上存在差异:
- Aiogram 2.x中,
Dispatcher初始化必须传入Bot实例 - Aiogram 3.x中,
Dispatcher初始化不需要直接传入Bot实例,而是在启动阶段关联
解决方法
方法1:适配Aiogram 3.x版本修改代码
修改两处关键代码即可:
- 初始化
Dispatcher时不再传入bot参数 - 启动轮询时显式传入
bot参数
修改后的完整代码:
import logging from aiogram import Bot, Dispatcher, types from aiogram.types import ReplyKeyboardMarkup, KeyboardButton # Установка токена бота (замените 'YOUR_BOT_TOKEN' на ваш токен) TOKEN = 'TOKEN' # Включаем логгирование logging.basicConfig(level=logging.INFO) # Инициализируем бота и диспетчера bot = Bot(token=TOKEN) dp = Dispatcher() # 移除传入的bot参数 # Создаем клавиатуру menu_markup = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) menu_markup.add(KeyboardButton('Кнопка 1'), KeyboardButton('Кнопка 2')) menu_markup.add(KeyboardButton('Кнопка 3'), KeyboardButton('Кнопка 4')) menu_markup.add(KeyboardButton('Кнопка 5'), KeyboardButton('Кнопка 6')) # Обработчик команды /start @dp.message_handler(commands=['start']) async def start(message: types.Message): await message.answer("Привет! Выберите опцию:", reply_markup=menu_markup) # Обработчик нажатия на кнопку @dp.message_handler(lambda message: message.text in ['Кнопка 1', 'Кнопка 2', 'Кнопка 3', 'Кнопка 4', 'Кнопка 5', 'Кнопка 6']) async def handle_button_click(message: types.Message): # Получаем текст для отправки text_to_send = "Текст, который ты хочешь отправить" # Создаем клавиатуру для "Проверить оплату" check_payment_markup = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True) check_payment_markup.add(KeyboardButton('Проверить Оплату')) # Отправляем текст и клавиатуру await message.answer(text_to_send, reply_markup=check_payment_markup) # Обработчик нажатия на кнопку "Проверить Оплату" @dp.message_handler(lambda message: message.text == 'Проверить Оплату') async def check_payment(message: types.Message): # Отправляем сообщение о том, что оплата не обнаружена await message.answer("Оплата не обнаружена") if __name__ == '__main__': from aiogram import executor # Запускаем бота,新增bot参数 executor.start_polling(dp, bot=bot, skip_updates=True)
方法2:降级到Aiogram 2.x版本
如果想保留原有代码结构,无需修改代码,只需卸载当前版本并安装2.x稳定版:
pip uninstall aiogram pip install aiogram==2.25.1
内容的提问来源于stack exchange,提问作者Nick Vek
相关产品推荐
相关产品推荐

