Привет я new в stackoverflow также на python. Я хочу сделать клавиатуру (replykeyboardmarkup), которая считывает данные из базы данных и каждую кнопку на каждой строке клавиатуры, чтобы показать. Я хочу создать пользовательскую клавиатуру в telegram.bot Например: у нас есть массив строк, которые получают из базы данных. Как мы можем передавать данные из массива в InlineKeyboardMarkup? динамичная, отзывчивая кнопка. Что я могу сделать? thankss
Satria 08 авг. 2017, в 06:35
Поделиться
Привет, добро пожаловать в стек переполнения. Пожалуйста, обратитесь к ссылке « Как спросить» для получения более подробной информации о том, как задать вопрос и соответственно обновить свой вопрос.
Jeroen Heier 08 авг. 2017, в 04:01
Поделиться:
4 ответа
В API Telegram Bot они не упоминали о том, как работать с динамическим InlineKeyboardButton. Но есть способ сделать это с помощью CallbackQuery. В следующем примере предполагается, что переменная stringList будет содержать результаты запроса к базе данных, для этого я использую stringList в качестве словаря Pyton с Python 3.7 и pyTelegramBotAPI, который реализован для Telegram Bot API.
Разработка Telegram Bot на Python. (2.1 Клавиатуры. Текстовые кнопки)
stringList =
Позвольте создавать кнопки в соответствии со списком строк, импортируя типы из telebot. Здесь callback_data выполняет List, который помогает нам передавать данные от кнопки обработчикам запросов. Существует ограничение, если ваши callback_data больше 64 байт. Telegram Bot API сгенерирует ответ BUTTON_DATA_INVALID.
Пожалуйста, обратитесь к разделу Ошибки разметки, чтобы избежать подобных исключений.
markup = types.InlineKeyboardMarkup() for key, value in stringList.items(): markup.add(types.InlineKeyboardButton(text=value, callback_data=»[‘value’, ‘» + value + «‘, ‘» + key + «‘]»), types.InlineKeyboardButton(text=crossIcon, callback_data=»[‘key’, ‘» + key + «‘]»))
Ниже изображение является результатом кода выше.
Я использую этот крестик, чтобы показать вам, как удалить динамическую кнопку и как отредактировать InlineKeyboardButton, удалив эту динамическую кнопку. Как вы можете видеть (код выше), есть два CallbackQuery, которые обрабатывают первую кнопку и перекрестную кнопку.
Вы можете захватить первую кнопку callback_data в следующих строках кода.
if (call.data.startswith(«[‘value'»)): print(f»call.data : , type : «) print(f»ast.literal_eval(call.data) : , type : «) valueFromCallBack = ast.literal_eval(call.data)[1] keyFromCallBack = ast.literal_eval(call.data)[2] bot.answer_callback_query(callback_query_id=call.id, show_alert=True, text=»You Clicked » + valueFromCallBack + » and key is » + keyFromCallBack)
Есть два оператора печати, чтобы точно определить, какой тип данных мы будем обрабатывать. Первый оператор print показывает нам строковый тип List, когда мы нажимаем первую кнопку John.
call.data : [‘value’, ‘John’, ‘Name’] , type :
Пишем своего telegram-бота на Python, ч.2
Telegram бот на python aiogram #5 Клавиатуры и кнопки
Pocket Coder
Приветствую! В данной статье я расскажу вам про типы клавиатур в telegram-ботах и их вызов с помощью библиотеки pyTelegramBotAPI.
Виды клавиатур
В Telegram существует 2 типа клавиатур: Inline и Reply.
ReplyKeyboardMarkup — это шаблоны сообщений. К примеру, ваш бот задаёт пользователю вопрос и предлагает варианты ответа. Пользователь может самостоятельно напечатать ответ, либо нажать на готовую кнопку. Такая клавиатура показывается вместо основной и не привязана ни к какому сообщению.
InlineKeyboardMarkup — это уже настоящая кастомная клавиатура. С её помощью мы можем выполнять более сложные действия. Она привязывается к сообщению, с которым была отправлена.
Вывод клавиатур с помощью PyTelegramBotAPI
Ну что-же, давайте перейдём к коду. Для начала нам нужно импортировать модуль types (именно с его помощью мы будем вызывать клавиатуры). Сделать это можно с помощью данной строки:
from telebot import types
Теперь приступим к вызову нашей первой Reply клавиатуры.
Для этого нам нужно создать переменную, которой мы присвоим параметры нашей клавиатуры.
mm = types.ReplyKeyboardMarkup(row_width=2)
row_width=2 означает, что у нашей клавиатуры будет по 2 кнопки в строке, как на скриншоте ниже.
Также мы можем сделать кнопки в клавиатуре поменьше с помощью параметра resize_keyboard=True
Далее нам нужно создать переменные в которые мы запишем названия наших кнопок. Делаем это с помощью данных строк:
button1 = types.KeyboardButton(» Привет») button2 = types.KeyboardButton(» Как дела?»)
Теперь нам нужно добавить данные кнопки в клавиатуру.
mm.add(button1,button2)
Готово! Клавиатура создана, теперь нам нужно вывести данную клавиатуру вместе с сообщением. Для этого в конце сообщения через запятую вводим:
reply_markup=mm
У нас должна выйти такая строка:
Теперь при виде команды /start бот будет отправлять нам сообщение «Hello World!» и прикреплять к данному сообщению клавиатуру с кнопками «Привет» и «Как дела».
Давайте включим бота и проверим нашу клавиатуру.
Отлично, работает!
Но при нажатии на кнопку бот ничего не будет делать в ответ. Давайте это исправим!
Для этого сделаем обработчик сообщений и в него добавим названия наших кнопок.
Отлично! Теперь в ответ на «Привет» бот будет присылать нам «Привет!», а в ответ на «Как дела?» будет присылать нам «Отлично!».
Давайте включим бота и проверим его на работоспособность!
Теперь бот отвечает при нажатии на кнопки в нашем меню. Теперь давайте перейдем к Inline клавиатурам.
Inline клавиатуры
С Inline клавиатурами всё немного посложнее, потому что мы будем обрабатывать не текстовые сообщения, а callback_data.
Давайте перейдём к созданию Inline клавиатуры. Для этого также создадим переменную, которая будет передавать параметры клавиатуры.
otvet = types.InlineKeyboardMarkup(row_width=2)
Параметры у Inline клавиатуры точно такие-же, как и у Reply клавиатуры.
Теперь давайте добавим кнопки в нашу Inline клавиатуру.
button1 = types.InlineKeyboardButton(» Хорошо», callback_data=’good’) button2 = types.InlineKeyboardButton(» Плохо», callback_data=’bad’)
Здесь мы пропишем название нашей кнопки и сам callback_data, который мы будем обрабатывать.
Далее добавляем наши кнопки в клавиатуру с помощью строки:
otvet.add(button1,button2)
И теперь прикрепляем нашу клавиатуру к сообщению как в случае с Reply клавиатурой:
reply_markup=otvet
У вас должна выйти примерно вот такая строка.
Теперь включаем бота и проверяем нашу клавиатуру:
Как мы видим — клавиатура прикрепилась к сообщению.
Теперь нам нужно добавить обработчик callback_data с помощью данных строк:
Теперь при нажатии на кнопку «Хорошо» бот будет отвечать «Круто!», а при нажатии на «Плохо» будет отвечать «Ничего, все наладится!»
Проверим, отвечает ли бот при нажатии на кнопки в клавиатуре:
Как мы видим — бот отвечает нам при нажатии на кнопки клавиатуры.
Поздравляю! Теперь вы умеете вызывать клавиатуры с помощью библиотеки pyTelegramBotAPI
В следующем уроке мы научимся использовать базу данных sqlite3, отправлять emoji (костей) с нужным нам числом, а также начнём делать свой первый проект (мини-казино).
Спасибо за внимание! ✨
Конечный код:
Источник: telegra.ph
Telegram bot: как отправить сообщение с встроенной клавиатурой и скрыть пользовательскую клавиатуру одновременно?
можно ли это сделать? Сообщение имеет только один reply_markup собственность и может быть либо InlinkeKeyboardMarkup или ReplyKeyboardHide . Единственный способ сделать это — отправить 2 сообщения (сначала скрыть клавиатуру и 2nd с встроенной клавиатурой), но это не было бы лучшим решением с точки зрения пользовательского опыта. Я в порядке, чтобы сделать пару запросов, но хочу иметь только 1 сообщение, видимое пользователю.
автор: Alexander Trakhimenok
6 ответов
Это невозможно прямо сейчас. Telegram Bot API в настоящее время позволяет отправлять только один тип клавиатуры: встроенный или простой (включая KeyboardHide и другие).
автор: ihoru
Я думаю, вы хотите, чтобы кнопка исчезла, как только она нажата:
ReplyKeyboardMarkup MyButton = new ReplyKeyboardMarkup(); MyButton.OneTimeKeyboard = true;
вы даже можете сделать его более гибким, добавив Это:
MyButton.ResizeKeyboard = true;
автор: Mayer Sariggs
но вы можете отправить два сообщения, первый из которых отправит ReplyKeyboardHide/ReplyKeyboardRemove, а второй отправит встроенную клавиатуру
автор: Kirill
нет никакого логического решения. но есть одна хитрость. вы можете отправить сообщение, чтобы удалить предыдущую клавиатуру, затем удалить это сообщение, наконец, отправить следующее сообщение с помощью клавиатуры.
// send a fake message Message sentMsg = bot.SendTextMessageAsync(chatID, «.», replyKeyboardMarkup: new ReplyKeyboardRemove()).Result; // remove the fake message bot.DeleteMessageAsync(chatID, sentMsg.MessageId); // send the main message with it’s keyboard bot.SendTextMessageAsync(chatID, «the next message», replyKeyboardMarkup: new ReplyKeyboardMarkup(keyboardData));
автор: Emad Armoun
просто установите для свойства OneTimeKeyboard значение true,
Button.OneTimeKeyboard = true;
Как только кнопка используется, она никогда не отображается снова
вам лучше использовать inlinekeyboard как для Да / нет, так и для предыдущей клавиатуры, которую вы хотите показать после нажатия да или нет. таким образом, вы можете отредактировать сообщение yes/no inlinekeyboard и показать новую клавиатуру.
вы можете отправить inlineKeyboard и, проверив его callBackQuery.Параметр данных вы можете отредактировать отправленное сообщение еще раз и показать новое сообщение.
ниже приведен пример сообщения об обновлении json:
, «message»: < «message_id»: 22, «from»: < «id»: 3576731383, «first_name»: «the_bot_name», «username»: «mybot_bot» >, «chat»: < «id»: 111745258, «first_name»: «eric», «username»: «. «, «type»: «private» >, «date»: 1492113810, «text»: «sent message» >, «chat_instance»: «5419183837652256438», «data»: «yes» >>
поэтому, когда пользователь нажимает на да или нет, вы получите сообщение об обновлении. основываясь на приведенном выше сообщении об обновлении, chatid и messageid известны так, используя телеграмму c#.Библиотека ботов код редактирования выглядит так:
var chatid= 111745258; var messageid=22; TelegramBotClient api = new TelegramBotClient(«YOUR_TOKEN»); var new_keyboard = new InlineKeyboardMarkup( new[] < new[] < new InlineKeyboardButton(«step_1″,»step1») , >, new[] < new InlineKeyboardButton(«step_2″,»step2»), new InlineKeyboardButton(«step_3″,»step3»), >, new[] < new InlineKeyboardButton(«step_4″,»step4»), >>); api.EditMessageReplyMarkupAsync(chatid, messageid, replyMarkup: new_keyboard);
Источник: askdev.ru