KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]

Статьи / PHP

Два с воловиной года назад на сайте была статья о том, как сделать телеграм-бота. Сегодня я решил немного обновить используемую библиотеку и рассмотреть уже в новой части возможность добавления в бота клавиатуры с кнопками.


И сейчас я сразу начну с написания кода, ведь по сути эта статья является продолжением предыдущей (а в ней как раз-таки можно найти подробную инструкцию по подготовке и регистрации нового бота).

Архив с обновлённой библиотекой (работает на версии php >= 8.0):

telekot.zip


Первым делом добавляем библиотеку в свой проект и создаём php-файл, в котором, собственно, и будем писать бота. После этого необходимо подключить библиотеку:

<?php

require_once __DIR__ . '/telekot/Bot.php';

Теперь создаём экземпляр класса Bot и инициализируем переменные $data, $chat_id и $message:

$tg = \telekot\Bot::create( 'токен' )
    ->initData( $data )
    ->initChatId( $chat_id )
    ->initMessage( $message );

Создаём массив с нужными нам кнопками:

$kbd = [
    'inline_keyboard' => [
        [
            [
                'text' => 'Кнопка #1',
                'callback_data' => 'one'
            ],
            [
                'text' => 'Кнопка #2',
                'callback_data' => 'two'
            ]
        ],
        [
            [
                'text' => '🌄 Картинка',
                'callback_data' => 'img'
            ]
        ]
    ]
];

Далее напишем проверку на клик по inline-кнопке. Также я добавлю блок else, в него добавим пару команд для демонстрации обновлений библиотеки:

if ( isset( $data['callback_query'] ) )
{

    // Тут будем обрабатывать нажатие на кнопки

}
else
{

    // Тут будем обрабатывать обычные команды

}

Стоит заметить, что всё содержимое массива $data при наличии callback_query нужно искать уже внутри callback_query ( $data['callback_query']['*а дальше уже как обычно..*'] ).


Ну, а теперь с помощью конструкции switch-case проверим, на какую из кнопок нажал юзер:

switch ( $data['callback_query']['data'] )
{
    case 'one':
    {
        $tg->sendMessage( $chat_id, 'Вы нажали на первую кнопку' );
        break;
    }
    case 'two':
    {
        $tg->sendMessage( $chat_id, 'Вы нажали на вторую кнопку' );
        break;
    }
    case 'img':
    {
        $tg->sendImage( 'Держи картинку', 'https://proprikol.ru/wp-content/uploads/2020/10/kartinki-ozero-45.jpeg' );
        break;
    }
}

При нажатии любую из первых двух кнопок бот просто уведомит пользователя об этом, при нажатии на третью - отправит картинку с помощью метода sendImage().


Да, как и обещал - в блок else добавляем ещё две команды:

if ( $message == '/привет' )
{
    $tg->reply( 'Здарова' );
}
else if ( $message == '/кнопки' )
{
    $tg->sendMessage( $chat_id, 'Вот твои кнопки:', $kbd );
}

При вводе команды /кнопки - бот будет отправлять клавиатуру пользователю. При вводе команды /привет - здороваться с ним. Однако для первой команды я использовал метод reply(), а для второй - метод sendMessage(). Почему? Разница, на самом-то деле, небольшая: в метод sendMessage() необходимо передавать ID чата, а в метод reply() айди передавать не нужно (ответ придёт тому, кто написал боту). Поэтому в нашем случае, конечно же, удобнее и проще юзать reply().


Весь код:

<?php

require_once __DIR__ . '/telekot/Bot.php';


$tg = \telekot\Bot::create( 'токен' )
    ->initData( $data )
    ->initChatId( $chat_id )
    ->initMessage( $message );


$kbd = [
    'inline_keyboard' => [
        [
            [
                'text' => 'Кнопка #1',
                'callback_data' => 'one'
            ],
            [
                'text' => 'Кнопка #2',
                'callback_data' => 'two'
            ]
        ],
        [
            [
                'text' => '🌄 Картинка',
                'callback_data' => 'img'
            ]
        ]
    ]
];


if ( isset( $data['callback_query'] ) )
{

    switch ( $data['callback_query']['data'] )
    {
        case 'one':
        {
            $tg->sendMessage( $chat_id, 'Вы нажали на первую кнопку' );
            break;
        }
        case 'two':
        {
            $tg->sendMessage( $chat_id, 'Вы нажали на вторую кнопку' );
            break;
        }
        case 'img':
        {
            $tg->sendImage( 'Держи картинку', 'https://proprikol.ru/wp-content/uploads/2020/10/kartinki-ozero-45.jpeg' );
            break;
        }
    }

}
else
{

    if ( $message == '/привет' )
    {
        $tg->reply( 'Здарова' );
    }
    else if ( $message == '/кнопки' )
    {
        $tg->sendMessage( $chat_id, 'Вот твои кнопки:', $kbd );
    }

}


