Встроенные клавиатуры Telegram PHP - PullRequest
1 голос
/ 04 марта 2020

Хотелось бы узнать, как изменить текст при нажатии на прикрепленную к нему кнопку (встроенная клавиатура). Он находится в канале телеграммы.

Что-то вроде это , но с моим кодом ниже (не нужно больше опций).

Код, который я сейчас имею:

$data = [
            'text' => 'choose options yes or no', 
            'chat_id' => '-100234234234'
          ];

$keyboard = array(
    "inline_keyboard" => array(
        array(
            array(
                "text" => "Yes",
                "callback_data" => "myCallbackData"
            ),
            array(
                "text" => "No",
                "callback_data" => "myCallbackData"
            )
        )
    )

file_get_contents("https://api.telegram.org/bot$token/sendMessage?" . http_build_query($data) . "&parse_mode=html&reply_markup=$keyboard");

1 Ответ

0 голосов
/ 04 марта 2020

После отправки сообщения;

  1. Запомните message_id, возвращенное Telegram
  2. Вызов /getUpdates, чтобы получить callback_data нажатой кнопки
  3. Использование /editMessageText до обновление первого сообщения

Пример;

<?php

    // Create data
    $data = http_build_query([
        'text' => 'Yes - No - Stop?',
        'chat_id' => '1234567890'
    ]);

    // Create keyboard
    $keyboard = json_encode([
        "inline_keyboard" => [
            [
                [
                    "text" => "Yes",
                    "callback_data" => "yes"
                ],
                [
                    "text" => "No",
                    "callback_data" => "no"
                ],
                [
                    "text" => "Stop",
                    "callback_data" => "stop"
                ]
            ]
        ]
    ]);

    // Send keyboard
    $url = "https://api.telegram.org/bot$token/sendMessage?{$data}&reply_markup={$keyboard}";
    $res = @file_get_contents($url);

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

    // Continually check for a 'press'
    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)) {

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

            // Check for 'stop'
            if ($callBackData === 'stop') {

                // Say goodbye and remove keyboard
                $data = http_build_query([
                    'text' => 'Bye!',
                    'chat_id' => '1234567890',
                    'message_id' => $message_id
                ]);
                $alter_res = @file_get_contents("https://api.telegram.org/bot$token/editMessageText?{$data}");

                // End while
                break;
            }

            // Alter text with callback_data
            $data = http_build_query([
                'text' => 'Selected: ' . $callBackData,
                'chat_id' => '1234567890',
                'message_id' => $message_id
            ]);
            $alter_res = @file_get_contents("https://api.telegram.org/bot$token/editMessageText?{$data}&reply_markup={$keyboard}");
        }

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

enter image description here

Примечание:

Этот пример написан на основе кода OP, просто чтобы показать идея изменения inline_keyboard. Этот код приведен исключительно в качестве примера, здесь должно быть гораздо больше проверок на ошибки и т. Д. c ...

На основании комментария я включил while true, чтобы продолжать проверять наличие новой печати.

...