Как сделать inline кнопку telegram c
Перейти к содержимому

Как сделать inline кнопку telegram c

  • автор:

Инлайн-кнопки

В канале Telegram есть возможность добавить инлайн-кнопки. Такие кнопки будут отображаться не под полем ввода, а над.

Возможность добавить инлайн-кнопки есть только в Telegram, другие каналы такую функциональность не поддерживают.

Обычные кнопки располагаются под полем ввода текста («Написать сообщение…»). Количество кнопок в строке определяется автоматически, в зависимости от количества кнопок и объема текста в них. На одном экране может быть не более восьми кнопок:

Инлайн-кнопки располагаются над полем ввода текста:

Как использовать инлайн-кнопки?

Возьмем, к примеру, такой экран. Изначально кнопки на нем будут отображаться в Telegram как обычные кнопки:

Есть два способа превратить эти обычные кнопки в инлайн-кнопки.

Добавить на нужный экран кнопку со ссылкой

Чтобы обычные кнопки превратились в Инлайн-кнопки, добавьте на этот же экран хотя бы одну кнопку-ссылку. Например, вы можете ссылку на ваш сайт.

  • нажмите + КНОПКА
  • введите название кнопки и нажмите Enter
  • нажмите на значок ссылки
  • вставьте URL на нужный ресурс
  • нажмите Сохранить

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

После публикации снова протестируйте бота. В нашем случае кнопки располагаются на стартовом (самом левом и самом верхнем) экране, поэтому, чтобы проверить, пошлем боту /start .

Добавить «пустую» кнопку

Второй способ подойдет вам, если кнопка-ссылка не подходит для вашего сценария.

  • нажмите + КНОПКА
  • наберите пробел и нажмите Enter. Текст кнопки будет содержать только один символ — пробел
  • нажмите на значок ссылки, вставьте любую ссылку
  • нажмите Сохранить

Нажмите Опубликовать и дождитесь сообщения о публикации в канал.

Затем пройдите ветку заново. Например, пошлите боту /start .

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

Как запомнить выбор пользователя

Вы можете получить текст выбранной инлайн-кнопки в Telegram через переменную $queryText . Для этого после блока с инлайн-кнопками добавьте блок Условия и сохраните значение $queryText в новую переменную $choice через выражение $choice = String($queryText).split(‘;’)[1] .

Особенности канала Telegram

Есть некоторые особенности отображения кнопок, которые нужно учитывать.

  1. Не всегда сразу же можно увидеть новый вариант кнопок. Иногда нужно пройти по другой ветке бота, затем послать /start и вернуться на экран с кнопками.
  2. Если у вас есть два экрана, которые идут друг после друга, и на первом экране обычные кнопки, а на втором инлайн-кнопки, то при перехода на экран с Инлайн-кнопками, обычные кнопки не исчезнут.

К примеру, возьмем два таких экрана. На экране, выделенном синим, обычные кнопки. На экране, выделенном зеленым, Инлайн-кнопки.

После нажатия на кнопку «цены» бот перейдет на второй экран, на котором должны отображаться Инлайн-кнопки. Но из-за особенностей канала, обычные кнопки не исчезнут.

Вы можете пользоваться таким поведением, если для вас даже удобно отображать два вида кнопок. Либо, если для вас такое поведение неудобно, разделяйте экраны с обычными кнопками от экранов с Инлайн-кнопками другими экранами текста с интентами вместо кнопок, чтобы не было такой последовательности.

Кнопка с номером телефона Telegram

Делаю бота для телеграм, нужно сделать инлайн кнопку, при нажатии на которой она срабатывала аналогично Позвонить Есть InlineKeyboardButton с параметром url но есть туда передать «tel:+7123231423», выдается error: <"ok":false,"error_code":400,"description":"Bad Request: wrong HTTP URL">Подскажите, возможно ли сделать это через Inline Button, и если нет, то как передать кликабельный номер в тексте сообщения?

Отслеживать
задан 5 авг 2019 в 15:29
11 1 1 серебряный знак 2 2 бронзовых знака
Достаточно просто указать номер и все будет открываться без проблем.
1 мая 2021 в 8:44

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

давай через «грязный хак»: создаешь файл https://moydomen.ru/call.php В котором такая запись:

А кнопку ссылаешь на выше указанный адрес

Отслеживать
ответ дан 23 апр 2020 в 8:07

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

InlineKeyboard в Телеграмм ботах (Telegram Bots)

Для начала создадим проект на Maven и добавим репозиторий «Telegram Bots»:

 org.telegram telegrambots 4.0.0  

При помощью BotFather регистрируем бота и получаем token:

Далее создаем класс Bot, наследуемся от TelegramLongPollingBot и Овверайдим методы:

Исходный код

