Как вставить команду в инлайн кнопку

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

Есть ли способ сделать так, чтобы при нажатии на инлайн кнопку выполнялась команда (например /cancel)? Что должно быть в callback_data? Если это невозможно, то как нажатием кнопки вызвать функцию в хендлере, который ловит команду /cancel?

buttons_adm_4 = [
  [
    InlineKeyboardButton(text='Добавить', callback_data='btn4_1'),
    InlineKeyboardButton(text='Удалить', callback_data='btn4_2'),
    InlineKeyboardButton(text='Посмотреть', callback_data='btn4_3')
  ],
  [InlineKeyboardButton(text='Назад', callback_data='cancel')]
]

keyboard_adm_4 = InlineKeyboardMarkup(inline_keyboard=buttons_adm_4)

Ответы

▲ 0

Ваши кнопки:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

buttons = InlineKeyboardMarkup(
    inline_keyboard=[
        [
            InlineKeyboardButton(text='Назад', callback_data=command.new(function='cancel')),
        ]
    ]
)

Обработчик:

@dp.callback_query_handler(command.filter(function='cancel'))
async def cancel(query: types.CallbackQuery, callback_data: dict):
    pass
▲ 0

Задекорируйте кнопку cancel и вызовите ту же самую функцию что и при команде /cancel

async def cancel(message: types.CallbackQuery | types.Message):

    answer = """text"""
    markup = keyboard

    if isinstance(message, types.Message):
        await message.answer(answer, reply_markup=markup)

    elif isinstance(message, types.CallbackQuery):
        await message.answer(answer, reply_markup=markup)


@dp.callback_query_handler(text='cancel')
async def inline_cancel(call: types.CallbackQuery):
    await cancel(call)



@dp.message_handler(command='cancel')
async def message_cancel(message: types.Message):
    await cancel(message)

Посмотрите мой код (он никак не связан с Вашим но тут вы найдете ответ)

from aiogram import types, Router
from aiogram.filters import Command, Text
from tgbot.all_txt import start_message
from tgbot.database.db_requests import DbRequests
from tgbot.keyboards.user import menu_keyboard, advert_keyboard, text_buttons

import logging

start_router = Router()

for i in [
    Command('start'),
    Text(text_buttons[0])
]:
    @start_router.message(i)
    async def show_menu(message: types.Message, db_requests: DbRequests):
        await start(message, db_requests)


async def start(message: types.Message | types.CallbackQuery,
                db_requests: DbRequests):
    user = await db_requests.get_user(user_id=message.from_user.id)
    config_db = await db_requests.get_config()
    buttons = await db_requests.get_advert_buttons()

    if not user:
        user = await db_requests.add_user(
            user_id=message.from_user.id,
            full_name=message.from_user.full_name,
            username=message.from_user.username,
        )
        logging.info(f'Added user {message.from_user.full_name}')

    if user.full_name != message.from_user.full_name \
            or user.username != message.from_user.username:
        user = await db_requests.update_user(
            user_id=message.from_user.id,
            update_fields={
                "full_name": message.from_user.full_name,
                "username": message.from_user.username,
            }
        )

    markup = menu_keyboard(user)

    if isinstance(message, types.Message):
        await message.answer('💎', reply_markup=advert_keyboard(buttons))
        await message.answer_photo(config_db.image_url,
                                   '\n'.join(start_message(user, message)),
                                   reply_markup=markup
                                   )

    elif isinstance(message, types.CallbackQuery):
        call = message
        await call.message.edit_reply_markup(markup)

    else:
        pass