кастомные CommandObject

как реализовать подсветку подсказок в telegram при написании команд, так же, как в discord?

@router.handler(Command('task'))
async def task(msg: Message, command: CommandObject):
    print(command.args.split())

Надо сделать так, что бы command принимало 2 именованных аргумента. Например: url, num. в телеграмм при написании команды должно быть такое /task (высвечивается подсказка url num)

введите сюда описание изображения

только нужно, что бы было тоже самое при своей команде


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

Автор решения: Matvj

Мы реализуем меню с помощью inline кнопок. Для начала надо создать клавиатуру главного меню. Все клавиатуры будут храниться в файле kb.py, поэтому открываем его и пишем в него такой код:

from aiogram.types import 
InlineKeyboardButton, InlineKeyboardMarkup, KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove
menu = [
[InlineKeyboardButton(text="? Генерировать текст", callback_data="generate_text"),
InlineKeyboardButton(text="? Генерировать изображение", callback_data="generate_image")],
[InlineKeyboardButton(text="? Купить токены", callback_data="buy_tokens"),
InlineKeyboardButton(text="? Баланс", callback_data="balance")],
[InlineKeyboardButton(text="? Партнёрская программа", callback_data="ref"),
InlineKeyboardButton(text="? Бесплатные токены", callback_data="free_tokens")],
[InlineKeyboardButton(text="? Помощь", callback_data="help")]
]
menu = InlineKeyboardMarkup(inline_keyboard=menu)
exit_kb = ReplyKeyboardMarkup(keyboard=[[KeyboardButton(text="◀️ Выйти в меню")]], resize_keyboard=True)
iexit_kb = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="◀️ Выйти в меню", callback_data="menu")]])

Здесь мы создаём основную клавиатуру menu, сразу же добавляя все кнопки в два столбца. Есть несколько способов создания клавиатур в aiogram 3:

  1. Передать двумерный список кнопок как аргумент при создании клавиатуры. Данный способ используется в нашем проекте для создания меню. Удобен когда клавиатура статичная и все данные для неё заранее известны.

  2. Использовать Keyboard Builder. Этот способ тоже будет использоваться для создания динамических клавиатур в дальнейшем. Чтобы создать клавиатуру через Keyboard Builder можно использовать следующий код:

builder = InlineKeyboardBuilder()
for i in range(15):
    builder.button(text=f”Кнопка {i}”, callback_data=f”button_{i}”)
builder.adjust(2)
await msg.answer(“Текст сообщения”, 
reply_markup=builder.as_markup())

Здесь мы создаём Keyboard Builder и в цикле добавляем в него кнопки. builder.adjust(2) группирует кнопки в 2 столбца. Далее отправляется сообщение с созданной клавиатурой, которая из Keyboard Builder преобразовывается в Keyboard Markup функцией builder.as_markup() .

Клавиатура создана, теперь надо написать функции для вывода приветственного сообщения и меню. Тексты сообщений, используемые в боте, мы вынесем в отдельный файл text.py, чтобы можно было менять тексты, используемые в нескольких местах в боте, через изменение одной переменной в text.py:

greet = "Привет, {name}, я бот, использующий нейросети от OpenAI, такие как ChatGPT и Dall-e. Задавай мне вопросы и я постараюсь ответить ☺️"
menu = "? Главное меню"

Теперь пишем обработчики в файле handlers.py.

from aiogram import F, Router, types
from aiogram.filters import Command
from aiogram.types import Message

import kb
import text

router = Router()

@router.message(Command("start"))
async def start_handler(msg: Message):
    await msg.answer(text.greet.format(name=msg.from_user.full_name), reply_markup=kb.menu)

@router.message(F.text == "Меню")
@router.message(F.text == "Выйти в меню")
@router.message(F.text == "◀️ Выйти в меню")
async def menu(msg: Message):
    await msg.answer(text.menu, reply_markup=kb.menu)
→ Ссылка