А вот, собственно, как работает бот:


bot.zip

  • 5id15
  • 10.08.2022
  • 11 353
  • 15
[PHP] Создание простого Telegram-бота на простой библиотеке.
[PHP] Создание простого Telegram-бота на простой библиотеке.
2-12-2019, 03:21, PHP
  1. Ромка

    Ромка Гость 10 февраля 2023 12:02

    Друзья помогите, как получить что ввёл пользователь и как получить его username

    1. 5id15

      5id15@Константин Дорофеев 11 февраля 2023 00:51

      $tg = \telekot\Bot::create( 'токен' )
      ->initData( $data )
      ->initMessage( $message );

      Текст сообщения, которое прислал пользователь, лежит в переменной $message.
      Юзернейм вытаскивается из массива $dаta: $data['message']['from']['username']

      1. Гость Роман

        Гость Роман Гость 14 февраля 2023 15:56

        Спасибо друг, а можешь еще помочь как сделать к примеру что бы после ввода команды получать значения что он ввел, а еще к примеру он вводит /parse id и где ид любое значение. И прикрепи usdt хотя бы пару долларов на чай накину)

        1. 5id15

          5id15@Константин Дорофеев 14 февраля 2023 16:21

          Если команда состоит из нескольких частей, то можно разбить её на массив через пробелы:

          $arr = explode( ' ', $message );

          '/parse 123' ----> ['/parse', '123']

          Соответственно введённый ID можно будет получить из массива по индексу $arr[1].

          1. Гость Роман

            Гость Роман Гость 14 февраля 2023 16:34

                else if ( $message == ['/parse', ''] )
                {
                    $arr = explode( ' ', $message );
                    $tg->sendMessage( $chat_id, "$arr" );
                }


            Вот так?

            1. 5id15

              5id15@Константин Дорофеев 14 февраля 2023 16:42

              Можно сразу разбить на массив, а потом делать проверки:

              $arr = explode( ' ', $message );

              // ...
              if ( $arr[0] == '/parse' )
              {
                  $tg->sendMessage( $chat_id, $arr[1] );
              }

              Сообщение пользователя делим на массив (через пробелы). Массив буде состоять в данном случае из двух элементов (0 - сама команда, 1 - айди).

            2. Гость Роман

              Гость Роман Гость 14 февраля 2023 16:46

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

              И если не составит труда, скинуть пример как разбить команду на массив, что бы сделать к примеру:

              Введите ваше имя

              вводит

              Введите ваш возраст

              вводит


              И ещё раз большое человеческое спасибо!!!! ЖМУ РУКУ КРЕПКО 

  2. Денис

    Денис Гость 16 февраля 2023 17:44

    Как вызвать кнопки и прятать кнопки? Не те, которые inline 

  3. Гость Владимир

    Гость Владимир Гость 17 мая 2023 10:38

    Добрый день! Обязательна версия PHP >=8? или на 7.4 тоже будет работать?

    Почему при использовании библиотеки выдает ошибку??

    Fatal error: Uncaught TypeError: Typed property telekot\Bot::$data must be array, null used in /home/www/bot/lib_request_bot.php:16 Stack trace: #0 /home/www/bot/lib_request_bot.php(26): telekot\Bot->__construct() #1 /home/www/bot/bot.php(10): telekot\Bot::create() #2 {main} thrown in /home/www/bot/lib_request_bot.php on line 16 

  4. Гость Владимир

    Гость Владимир Гость 19 мая 2023 18:33

    Доброго времени суток!)) Если вас не затруднит, расскажите как запускаете демона на php ,  который постоянно работает,например для контроля каких то параметров , отслеживания окончания подписки пользователя или других данных нуждающихся в контроле ?)Буду очень благодарен за информацию! 

    1. Сергей Котов

      Сергей Котов@Сергей Котов 3 июня 2023 21:09

      Это все можно сделать по крону, пишите скрипт со всеми проверками и ставите его в планировщик, например раз в минуту

  5. Федор

    Федор Гость 15 сентября 2023 12:27

    Доброго дня! А как получать телефон пользователя или это не возможно?

    1. 5id15

      5id15@Константин Дорофеев 16 сентября 2023 17:05

      Невозможно

  6. Егор

    Егор Гость 25 сентября 2023 23:08

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

    Вопрос 2: Как сделать кнопки , которые как меню идут, не inline как в вашем примере.

    Вопрос 3: Как сделать гиперссылку и если можно на примере простом и inline-кнопки.

    Заранее благодарен 

  7. Гость Александр

    Гость Александр Гость 16 апреля 2025 17:02

    Класс, хорошая тема

{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4124
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2023. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль