Как вставить команду в инлайн кнопку
Есть ли способ сделать так, чтобы при нажатии на инлайн кнопку выполнялась команда (например /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)
Ответы (3 шт):
Автор решения: Timofey
→ Ссылка
Ваши кнопки:
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
Автор решения: Trafalgar
→ Ссылка
Задекорируйте кнопку 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
Автор решения: Alright
→ Ссылка
Судя по всему, самый простой способ использовать ту же функцию:
(Aiogram 3)
@router.message(Command('cancel'))
async def cancel_command(message: Message):
await message.answer('cancel', reply_markup=kb(cancel_btn))
@router.callback_query(F.data == 'cancel')
async def cancel_callback(callback: CallbackQuery):
await cancel_command(callback.message)
Ну и соответствующие хендлеры для Aiogram 2.