Блокировка пользовательских кнопок клавиатуры Telegram для нескольких входов

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


person Nathan Bernard    schedule 26.04.2016    source источник


Ответы (2)


По умолчанию пользовательская клавиатура сохраняется до тех пор, пока вы не установите one_time_keyboard = True или не вернете пользователю ReplyKeyboardHide.

См. Документы: https://core.telegram.org/bots/api#replykeyboardmarkup

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

person Alexander Trakhimenok    schedule 28.04.2016
comment
Это я понимаю. Однако я хочу разрешить пользователю нажимать несколько кнопок на настраиваемой клавиатуре, а затем отправлять сообщения, когда они захотят. По умолчанию для настраиваемой клавиатуры сообщение автоматически отправляется, когда пользователь нажимает одну кнопку на настраиваемой клавиатуре (пример: нажмите A на викторине, и вы отправите ответ A). - person Nathan Bernard; 29.04.2016
comment
Это невозможно. Каждый раз, когда пользователь нажимает кнопку, бот получает сообщение. Вы можете накапливать ответы и переходить после нажатия последней кнопки или определенного количества кнопок. - person Alexander Trakhimenok; 29.04.2016
comment
хорошо, но каждый из этих ответов будет отдельным сообщением от пользователя? Например, если бы у меня были кнопки с Hello и World, я не мог бы настроить настраиваемую клавиатуру для прослушивания двух нажатых кнопок перед отправкой? Я считаю, что идея иметь несколько входов перед отправкой с настраиваемой клавиатурой была бы хорошим дополнением к Telegram. - person Nathan Bernard; 29.04.2016
comment
Да, каждое нажатие кнопки - новое сообщение боту. Я не думаю, что это произойдет, так как это сильно усложнит API. Накопить несколько кликов в своем приложении не так уж и сложно. - person Alexander Trakhimenok; 30.04.2016
comment
А, ладно, я тоже думал попробовать встроенную клавиатуру, так как она не требует отправки сообщения при каждом нажатии. Только начал тестирование, что вы думаете по этому поводу? - person Nathan Bernard; 02.05.2016

Если я правильно понял, вы хотите сделать множественный выбор (флажок); в телеграмме такой функции нет, но можно реализовать немного иначе.

Сначала вы отправляете сообщение со встроенными кнопками и пустыми флажками с некоторым текстом:

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']);
}
person Akim    schedule 16.03.2021