import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.api.objects.Update; public class Bot extends TelegramLongPollingBot < @Override public void onUpdateReceived(Update update) < >@Override public String getBotUsername() < return null; >@Override public String getBotToken() < return null; >> 

Создаем final переменные с именем бота и токеном, добавляем в метод getBotUsername() — botUserName, в getBotToken() — token. В методе main регистрируем бота:

Исходный код

import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; public class Bot extends TelegramLongPollingBot < private static final String botUserName = "Habr_Inlinebot"; private static final String token = "632072575:AAG5YNl9tM9MJbnP5HwLB22rVzNCmY05MQI"; public static void main(String[] args) < ApiContextInitializer.init(); TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try < telegramBotsApi.registerBot(new Bot()); >catch (TelegramApiRequestException e) < e.printStackTrace(); >> @Override public void onUpdateReceived(Update update) < >@Override public String getBotUsername() < return botUserName; >@Override public String getBotToken() < return token; >>

Каркас бота готов! Теперь напишем метод с InlineKeyboard.

Работа с InlineKeyboard

Создаем обьект разметки клавиатуры:

 InlineKeyboardMarkup inlineKeyboardMarkup =new InlineKeyboardMarkup();

Теперь выстраиваем положение кнопок.

Создаем обьект InlineKeyboardButton, у которой есть 2 параметка: Текст (Что будет написано на самой кнопке) и CallBackData (Что будет отсылатся серверу при нажатии на кнопку).

 InlineKeyboardButton inlineKeyboardButton = new InlineKeyboardButton(); inlineKeyboardButton.setText("Тык"); inlineKeyboardButton.setCallbackData("Button \"Тык\" has been pressed"); 

Добавляем его в список, таким образом создавая ряд.

 List keyboardButtonsRow1 = new ArrayList<>(); keyboardButtons.add(inlineKeyboardButton);

Если желаете создать еще один ряд, просто сделайте еще один список и добавляйте в него новые кнопки.

 List keyboardButtonsRow2 = new ArrayList<>(); keyboardButtons.add(inlineKeyboardButton2);

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

List> rowList= new ArrayList<>(); rowList.add(keyboardButtonsRow1); rowList.add(keyboardButtonsRow2);

Фича
Разработчик позаботился о нас и мы можем сразу записывать кнопки в список не создавая переменную.

keyboardButtonsRow1.add(new InlineKeyboardButton().setText("Fi4a") .setCallbackData("CallFi4a"));

Теперь мы можем установить кнопки в обьект разметки клавиатуры.

 inlineKeyboardMarkup.setKeyboard(rowList);

Если немного не понятно описание работы с созданием клавиатуры, вот вам схема:

Вот и всё! Теперь добавляем разметку в сообщение:

 SendMessage message = new SendMessage().setChatId(chatId).setText("Пример") .setReplyMarkup(inlineKeyboardMarkup);

Теперь можем отправлять, вот вам готовый метод:

Исходный код

public static SendMessage sendInlineKeyBoardMessage(long chatId) < InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton(); InlineKeyboardButton inlineKeyboardButton2 = new InlineKeyboardButton(); inlineKeyboardButton1.setText("Тык"); inlineKeyboardButton1.setCallbackData("Button \"Тык\" has been pressed"); inlineKeyboardButton2.setText("Тык2"); inlineKeyboardButton2.setCallbackData("Button \"Тык2\" has been pressed"); ListkeyboardButtonsRow1 = new ArrayList<>(); List keyboardButtonsRow2 = new ArrayList<>(); keyboardButtonsRow1.add(inlineKeyboardButton1); keyboardButtonsRow1.add(new InlineKeyboardButton().setText("Fi4a").setCallbackData("CallFi4a")); keyboardButtonsRow2.add(inlineKeyboardButton2); List rowList = new ArrayList<>(); rowList.add(keyboardButtonsRow1); rowList.add(keyboardButtonsRow2); inlineKeyboardMarkup.setKeyboard(rowList); return new SendMessage().setChatId(chatId).setText("Пример").setReplyMarkup(inlineKeyboardMarkup); >

Делаем вариант когда будет вызывается метод в обработчике запросов onUpdateReceived:

Исходный код

 @Override public void onUpdateReceived(Update update) < if(update.hasMessage())< if(update.getMessage().hasText())< if(update.getMessage().getText().equals("Hello"))< try < execute(sendInlineKeyBoardMessage(update.getMessage().getChatId())); >catch (TelegramApiException e) < e.printStackTrace(); >> > > >

Теперь нам нужно обработать делаем новое ветвление в if и обрабатываем CallbackQuery:

