Telegram 锁定电报多输入自定义键盘按钮

Telegram 锁定电报多输入自定义键盘按钮,telegram,telegram-bot,Telegram,Telegram Bot,我正在尝试锁定自定义键盘中的键,以便用户可以在发送消息之前点击自定义键盘中的多个按钮。默认情况下,您点击一个自定义键盘按钮并发送消息,就像使用琐事机器人一样。关于如何实现这一点或是否可行,有什么想法吗?保留自定义键盘是默认行为,除非您将one\u time\u keyboard=True或将ReplyKeyboardHide返回给用户 见文件: 此外,每次您希望确保键盘显示时,您都可以在回复消息中发送相同的键盘。如果我理解正确,您要做的是多选(复选框);电报中没有这样的功能,但您可以稍微不同地实

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

保留自定义键盘是默认行为,除非您将
one\u time\u keyboard=True
或将ReplyKeyboardHide返回给用户

见文件:


此外,每次您希望确保键盘显示时,您都可以在回复消息中发送相同的键盘。

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

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

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']);
}

这我理解。但是,我希望允许用户点击自定义键盘上的多个按钮,然后在选择时发送。当用户点击自定义键盘上的单个按钮时,“自定义键盘自动”的默认设置会发送一条消息(例如:在琐事机器人上按a,然后提交答案)。这是不可能的。用户每次按下按钮,都会收到一条消息。您可以累积答案,并在按下最后一个按钮或特定数量的按钮后继续。好的,但每个答案都将是来自用户的单独消息?例如,如果我有带“Hello”和“World”的按钮,我无法设置自定义键盘,以便在发送之前监听2个按钮?我觉得在使用自定义键盘发送之前能够有多个输入的想法将是对电报的一个很好的补充。是的,每个按钮点击-向机器人发送新消息。我不认为这会使API复杂化。在你的应用程序中积累你想要的多次点击并不难。啊,好吧,我也在考虑试用内联键盘,因为它不需要每次点击都发送消息。刚开始测试,你对此有何想法?