Вопрос Aiogram помогите с ответом на callback

Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
244
Реакции[?]
23
Поинты[?]
18K
пишу бота для чата своего и пытаюсь в калбеки, чатгпт выдал

Python:
@dp.callback_query_handler(lambda query: query.data == 'alert_me')
async def process_callback(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id, "You pressed the button!", show_alert=True)
но это не работает, помогите пожалуйста
нужно чтобы при нажатии кнопки появлялся алерт с сообщением
 
Последнее редактирование:
Главный модератор
Главный Модератор
Статус
Оффлайн
Регистрация
13 Фев 2018
Сообщения
1,099
Реакции[?]
806
Поинты[?]
151K
Не совсем ясно, что ты вкладываешь в понятие "это не работает", ведь с технической точки зрения код рабочий.
1709224420798.png
Без полного кода и лога ошибок(Если таковой имеется) - увы, ничем помочь не сможем.
Лично моё предположение - не верно настроенная клавиатура, которая и создает клавишу с нужным коллбеком.

По своему опыту скажу, что нет особого смысла выносить каждый коллбек кнопки под отдельный декоратор, ибо это просто не удобно и не красиво в поддержке (особенно когда речь про большие проекты с большим кол-вом кнопок и стэйтов)
Вместо этого можно вынести всё под единый декоратор и проверять текущий коллбек через условные операторы if/elif:
Python:
@dp.callback_query_handler()
async def process_callback(callback_query: types.CallbackQuery):
    if callback_query.data == '...':
        ...
    elif callback_query.data == '...':
        ...
    elif callback_query.data == '...':
        ...
    elif callback_query.data == '...':
        ...
Тут сугубо дело вкуса, ведь с точки зрения производительности, когда речь заходит про I/O нагрузку, то время, затраченное CPU на проверку всех существующих условий - будет меньшим, нежели обработка запроса серверами Телеги и отдачи нужного апдейта тебе.
 
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
244
Реакции[?]
23
Поинты[?]
18K
Не совсем ясно, что ты вкладываешь в понятие "это не работает", ведь с технической точки зрения код рабочий.
под не работает имею в виду что
Python:
test = InlineKeyboardBuilder()
testo = InlineKeyboardButton(
    text="Предыдущее",
    callback_data="alert")    
test.add(testo)

@dp.message(Command("test"))
async def command_start_handler(message: Message) -> None:
    await message.answer(
        text = "ФП АМ",
        reply_markup=test.as_markup())

@dp.callback_query()
async def process_callback(callback_query: types.CallbackQuery):
    if callback_query.data == 'alert':
        Bot.answer_callback_query(callback_query.id, "You pressed the button!", show_alert=True)
при попытке ответа на каллбек получаю
Код:
Cause exception while process update id=320157859 by bot id=6919127286
TypeError: 'str' object is not callable
Traceback (most recent call last):
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 309, in _process_update
    response = await self.feed_update(bot, update, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 158, in feed_update   
    response = await self.update.wrap_outer_middleware(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\middlewares\error.py", line 25, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\middlewares\user_context.py", line 27, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\fsm\middleware.py", line 41, in __call__
    return await handler(event, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\event\telegram.py", line 121, in trigger
    return await wrapped_inner(event, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\event\handler.py", line 43, in call
    return await wrapped()
           ^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 276, in _listen_update
    return await self.propagate_event(update_type=update_type, event=event, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\router.py", line 128, in propagate_event
    return await observer.wrap_outer_middleware(_wrapped, event=event, data=kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\router.py", line 123, in _wrapped
    return await self._propagate_event(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\router.py", line 148, in _propagate_event
    response = await observer.trigger(event, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\event\telegram.py", line 121, in trigger
    return await wrapped_inner(event, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\dispatcher\event\handler.py", line 43, in call
    return await wrapped()
           ^^^^^^^^^^^^^^^
  File "d:\py_proj\dark triksters\main.py", line 111, in process_callback
    await Bot.answer_callback_query(callback_query.id, "You pressed the button!", show_alert=True)
  File "C:\Users\tcc\AppData\Local\Programs\Python\Python312\Lib\site-packages\aiogram\client\bot.py", line 571, in answer_callback_query
    return await self(call, request_timeout=request_timeout)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'str' object is not callable
 
Главный модератор
Главный Модератор
Статус
Оффлайн
Регистрация
13 Фев 2018
Сообщения
1,099
Реакции[?]
806
Поинты[?]
151K
при попытке ответа на каллбек получаю
Очень важное замечение: указывай, какую версию Aiogram ты используешь. По Билдеру клавиатуры видно, что это 3.x версия, которую ты зачем-то пытаешься подружить с методами и хендлерами 2.х версии(Судя по "callback_query_handler" в изначальном сабже темы)
Если ты уж и хочешь писать код с помощью чатгпт(хотя я бы не советовал) - пиши уже тогда на 2.x версии aiogram, т.к. гпт будет писать хотя-бы что-то приближенное к реальности.

Вот полный код того, что ты хочешь реализовать (3.х версия):
Python:
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram import Bot, Dispatcher, types, filters
import asyncio
import logging

API_TOKEN = 'Сюда_Токен'

logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher()

@dp.message(filters.command.Command('test'))
async def command_start_handler(message: types.Message) -> None:
    keyboard = InlineKeyboardBuilder()
    keyboard.add(types.InlineKeyboardButton(text="Предыдущее", callback_data="alert"))
    await message.answer(f"ФП АМ", reply_markup=keyboard.as_markup())

@dp.callback_query()
async def process_callback(callback_query: types.CallbackQuery):
    if callback_query.data == 'alert':
        await bot.answer_callback_query(callback_query.id, "You pressed the button!", show_alert=True)

async def main():
    await dp.start_polling(bot)

asyncio.run(main())
 
Начинающий
Статус
Оффлайн
Регистрация
9 Дек 2021
Сообщения
244
Реакции[?]
23
Поинты[?]
18K
Очень важное замечение: указывай, какую версию Aiogram ты используешь. По Билдеру клавиатуры видно, что это 3.x версия, которую ты зачем-то пытаешься подружить с методами и хендлерами 2.х версии(Судя по "callback_query_handler" в изначальном сабже темы)
Если ты уж и хочешь писать код с помощью чатгпт(хотя я бы не советовал) - пиши уже тогда на 2.x версии aiogram, т.к. гпт будет писать хотя-бы что-то приближенное к реальности.

Вот полный код того, что ты хочешь реализовать (3.х версия):
Python:
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram import Bot, Dispatcher, types, filters
import asyncio
import logging

API_TOKEN = 'Сюда_Токен'

logging.basicConfig(level=logging.INFO)
bot = Bot(token=API_TOKEN)
dp = Dispatcher()

@dp.message(filters.command.Command('test'))
async def command_start_handler(message: types.Message) -> None:
    keyboard = InlineKeyboardBuilder()
    keyboard.add(types.InlineKeyboardButton(text="Предыдущее", callback_data="alert"))
    await message.answer(f"ФП АМ", reply_markup=keyboard.as_markup())

@dp.callback_query()
async def process_callback(callback_query: types.CallbackQuery):
    if callback_query.data == 'alert':
        await bot.answer_callback_query(callback_query.id, "You pressed the button!", show_alert=True)

async def main():
    await dp.start_polling(bot)

asyncio.run(main())
спасибо без вас не справился бы наверное
 
Сверху Снизу