я уже отчаянно не могу исправить эту ошибку

Я делаю код для своего бота в телеграмме на питоне, есть 3 типа пользователей админ вип и обычный, для админа и випа должны быть видны три кнопки а для обычного две, при нажатии на любую из кнопок должен отправляться callback.

from telegram import Update
from telegram.ext import Updater, CommandHandler, CallbackContext

# Обработчик команды /start
def start(update: Update, context: CallbackContext) -> None:
    user = update.effective_user
    update.message.reply_text(f"Привет, {user.first_name}! Я бот. Как я могу помочь?")

# Функция для создания клавиатуры с кнопками для админов и VIP-пользователей
def admin_and_vip_buttons(update: Update, context: CallbackContext) -> None:
    keyboard = [
        ["Кнопка 1"],
        ["Кнопка 2"]
    ]
    reply_markup = {"keyboard": keyboard, "one_time_keyboard": True}
    update.message.reply_text("Выберите действие:", reply_markup=reply_markup)

# Функция для создания кнопки для обычных пользователей
def regular_user_button(update: Update, context: CallbackContext) -> None:
    keyboard = [
        ["Кнопка для админа и VIP"]
    ]
    reply_markup = {"keyboard": keyboard, "one_time_keyboard": True}
    update.message.reply_text("Выберите действие:", reply_markup=reply_markup)

def main() -> None:
    updater = Updater("BOT_TOKEN", use_context=True)  # Добавляем аргумент use_context=True
    dispatcher = updater.dispatcher

    # Добавляем обработчики команд
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(CommandHandler("admin_vip_buttons", admin_and_vip_buttons))
    dispatcher.add_handler(CommandHandler("regular_user_button", regular_user_button))

    # Запускаем бота
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()

Появляется такая ошибка

C:\Users\Valery\PycharmProjects\pythonProject\.venv\Scripts\python.exe C:\Users\Valery\PycharmProjects\pythonProject\main.py 
Traceback (most recent call last):
  File "C:\Users\Valery\PycharmProjects\pythonProject\main.py", line 36, in <module>
    main()
  File "C:\Users\Valery\PycharmProjects\pythonProject\main.py", line 25, in main
    updater = Updater("7241928145:AAGN0hxy9dXY5BJVDnxwa7310kkWD7R_zdY")
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: Updater.__init__() missing 1 required positional argument: 'update_queue'

Process finished with exit code 1

Заранее спасибо


Ответы (1 шт):

Автор решения: Dmitry Ivanov

В вашем коде несколько принципиальных ошибок. Это не позволяет дать однозначный ответ. Не ясно, что важнее в этом случае рыба или удочка. Вот вам рыба:

Вы используете какой-то устаревший пример для библиотеки python-telegram-bot посмотрите текущий принцип построения стека приложения на ресурсе проекта echobot.py Диспетчер больше как таковой не нужен, используется общепринятый подход сборки приложения через фасадный метод сборщика инкапсулирующий операции инициализации:

application = Application.builder().token("TOKEN").build()

Регистрация ловушек событий осуществляется через полученный экземпляр:

application.add_handler(CommandHandler("start", start))

Не нужно использовать функции создания клавиатур в качестве обработчиков событий, функции обработчиков должны реализовывать фактическую логику вашего бота, они должны определять поведение бота, его реакцию на действия пользователя. Клавиатуру нужно добавить в обработчике команды start, это наиболее логичное расположение. Вы должны получить идентификатор пользователя используя:

id_user = update.effective_user.id

затем использую некое хранилище данных пользователей, определить какая роль назначена данному пользователю отобразить для него ту или иную клавиатуру.

Бот должен быть классом. Функции обработчиков событий должны быть асинхронными:

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    """Send a message when the command /start is issued."""
    user = update.effective_user
    await update.message.reply_html(
        rf"Hi {user.mention_html()}!",
        reply_markup=ForceReply(selective=True),
    )

Несмотря на то что в примере функция создания клавиатуры в конечном итоге ее добавляет я немного поэксперементировав пришел к выводу что это не удобно в большинстве случаев и ограничил ее возможности до формирования только самой клавиатуры, а добавлю ее в методах в контексте обработчика, такой подход дает большую гибкость:

    # Кнопки главного меню администраторов
def MainAdminMenuKeyButton():

    keyboard = [
        [KeyboardButton("? Поиск запчасти"), KeyboardButton("? Выбор модели")],
        [KeyboardButton("? Корзина"), KeyboardButton("? Сброс поиска")],
        [KeyboardButton("? Синхронизировать"), KeyboardButton("? Логи запросов")],
        [KeyboardButton("? Список пользователей")],
    ]

    # Создаем объект ReplyKeyboardMarkup с кнопками
    return ReplyKeyboardMarkup(
        keyboard,
        resize_keyboard=True,
        one_time_keyboard=False,
        input_field_placeholder="Выберите действие",
        is_persistent=True,
    )
→ Ссылка