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);