【问题标题】:Locking Telegram Custom Keyboard Buttons for Multiple Inputs为多个输入锁定 Telegram 自定义键盘按钮
【发布时间】:2016-04-26 17:53:54
【问题描述】:

我正在尝试锁定自定义键盘中的按键,以便用户在发送消息之前可以点击自定义键盘中的多个按钮。默认情况下,您点击自定义键盘按钮并发送消息,就像使用琐事机器人一样。关于如何做到这一点或是否有可能的任何想法?

【问题讨论】:

    标签: telegram telegram-bot


    【解决方案1】:

    如果我理解正确,您要做的是多选(复选框);电报中没有这样的功能,但你可以用不同的方式实现它。

    首先,您使用内联按钮和带有一些文本的空复选框发送消息:

    switch ($callback_query){
         case 'choose':
              $inline_keyboard = [
                [
                    ['text'=>'☐ 1', 'callback_data'=>"n1"],
                    ['text'=>'☐ 2', 'callback_data'=>"n2"],
                    ['text'=>'☐ 3', 'callback_data'=>"n3"]
    
                ],
                [
                    ['text'=>'☐ 4', 'callback_data'=>"n4"],
                    ['text'=>'☐ 5', 'callback_data'=>"n5"]
                ],
                [
                    ['text'=>'Next', 'callback_data'=>"$someData"]
                ]
            ];
            $keyboard=["inline_keyboard"=>$inline_keyboard];
            $replyMarkup = json_encode($keyboard);
            sendMessage($chat_id_callback, "Lorem ipsum dolor sit amet.", $replyMarkup);
         break;
    
    // When user is clicking on the buttons You process it with another case with all possible buttons in it and using telegram api to editMessageReplyMarkup
    
        case "n1":
        case "1":
        case "n2":
        case "2":
        case "n3":
        case "3":
        case "n4":
        case "4":
        case "n5":
        case "5":
            $empty_checkbox = "☐";
            $galochka = "✔";
            if (substr($data,0,1)== "n"){
                $is_checked = TRUE;
            } else {
                $is_checked = FALSE;
            }
    
            if ($is_checked){
                $what_is_checked = substr($data, 1);;
            } else {
                $what_is_checked = $data;
            }
    // $output is variable, in wich telegram data is stored, which came through webhook
            $text1 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][0][0]['text'];
            $text2 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][0][1]['text'];
            $text3 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][0][2]['text'];
            $text4 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][1][0]['text'];
            $text5 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][1][1]['text'];
    
            $room_callback_data1 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][0][0]['callback_data'];
            $room_callback_data2 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][0][1]['callback_data'];
            $room_callback_data3 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][0][2]['callback_data'];
            $room_callback_data4 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][1][0]['callback_data'];
            $room_callback_data5 = $output['callback_query']['message']['reply_markup']['inline_keyboard'][1][1]['callback_data'];
    
            if ($what_is_checked == "1"){
                if ($is_checked == TRUE) {
                    $text1 = $galochka . " 1";
                    $room_callback_data1 = "1";
                } else {
                    $text1 = $empty_checkbox . " 1";
                    $room_callback_data1 = 'n2';
    
                }
            } elseif ($what_is_checked == "2"){
                if ($is_checked == TRUE) {
                    $text2 = $galochka . " 2";
                    $room_callback_data2 = "2";
                } else {
                    $text2 = $empty_checkbox . " 2";
                    $room_callback_data2 = 'n2';
    
                }
            } elseif ($what_is_checked == "3"){
                if ($is_checked == TRUE) {
                    $text3 = $galochka . " 3";
                    $room_callback_data3 = "3";
                } else {
                    $text3 = $empty_checkbox . " 3";
                    $room_callback_data3 = 'n3';
    
                }
            } elseif ($what_is_checked == "4"){
                if ($is_checked == TRUE) {
                    $text4 = $galochka . " 4";
                    $room_callback_data4 = "4";
                } else {
                    $text4 = $empty_checkbox . " 4";
                    $room_callback_data4 = 'n4';
    
                }
            } elseif ($what_is_checked == "5"){
                if ($is_checked == TRUE){
                    $text5 = $galochka . " 5";
                    $room_callback_data5 = "5";
                } else {
                    $text5 = $empty_checkbox . " 5";
                    $room_callback_data5 = 'n5';
    
                }
            }
    
            $inline_keyboard = [
                [
                    ['text'=>$text1, 'callback_data'=>$room_callback_data1],
                    ['text'=>$text2, 'callback_data'=>$room_callback_data2],
                    ['text'=>$text3, 'callback_data'=>$room_callback_data3]
    
                ],
                [
                    ['text'=>$text4, 'callback_data'=>$room_callback_data4],
                    ['text'=>$text5, 'callback_data'=>$room_callback_data5]
                ],
                [
                    ['text'=>'Next', 'callback_data'=>"remont"]
                ]
            ];
            $keyboard=["inline_keyboard"=>$inline_keyboard];
            $replyMarkup = json_encode($keyboard);
    
            editMessageReplyMarkup($chat_id_callback, $message_id, $replyMarkup);
        break;
    }
    

    在第二种情况下,您只是检查按下了哪个按钮,并简单地更改复选标记上的空框。

    另外,您需要使用answerCallbackQuery,才能正常工作:

    function send_answerCallbackQuery($callback_query_id, $text ='', $alert = 0){
        file_get_contents($GLOBALS['api']."/answerCallbackQuery?callback_query_id=".$callback_query_id . '&text=' . $text . '&show_alert=' . $alert);
    }
    
    if (isset($output['callback_query'])) {
        send_answerCallbackQuery($output['callback_query']['id']);
    }
    

    【讨论】:

      【解决方案2】:

      除非您设置one_time_keyboard = True 或向用户返回ReplyKeyboardHide,否则保留自定义键盘是默认行为。

      请参阅文档:https://core.telegram.org/bots/api#replykeyboardmarkup

      您还可以在每次要确保显示键盘时在回复消息中发送相同的键盘。

      【讨论】:

      • 这个我明白。但是,我希望允许用户点击自定义键盘上的多个按钮,然后在他们选择时发送。一旦用户点击自定义键盘中的单个按钮,自定义键盘的默认设置会自动发送一条消息(例如:在琐事机器人上按 A 并提交答案 A)。
      • 不可能。每次用户按下按钮时,机器人都会收到一条消息。您可以累积答案并在按下最后一个按钮或特定数量的按钮后继续操作。
      • 好的,但是每个答案都是来自用户的单独消息?例如,如果我有带有“Hello”和“World”的按钮,我无法将自定义键盘设置为在发送前监听按下的 2 个按钮?我觉得在使用自定义键盘发送之前能够有多个输入的想法是对电报的一个很好的补充。
      • 是的,每次点击按钮 - 都会向机器人发送新消息。我认为这不会发生,因为这会使 API 复杂化很多。在您的应用中如您所愿地累积多次点击并不难。
      • 啊,好吧,我也在考虑尝试内联键盘,因为它不需要在每次点击时发送消息。刚开始测试,您对此有何看法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2013-08-06
      • 1970-01-01
      • 2015-09-14
      • 2016-04-26
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多