Как сделать инлайн кнопки в Телеграмм python

Сегодня я расскажу вам о том, как сделать inline-кнопки, которые будет нажимать пользователь на вопросы бота. Это как минимум — удобно, а как максимум уберегает нас о того чтобы пользователь не ввёл «что-нибудь не то», от чего программа может рухнуть или отработать как-нибудь не так.

Написание телеграм-бота на Python. Часть первая
Vorontsoff 23 сентября 2022
Написание телеграм-бота на Python. Часть вторая
Vorontsoff 24 сентября 2022
Про шаблон структуры телеграмм-бота. Разработка на Python.

Часть третья
Vorontsoff 29 сентября 2022
Написание телеграм-бота на Python. Часть четвертая
Vorontsoff 3 октября 2022

Итак, в прошлой (четвертой) части мы добрались до того что получили словарь с возможными вариантами городов. Теперь нам нужно, как оказалось Рим (в тестовом режиме я использую ранее сохраненный запрос к серверу в фай.json) у нас не один, и вариантов бывает много.

У меня это сделано так:

Пользователь видит список городов и нажимает соответствующую кнопку, а мы в свою очередь получаем соответствующий destination_id, для того чтобы уже искать отель в конкретно определенном населенном пункте.

Разработка Telegram Bot на Python. (2.1 Inline Кнопки)

Как же это работает?! Всё довольно таки просто:

Я создал файл cities_buttons.py и поместил его в подпапку inline в директории keyboards. В котором используются два модуля (from telebot import types, from loader import bot). Первый используется для создания inline кнопок, а второй за отправку сообщений пользователю.

Функция buttons_generator(message, cities): принимает в качестве аргументов сообщение и словарь с возможными вариантами городов , пройдя по элементам этого словаря циклом мы создаем блок кнопок, который посылаем пользователю в чат.

у меня есть такое чувство что чего то тут не так, но пока не знаю чего. Но это не окончательный код и прошу если что «понять и простить» а еще лучше подсказать кто знает более красивый вариант

У нас есть idшник нужного нам города, переходим уже непосредственно к поиску отеля в этом городе. Для поиска нам нужны будут еще несколько переменных checkIn и checkOut (это будут даты, в формате «год-месяц-день»), для того чтобы пользователь ввел правильно дату, в правильном формате я использовал готовый модуль telegram_bot_calendar, который можно установить командой:

  • pip install python-telegram-bot-calendar

Источник: dzen.ru

Встроенные кнопки в Telegram Bot API — pyTelegramBotAPI

Добрый день уважаемые читатели, давайте рассмотрим, какие основные типы встроенных кнопок предлагают чат-боты telegram и в чем их особенности. Статья будет полезна всем, кто хочет разобраться в возможностях взаимодействия с пользователями telegram в версии bot API 2.0.

