YaKotikTvoy
@YaKotikTvoy
Стьюдик

Почему команда бота не выдаёт набор кнопок?

Использую для создания бота вот эту библиотеку - https://github.com/php-telegram-bot/example-bot.
Имеется команда InlinekeyboardCommand.php. Она создаёт сообщение с кнопками. Я её переопределил, она в отличие от примера в библиотеке имеет только кнопки, возвращающие данные обратным вызовом.
<?php

/**
 * This file is part of the PHP Telegram Bot example-bot package.
 * https://github.com/php-telegram-bot/example-bot/
 *
 * (c) PHP Telegram Bot Team
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Longman\TelegramBot\Commands\UserCommands;

/**
 * User "/inlinekeyboard" command
 *
 * Display an inline keyboard with a few buttons.     
 *
 * This command requires CallbackqueryCommand to work!
 * 
 * Отобразите встроенную клавиатуру с несколькими кнопками.
 *
 * Для работы этой команды требуется команда запроса обратного вызова!
 * @see CallbackqueryCommand.php
 */

use Longman\TelegramBot\Commands\UserCommand;
use Longman\TelegramBot\Entities\InlineKeyboard;
use Longman\TelegramBot\Entities\ServerResponse;
use Longman\TelegramBot\Exception\TelegramException;

class InlinekeyboardCommand extends UserCommand
{
    /**
     * @var string
     */
    protected $name = 'inlinekeyboard';

    /**
     * @var string
     */
    protected $description = 'Show inline keyboard';

    /**
     * @var string
     */
    protected $usage = '/inlinekeyboard';

    /**
     * @var string
     */
    protected $version = '0.2.0';

    /**
     * Main command execution
     *
     * @return ServerResponse
     * @throws TelegramException
     */
    public function execute(): ServerResponse
    {
        $inline_keyboard = new InlineKeyboard([
            ['text' => 'Callback', 'callback_data' => '1'],
            ['text' => 'Callback', 'callback_data' => '1'],
        ], [
            ['text' => 'Callback', 'callback_data' => '1'],
            ['text' => 'Callback', 'callback_data' => '1'],
        ]);

        return $this->replyToChat('Вопрос 1', [
            'reply_markup' => $inline_keyboard,
        ]);
    }
}


Имеется команда, которая вызывается всякий раз, когда происходит обратный вызов.
<?php

/**
 * This file is part of the PHP Telegram Bot example-bot package.
 * https://github.com/php-telegram-bot/example-bot/
 *
 * (c) PHP Telegram Bot Team
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

/**
 * Callback query command
 *
 * This command handles all callback queries sent via inline keyboard buttons.
 *
 * @see InlinekeyboardCommand.php
 Команда запроса обратного вызова

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

@смотри InlinekeyboardCommand.php
 */

namespace Longman\TelegramBot\Commands\SystemCommands;

use Longman\TelegramBot\Commands\SystemCommand;
use Longman\TelegramBot\Entities\ServerResponse;
use Longman\TelegramBot\Entities\InlineKeyboard;

class CallbackqueryCommand extends SystemCommand
{
    /**
     * @var string
     */
    protected $name = 'callbackquery';

    /**
     * @var string
     */
    protected $description = 'Handle the callback query';

    /**
     * @var string
     */
    protected $version = '1.2.0';

    /**
     * Main command execution
     *
     * @return ServerResponse
     * @throws \Exception
     */
    /*public function execute(): ServerResponse
    {
        // Callback query data can be fetched and handled accordingly.
		// Данные запроса обратного вызова могут быть извлечены и обработаны соответствующим образом.
        $callback_query = $this->getCallbackQuery();
        $callback_data  = $callback_query->getData();

        return $callback_query->answer([
            'text'       => 'Content of the callback data: ' . $callback_data,
            'show_alert' => (bool) random_int(0, 1), // Randomly show (or not) as an alert.
            'cache_time' => 5,
        ]);
    }*/
	public function execute(): ServerResponse
    {
		/*spl_autoload_register("my_autoloader");
        // Callback query data can be fetched and handled accordingly.
		// Данные запроса обратного вызова могут быть извлечены и обработаны соответствующим образом.
        $callback_query = $this->getCallbackQuery();
        $callback_data  = $callback_query->getData();
		if($callback_data === 'InlinekeyboardCommand1'){
			$command = new InlinekeyboardCommand1($telegram, $update);
		} elseif($callback_data === 'InlinekeyboardCommand2') {
			$command = new InlinekeyboardCommand2($telegram, $update);
		} elseif($callback_data === 'InlinekeyboardCommand3') {
			$command = new InlinekeyboardCommand3($telegram, $update);
		}
		$command->execute();
        /*return $callback_query->answer([
            'text'       => 'Content of the callback data: ' . $callback_data,
            'show_alert' => (bool) random_int(0, 1), // Randomly show (or not) as an alert.
            'cache_time' => 5,
        ]);*/
		$callback_query = $this->getCallbackQuery();
        $callback_data  = $callback_query->getData();
		if($callback_data == '1'){
			$inline_keyboard = new InlineKeyboard([
				['text' => 'Callback', 'callback_data' => '2'],
				['text' => 'Callback', 'callback_data' => '2'],
			], [
				['text' => 'Callback', 'callback_data' => '2'],
				['text' => 'Callback', 'callback_data' => '2'],
			]);
		} elseif($callback_data == '2') {
			$inline_keyboard = new InlineKeyboard([
				['text' => 'Callback', 'callback_data' => '3'],
				['text' => 'Callback', 'callback_data' => '3'],
			], [
				['text' => 'Callback', 'callback_data' => '3'],
				['text' => 'Callback', 'callback_data' => '3'],
			]);
		} elseif($callback_data == '3') {
			$inline_keyboard = new InlineKeyboard([
				['text' => 'Callback', 'callback_data' => '4'],
				['text' => 'Callback', 'callback_data' => '4'],
			], [
				['text' => 'Callback', 'callback_data' => '4'],
				['text' => 'Callback', 'callback_data' => '4'],
			]);
		}
		//$callback_query->editMessageReplyMarkup($inline_keyboard);
		/*return $callback_query->answer([
            'text'       => 'Content of the callback data: ' . $callback_data,
            'show_alert' => (bool) random_int(0, 1), // Randomly show (or not) as an alert.
            'cache_time' => 5,
			'reply_markup' => $inline_keyboard
        ]);*/
		//return $callback_query->answer();
		return $this->replyToChat($callback_query, [
            'reply_markup' => $inline_keyboard,
        ]);
    }
}

Всякий раз, когда происходит вызов, хочу вернуть клавиатуру со следующим вопросом, но ничего не возвращается. Сама команда /inlinekeyboard вызывается, а вот ещё один набор кнопок после неё уже нет. Мне необходимо, чтобы бот выдавал вопросы в количестве четырех подряд, а ответы были в виде кнопок.
В методе я создаю нужную клавиатуру, которая будет соответствовать обратному вызову.
Бот реагирует тем, что в нажатой кнопке появляется в правом нижнем углу часы, а потом они исчезают и всё.
64ab1ac903c82856958579.png
Как сделать так, чтобы бот выдавал набор кнопок?
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
Добавляете в самое начало CallbackqueryCommand::execute логирование и смотрите, будет ли что-то писаться.
Если нет - проблема не в этом классе, а где-то раньше (в конфигах, наверняка, нужно его зарегистрировать в качестве обработчика).
Если да - читаете логи php, там наверняка будут выброшенные исключения (или временно добавляете try/catch в метод и логируете пойманную ошибку самостоятельно).
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы