я уже отчаянно не могу исправить эту ошибку
Я делаю код для своего бота в телеграмме на питоне, есть 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 шт):
В вашем коде несколько принципиальных ошибок. Это не позволяет дать однозначный ответ. Не ясно, что важнее в этом случае рыба или удочка. Вот вам рыба:
Вы используете какой-то устаревший пример для библиотеки 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,
)