Для обзора возможностей нам понадобится установить 3 целых 2 десятых Python`a и пару ложек pyTelegramBotAPI. Особенности настройки и регистрации чат-бота мы рассматривать не будем, т.к. есть множество статей на эту тему.

Еще по теме:  Что делать если забыл пин код от Телеграмма

Как работать с Телеграм Inline кнопками на Python

И так, что же такое встроенные кнопки(клавиатура) в мессенджере Telegram? Это кнопки которые выводятся во внутренней области чата и привязываются к конкретному сообщению. Они жестко связаны с сообщением(если удалить сообщение, внутренние кнопки так же удаляются вместе с ним.). Они дают возможность динамически видоизменять его.

В данный момент есть три типа встроенных кнопок:

URL-кнопки

Для создания кнопки используется тип InlineKeyboardMarkup, давайте создадим кнопку «Наш сайт»:

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

Switch-кнопки

Для того что-бы создать подобный переключатель, необходимо указать аргумент switch_inline_query либо пустой, либо с каким-либо текстом.

Теперь, если мы нажмем на кнопку и выберем чат, вот что получится:
Шаг 1:

Нажимаем на кнопку.

Шаг 2:

Выбираем чат.

Шаг 3:

Активировался встроенный inline-режим.

Callback-кнопки

Ну и наконец самое интересное — это кнопки с обратной связью: позволяют динамически обновлять сообщение/встроенные кнопки (не засоряя при этом ленту), а так же отображать уведомление в верху чат-бота или модальном окне.

Например, их можно использовать для просмотра длинного сообщения, аналогично пагинации страниц на сайтах, или например сделать календарь. Я не стану изобретать велосипед, а через поиск по GitHub, найду готовую библиотеку calendar-telegram. Выполнив указанные инструкции, получаем готовый календарь, который можно динамически изменять по нажатию на соответствующие кнопки:

Так же можно добавить уведомление по нажатию на дату, для этого достаточно указать сообщение в ответе:

bot.answer_callback_query(call.id, text=»Дата выбрана»)

(Пример в десктопной версии)

(Пример в мобильной версии)

Если изменить show_alert на True, то мы получим модальное окно:

bot.answer_callback_query(call.id, show_alert=True, text=»Дата выбрана»)

Заключение

По последним данным, в нашумевшем мессенджере Telegram регистрируются больше 600к пользователей ежедневно. Именно поэтому важно подхватить тренд и разобраться с его основными особенностями, т.к. различные методы взаимодействия с ботами существенно облегчает жизнь разработчиков и пользователей.

Cпасибо за Ваш интерес к данной теме.

  • telegram bots
  • telegram
  • telegram api

Источник: habr.com

Как сделать кнопки в боте Телеграм на Python?

Сегодня мы познакомимся с такой замечательной фичей Telegram-ботов, как кнопки.

Прежде всего, чтобы избежать путаницы, определимся с названиями.

1630936303307.png

То, что цепляется к низу экрана вашего устройства, будем называть обычными кнопками , а то, что цепляется непосредственно к сообщениям, назовём инлайн-кнопками.

Кнопки как шаблоны
Этот вид кнопок появился вместе с Bot API в далёком 2015 году и представляет собой не что иное, как шаблоны сообщений.
Принцип простой: что написано на кнопке, то и будет отправлено в текущий чат. Соответственно, чтобы обработать нажатие такой кнопки, бот должен распознавать входящие текстовые сообщения.

Еще по теме:  Что такое hint в Телеграмме

Напишем хэндлер, который будет при нажатии на команду /start отправлять сообщение с двумя кнопками:

Обратите внимание, что т.к. обычные кнопки- суть шаблонных сообщений, то их можно создавать не только как объекты KeyboardButton , но и как обычные строки.
Что ж, запустим бота и обалдеем от громадных кнопок:

1630936467809.png

Смотрим — действительно красиво:

1630936645552.png

Осталось научить бота реагировать на нажатие таких кнопок.

Как уже было сказано выше, необходимо делать проверку на полное совпадение текста.
Сделаем это двумя способами: через специальный фильтр Text и обычной лямбдой:

1630936721202.png

Чтобы удалить кнопки, необходимо отправить новое сообщение со специальной «удаляющей» клавиатурой типа ReplyKeyboardRemove.

await message.reply(«Отличный выбор!», reply_markup=types.ReplyKeyboardRemove())

Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width.
При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width , например, row_width=2. Попробуйте!

Специальные обычные кнопки

В Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType и, по желанию, указать тип создаваемого объекта.
Впрочем, проще один раз увидеть код:

Теперь поговорим про Инлайн-кнопки

URL-кнопки и колбэки
В отличие от обычных кнопок, инлайновые цепляются не к низу экрана, а к сообщению, с которым были отправлены.
Мы рассмотрим два типа таких кнопок: URL и Callback.

Самые простые инлайн-кнопки относятся к типу URL, т.е. «ссылка». Поддерживаются только протоколы HTTP(S) и tg://

А если хотите обе кнопки в ряд, то уберите row_width=1 (тогда будет использоваться значение по умолчанию 3).
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам .

Это очень мощная штука, которую вы можете встретить практически везде.

Но как же обработать нажатие? Если раньше мы использовали message_handler для обработки входящих сообщений, то теперь будем использовать callback_query_handler для обработки колбэков.
Ориентироваться будем на «значение» кнопки, т.е. на её data:

Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку.
Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ).
В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):

1630937310331.png

В функции send_random_value мы вызывали метод answer() не у message , а у call.message .
Это связано с тем, что колбэк-хэндлеры работают не с сообщениями (тип Message ), а с колбэками (тип CallbackQuery ), у которого другие поля, и само сообщение — всего лишь его часть.
Учтите также, что message — это сообщение, к которому была прицеплена кнопка (т.е. отправитель такого сообщения — сам бот).
Если хотите узнать, кто нажал на кнопку, смотрите поле from (в вашем коде это будет call.from_user , т.к. слово from зарезервировано в Python)

Еще по теме:  Если блокировать чат в Телеграмме

Перейдём к примеру посложнее.
Пусть пользователю предлагается сообщение с числом 0, а внизу три кнопки: +1, -1 и Подтвердить.
Первыми двумя он может редактировать число, а последняя удаляет всю клавиатуру, фиксируя изменения.
Хранить значения будем в памяти в словаре.

1630937507625.png

И, казалось бы, всё работает:

Но теперь представим, что ушлый пользователь сделал следующее: вызвал команду /numbers (значение 0), увеличил значение до 1, снова вызвал /numbers (значение сбросилось до 0) и отредактировал нажал кнопку «+1» на первом сообщении.
Что произойдёт?
Бот по-честному отправит запрос на редактирование текста со значением 1, но т.к. на том сообщении уже стоит цифра 1, то Bot API вернёт ошибку, что старый и новый тексты совпадают, а бот словит исключение: aiogram.utils.exceptions.MessageNotModified: Message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message

1630937714783.png

С этой ошибкой вы, скорее всего, будете поначалу часто сталкиваться, пытаясь редактировать сообщения.
Но, в действительности, решается проблема очень просто: мы проигнорируем исключение MessageNotModified.

# from aiogram.utils.exceptions import MessageNotModified # from contextlib import suppress async def update_num_text(message: types.Message, new_value: int): with suppress(MessageNotModified): await message.edit_text(f»Укажите число: «, reply_markup=get_keyboard())

Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.

Фабрика колбэков
В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData , указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки.
Например, рассмотрим следующий объект:

# from aiogram.utils.callback_data import CallbackData cb= CallbackData(«post», «id», «action»)

Тогда при создании кнопки вам надо указать её параметры так:

button = types.InlineKeyboardButton( text=»Лайкнуть», callback_data=cb.new(id=5, action=»like») )

В примере выше в кнопку запишется callback_data , равный post:5:like, а хэндлер на префикс post будет выглядеть так:

В предыдущем примере с числами мы грамотно выбрали callback_data , поэтому смогли легко запихнуть все обработчики в один хэндлер.
Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку «Подтвердить» .
Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использованием фабрики:

Источник: seochao.ru

Рейтинг
( Пока оценок нет )
Загрузка ...