Исходный код

 @Override public void onUpdateReceived(Update update) < if(update.hasMessage())< if(update.getMessage().hasText())< if(update.getMessage().getText().equals("Hello"))< try < execute(sendInlineKeyBoardMessage(update.getMessage().getChatId())); >catch (TelegramApiException e) < e.printStackTrace(); >> > >else if(update.hasCallbackQuery()) < try < execute(new SendMessage().setText( update.getCallbackQuery().getData()) .setChatId(update.getCallbackQuery().getMessage().getChatId())); >catch (TelegramApiException e) < e.printStackTrace(); >> >

На этом, пожалуй всё, спасибо за внимание!

Весь исходный код:

Весь код

import org.telegram.telegrambots.ApiContextInitializer; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.ApiContext; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton; import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import org.telegram.telegrambots.meta.exceptions.TelegramApiRequestException; import java.util.ArrayList; import java.util.List; public class Bot extends TelegramLongPollingBot < private static final String botUserName = "Habr_Inlinebot"; private static final String token = "632072575:AAG5YNl9tM9MJbnP5HwLB22rVzNCmY05MQI"; public static void main(String[] args) < ApiContextInitializer.init(); TelegramBotsApi telegramBotsApi = new TelegramBotsApi(); try < telegramBotsApi.registerBot(new Bot()); >catch (TelegramApiRequestException e) < e.printStackTrace(); >> @Override public void onUpdateReceived(Update update) < if(update.hasMessage())< if(update.getMessage().hasText())< if(update.getMessage().getText().equals("Hello"))< try < execute(sendInlineKeyBoardMessage(update.getMessage().getChatId())); >catch (TelegramApiException e) < e.printStackTrace(); >> > >else if(update.hasCallbackQuery()) < try < execute(new SendMessage().setText( update.getCallbackQuery().getData()) .setChatId(update.getCallbackQuery().getMessage().getChatId())); >catch (TelegramApiException e) < e.printStackTrace(); >> > @Override public String getBotUsername() < return botUserName; >@Override public String getBotToken() < return token; >public static SendMessage sendInlineKeyBoardMessage(long chatId) < InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup(); InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton(); InlineKeyboardButton inlineKeyboardButton2 = new InlineKeyboardButton(); inlineKeyboardButton1.setText("Тык"); inlineKeyboardButton1.setCallbackData("Button \"Тык\" has been pressed"); inlineKeyboardButton2.setText("Тык2"); inlineKeyboardButton2.setCallbackData("Button \"Тык2\" has been pressed"); ListkeyboardButtonsRow1 = new ArrayList<>(); List keyboardButtonsRow2 = new ArrayList<>(); keyboardButtonsRow1.add(inlineKeyboardButton1); keyboardButtonsRow1.add(new InlineKeyboardButton().setText("Fi4a").setCallbackData("CallFi4a")); keyboardButtonsRow2.add(inlineKeyboardButton2); List rowList = new ArrayList<>(); rowList.add(keyboardButtonsRow1); rowList.add(keyboardButtonsRow2); inlineKeyboardMarkup.setKeyboard(rowList); return new SendMessage().setChatId(chatId).setText("Пример").setReplyMarkup(inlineKeyboardMarkup); > > 

Как добавить inline кнопку в телеграмм боте?

Как сделать inline кнопку с такой стрелкой? :611518bdd044f379038761.jpeg
Что-бы при нажатии на неё над клавиатурой появлялась такая менюшка? :611518e14276a198249114.jpeg
Использую библиотеку PyTelegramBotApi

  • Вопрос задан более двух лет назад
  • 260 просмотров

Комментировать

Решения вопроса 1

SoreMix

soremix @SoreMix Куратор тега Python

Включить у бота режим inline.
Отправить inline клавиатуру с параметром switch_inline_query_current_chat равным, допустим, «Аккумуляторы»
Добавить inline_handler, в который отлавливать query и генерировать нужные результаты

@bot.message_handler(commands=['start']) def send_start(message): markup = InlineKeyboardMarkup() markup.add(InlineKeyboardButton('Аккумуляторы', switch_inline_query_current_chat='Аккумуляторы')) bot.send_message(message.chat.id, 'Товары', reply_markup=markup) @bot.inline_handler(lambda query: query.query == 'Аккумуляторы') def query_video(inline_query): r = InlineQueryResultArticle('1', 'SONY VTC6 3000 mah 30A 18650', InputTextMessageContent('Аккумулятор 1'), description='blah', url='https://buy-battery.com/goods/1', hide_url=True, thumb_url='https://via.placeholder.com/50') r2 = InlineQueryResultArticle('2', 'SONY VTC5A 2600 mah 35A 18650', InputTextMessageContent('Аккумулятор 2'), description='blah', url='https://buy-battery.com/goods/2', hide_url=True, thumb_url='https://via.placeholder.com/50') bot.answer_inline_query(inline_query.id, [r, r2])

Ответ написан более двух лет назад

Комментировать

Нравится Комментировать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *