Почему происходит ошибка "Cannot access member for type "Dispatcher". Member is unknown"?

Рейтинг: 0Ответов: 1Опубликовано: 16.04.2023

Ошибка:

Cannot access member "register_next_step_handler" for type "Dispatcher" Member "register_next_step_handler" is unknown

Код:

# Импортируем необходимые модули
import asyncio
import aiogram
from aiogram import Bot, Dispatcher, types
import sqlite3 # Импортируем модуль для работы с SQLite

# Создаем экземпляр бота с токеном
bot = Bot("TELEGRAM_BOT_TOKEN")
# Создаем диспетчер для обработки событий
dp = Dispatcher(bot)

# Создаем подключение к базе данных employee.db в текущей директории
con = sqlite3.connect("employee.db")
# Создаем курсор для выполнения SQL-запросов
cur = con.cursor()
# Создаем таблицу employee с колонками name, position и salary
cur.execute("CREATE TABLE IF NOT EXISTS employee (name, position, salary)")

# Обработчик команды /start
@dp.message_handler(commands=["start"])
async def start(message: types.Message):
    # Создаем инлайн клавиатуру с тремя кнопками в одном ряду
    keyboard = types.InlineKeyboardMarkup(row_width=3)
    # Добавляем кнопку с текстом "Добавить сотрудника" и данными "add_employee"
    keyboard.add(types.InlineKeyboardButton("Добавить сотрудника", callback_data="add_employee"))
    # Добавляем кнопку с текстом "Пока" и данными "bye"
    keyboard.add(types.InlineKeyboardButton("Пока", callback_data="bye"))
    # Добавляем кнопку с текстом "Сайт" и ссылкой на сайт
    keyboard.add(types.InlineKeyboardButton("Сайт", url="https://aiogram.dev/"))
    # Отправляем сообщение с приветствием и клавиатурой
    await message.answer("Привет! Я бот, который может показать тебе инлайн кнопки.", reply_markup=keyboard)

# Обработчик нажатий на инлайн кнопки
@dp.callback_query_handler()
async def callback(call: types.CallbackQuery):
    # Получаем данные из кнопки
    data = call.data
    # Если данные равны "add_employee"
    if data == "add_employee":
        # Запрашиваем данные нового сотрудника в формате "Имя, Должность, Зарплата"
        await bot.send_message(call.message.chat.id,
                               "Введите данные нового сотрудника в формате:\nИмя, Должность, Зарплата")
        # Ждем ответ от пользователя и регистрируем следующий шаг обработки
        await dp.register_next_step_handler(call.message, process_add_employee)
    # Если данные равны "bye"
    elif data == "bye":
        # Отправляем сообщение с прощанием
        await bot.send_message(call.message.chat.id, "Пока! Надеюсь, мы еще увидимся!")
    # Удаляем инлайн клавиатуру из сообщения
    await bot.edit_message_reply_markup(call.message.chat.id, call.message.message_id)

# Функция для обработки данных нового сотрудника
async def process_add_employee(message: types.Message):
    # Парсим данные из сообщения по запятой
    name, position, salary = message.text.split(",")
    # Добавляем данные в таблицу employee с помощью SQL-команды INSERT
    cur.execute("INSERT INTO employee VALUES (?, ?, ?)", (name, position, salary))
    # Сохраняем изменения в базе данных с помощью метода commit()
    con.commit()
    # Отправляем сообщение с подтверждением добавления сотрудника
    await bot.send_message(message.chat.id, f"Сотрудник {name} успешно добавлен в базу данных.")



# Запускаем бота в асинхронном режиме
async def main():
    await dp.start_polling()

if __name__ == "__main__":
     asyncio.run(main())

Ответы

▲ 0Принят

В aiogram нет метода Dispatcher.register_next_step_handler, вы можете использовать Finite State Machine, пример использвания можно найти в официальной документации