Как получить данные с встроенной клавиатуры как единый результат? - PullRequest
1 голос
/ 09 марта 2020

У меня есть телеграмм-бот, который настроен и подключен к моему бэкэнду. Когда пользователи выбирают опцию «ввести пароль», я отправляю встроенную клавиатуру рядом с запросом, чтобы пользователь мог ввести свой пароль цифрой c. Я делаю так, чтобы пароль не отображался в чате. У меня проблема в том, что я использую callback_data для назначения значения нажатой кнопке, но эти обратные вызовы проходят один за другим при нажатии кнопки. Я хотел бы знать, возможно ли создать накопительную строку из нажатых символов, и после нажатия кнопки «Отправить» отправьте ответ пользователя.

Мой встроенный запрос В настоящее время выглядит следующим образом:

{
  "chat_id": 99999999,
  "text": "Enter Password",
  "reply_markup": {

    "inline_keyboard": [

      [{"text": "1","callback_data":"1","pay":true},{"text": "2","callback_data":"2"},{"text": "3","callback_data":"3"}],
      [{"text": "4","callback_data":"4"},{"text": "5","callback_data":"5"},{"text": "6","callback_data":"6"}],
      [{"text": "7","callback_data":"7"},{"text": "8","callback_data":"8"},{"text": "9","callback_data":"9"}],
      [{"text": "0","callback_data":"0"}],
      [{"text": "Submit","callback_data":"Submit"}]
    ]
  }
}

Более того, можно сделать встроенные кнопки go после нажатия кнопки отправки, я просмотрел документацию бота telgram и могу найти любую опцию, подобную этой. https://core.telegram.org/bots/api#sendmessage

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

1 Ответ

1 голос
/ 10 марта 2020

На основании вашего комментария, упрощенная версия клавиатуры с использованием ;

Примечание :

  1. Там должно быть больше проверять ошибки (конечно ...)
  2. Маленькие «часы» на нажатой кнопке можно удалить, сообщив Telegram, что вы видели сообщение. (Пожалуйста, смотрите там документы )
<?php

    $myChatId = 1234567;
    $token = '859.....';

    // Send keypad
    $data = http_build_query([
        'text' => 'Please enter pin;',
        'chat_id' => $myChatId
    ]);
    $keyboard = json_encode([
        "inline_keyboard" => [
            [
                [ "text" => "1", "callback_data" => "1" ],
                [ "text" => "2", "callback_data" => "2" ],
                [ "text" => "3", "callback_data" => "3" ]
            ],
            [
                [ "text" => "4", "callback_data" => "4" ],
                [ "text" => "5", "callback_data" => "5" ],
                [ "text" => "6", "callback_data" => "6" ]
            ],
            [
                [ "text" => "7", "callback_data" => "7" ],
                [ "text" => "8", "callback_data" => "8" ],
                [ "text" => "9", "callback_data" => "9" ]
            ],
            [
                [ "text" => "<", "callback_data" => "<" ],
                [ "text" => "0", "callback_data" => "0" ],
                [ "text" => "OK", "callback_data" => "ok" ]
            ]
        ]
    ]);
    $res = @file_get_contents("https://api.telegram.org/bot$token/sendMessage?{$data}&reply_markup={$keyboard}");

    // Get message_id to alter later
    $message_id = json_decode($res)->result->message_id;

    // Remember pressId, so we wont add the same input
    $last_presesd_id = 0;

    // Continually check for a 'press', until we've reached 'ok' callback
    // TODO; max 30sec - 4inputs
    $pincode = [];
    while (true) {

        // Call /getUpdates
        $updates = @file_get_contents("https://api.telegram.org/bot$token/getUpdates");
        $updates = json_decode($updates);

        // Check if we've got a button press
        if (count($updates->result) > 0 && isset(end($updates->result)->callback_query->data)) {

            // And this is the first time
            if ($last_presesd_id === end($updates->result)->callback_query->id) {
                continue;
            }

            // Get callback data (pressed number)
            $callBackData = end($updates->result)->callback_query->data;

            // Remember $last_presesd_id
            $last_presesd_id = end($updates->result)->callback_query->id;

            // Handle data
            switch ($callBackData) {

                // Stop, remove keyboard, show result
                case 'ok':

                    // Show pincode and remove keyboard
                    $data = http_build_query([
                        'text' => 'Pincode: ' . implode('-', $pincode),
                        'chat_id' => $myChatId,
                        'message_id' => $message_id
                    ]);
                    $alter_res = @file_get_contents("https://api.telegram.org/bot$token/editMessageText?{$data}");

                    // End while
                    break 2;

                // <, remove last from pin input
                case '<': {
                    array_pop($pincode);
                    break;
                }

                // 1, 2, 3, ...
                default:
                    // Add to pincode
                    $pincode[] = $callBackData;
                    break;
            }
        }

        // Sleep for a second, and check again
        sleep(1);
    }

enter image description here

Я использую editMessageText() чтобы изменить сообщение, убрать клавиатуру. Вы также можете нам ReplyKeyboardRemove()

...