кастомные 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 шт):
Мы реализуем меню с помощью 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:
Передать двумерный список кнопок как аргумент при создании клавиатуры. Данный способ используется в нашем проекте для создания меню. Удобен когда клавиатура статичная и все данные для неё заранее известны.
Использовать 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)