Telegram bot: как отправить сообщение с встроенной клавиатурой и скрыть пользовательскую клавиатуру одновременно?
- Шаг 1: отправьте пользователю сообщение с
ReplyKeyboardMarkup
с несколько кнопок (["Yes", "No"]
) - Шаг 2: если пользователь нажимает одну из кнопок ( "
Yes"
) Я хочу отобразить сообщение со встроенной клавиатурой и скрыть кнопки, отправленные на шаге 1.
можно ли это сделать? Сообщение имеет только один reply_markup
собственность и может быть либо InlinkeKeyboardMarkup
или ReplyKeyboardHide
. Единственный способ сделать это - отправить 2 сообщения (сначала скрыть клавиатуру и 2nd с встроенной клавиатурой), но это не было бы лучшим решением с точки зрения пользовательского опыта. Я в порядке, чтобы сделать пару запросов, но хочу иметь только 1 сообщение, видимое пользователю.
какие мысли?
6 ответов
Это невозможно прямо сейчас. Telegram Bot API в настоящее время позволяет отправлять только один тип клавиатуры: встроенный или простой (включая KeyboardHide и другие).
Я думаю, вы хотите, чтобы кнопка исчезла, как только она нажата:
ReplyKeyboardMarkup MyButton = new ReplyKeyboardMarkup();
MyButton.OneTimeKeyboard = true;
вы даже можете сделать его более гибким, добавив Это:
MyButton.ResizeKeyboard = true;
но вы можете отправить два сообщения, первый из которых отправит ReplyKeyboardHide/ReplyKeyboardRemove, а второй отправит встроенную клавиатуру
нет никакого логического решения. но есть одна хитрость. вы можете отправить сообщение, чтобы удалить предыдущую клавиатуру, затем удалить это сообщение, наконец, отправить следующее сообщение с помощью клавиатуры.
// 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));
просто установите для свойства OneTimeKeyboard значение true,
Button.OneTimeKeyboard = true;
Как только кнопка используется, она никогда не отображается снова
вам лучше использовать inlinekeyboard как для Да / нет, так и для предыдущей клавиатуры, которую вы хотите показать после нажатия да или нет. таким образом, вы можете отредактировать сообщение yes/no inlinekeyboard и показать новую клавиатуру.
вы можете отправить inlineKeyboard и, проверив его callBackQuery.Параметр данных вы можете отредактировать отправленное сообщение еще раз и показать новое сообщение.
ниже приведен пример сообщения об обновлении json:
{"update_id":14603298,
"callback_query":
{
"id": "479899181065761766",
"from": {
"id": 111735238,
"first_name": "eric",
"username": "...."
},
"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);