Как создать простого бота для Телеграм на PHP

05.07.2021     👁 69900


Создадим простого бота для мессенджера Telegram с использованием PHP. Данная статья создана исключительно в поучительных целях и не претендует на полноту или правильность подхода. Весь код бота очень простой и может быть освоен начинающими PHP-разработчиками. 

Здравствуйте, дорогие читатели. Раз вы здесь, то пришли вы сюда из поиска по фразе "бот для телеграм на пхп". И работающего бота вы сделать сможете, прочитав данную статью. Вопросы для чего вам бот в Телеграм, здесь не обсуждаются, хотя мы сами используем собственного публичного бота @novelsite_bot для информирования о нас и наших услугах и сборе заявок. А также у нас есть закрытый бот, который мы используем как информатор в CRM (уведомления, свои задачи) и как показала практика — это действительно удобно.

Итак, 

Создадим простого бота для мессенджера Telegram с использованием PHP. Данная статья создана исключительно в поучительных целях и не претендует на полноту или правильность подхода. Весь код бота очень простой и может быть освоен начинающими PHP-разработчиками. 

Предупреждаю сразу профессионалов и перфекционистов от программирования — вам здесь делать нечего ;). Никаких фреймворков и гитхабов! Все будет очень просто и примитивно, но работать будет. И это главное. Всем счастья :)

Шаг 1: подготовка

Что нам понадобится:

  1. Веб-сервер с работающим PHP 5.6 и выше — не локальный веб-сервер, а веб-сервер на хостинге, что важно! Так как сервисы Telegram должны будут видеть вашего бота по внешней URL-ссылке;
  2. Веб-сервер должен работать через https — то есть на веб-сервере должен быть установлен давно (больше суток назад) зарегистрированный SSL-сертификат. Достаточно будет бесплатного Let's Encrypt SSL-сертификата;
  3. Доступ к файлам на этом сервере, конечно же — иначе как мы что-то сделаем;
  4. Установленная кодовая страница UTF-8 на сервере по-умолчанию или добавьте в файл .htacces в корне сайта строку AddDefaultCharset utf-8;
  5. Аккаунт в мессенджере Telegram;

Шаг 2. Регистрация вашего бота в Телеграм

Да, да. Бот еще даже не создан, но перед этим его уже нужно зарегистрировать, чтобы получить уникальный идентификатор, чтобы в дальнейшем обращаться к BOT API Telegram.

  • Для этого заходим в Телеграм в специального бота @BotFather и присоеденяемся к нему — кнопка Присоединится, при этом бот выдаст команду /start — это базовая команда любого бота;
  • @BotFather вас поприветствует и можно посмотреть все команды, введя /help
  • Создаем бота, введя /newbot
  • И вводим имя бота и username, чтобы не заморачиваться — введите одинаково, но помните, что username вводится на латинице и в конце должно быть _bot, например:
    username: verysimple_bot — подходит
    username: verysimplebot — не подходит
  • Далее @BotFather вас поздравит и выдаст ключ или токен бота для HTTP API — по сути это строка из номера (ID) бота и набора случайных символов, примерно в таком виде:
    1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG
    Запомните свой токен — он нам понадобится дальше.
  • Далее можно задать картинку (аватар) бота, введя /setuserpic
    - Можно использовать любую вашу картинку в формате JPG, PNG, загрузив её после этой команды.
  • Можно приступать к программированию...

Шаг 3. Создаем код бота

Будем делать прямо в корне сервера (не самый верный подход, можно создать папку bot, а в ней уже файл verysimple_bot.php). Для этого на сервере создадим файл verysimple_bot.php в котором и будет весь код бота. Не забываем, что весь код в файле verysimple_bot.php должен быть в кодировке UTF-8.

Для редактирования файлов кода и заброске их на сервер удобно использовать FAR Manager — в нем есть и подсветка синтаксиса и FTP/SFTP клиент для копирования файла на сервер.

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

/**
*   Very simple chat bot @verysimple_bot by Novelsite.ru
*   05.07.2021
*/
header('Content-Type: text/html; charset=utf-8'); // на всякий случай досообщим PHP, что все в кодировке UTF-8

$site_dir = dirname(dirname(__FILE__)).'/'; // корень сайта
$bot_token = '1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG'; // токен вашего бота
$data = file_get_contents('php://input'); // весь ввод перенаправляем в $data
$data = json_decode($data, true); // декодируем json-закодированные-текстовые данные в PHP-массив

// Для отладки, добавим запись полученных декодированных данных в файл message.txt, 
// который можно смотреть и понимать, что происходит при запросе к боту
// Позже, когда все будет работать закомментируйте эту строку:
file_put_contents(__DIR__ . '/message.txt', print_r($data, true));

// Основной код: получаем сообщение, что юзер отправил боту и 
// заполняем переменные для дальнейшего использования
if (!empty($data['message']['text'])) {
    $chat_id = $data['message']['from']['id'];
    $user_name = $data['message']['from']['username'];
    $first_name = $data['message']['from']['first_name'];
    $last_name = $data['message']['from']['last_name'];
    $text = trim($data['message']['text']);
    $text_array = explode(" ", $text);
    
    if ($text == '/help') {
        $text_return = "Привет, $first_name $last_name, вот команды, что я понимаю: 
/help - список команд
/about - о нас
";
        message_to_telegram($bot_token, $chat_id, $text_return);
    }
    elseif ($text == '/about') {
        $text_return = "verysimple_bot:
Я пример самого простого бота для телеграм, написанного на простом PHP.
Мой код можно скачивать, дополнять, исправлять. Код доступен в этой статье:
https://www.novelsite.ru/kak-sozdat-prostogo-bota-dlya-telegram-na-php.html
";
        message_to_telegram($bot_token, $chat_id, $text_return);
    }

}

// функция отправки сообщени в от бота в диалог с юзером
function message_to_telegram($bot_token, $chat_id, $text, $reply_markup = '')
{
    $ch = curl_init();
    $ch_post = [
        CURLOPT_URL => 'https://api.telegram.org/bot' . $bot_token . '/sendMessage',
        CURLOPT_POST => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_POSTFIELDS => [
            'chat_id' => $chat_id,
            'parse_mode' => 'HTML',
            'text' => $text,
            'reply_markup' => $reply_markup,
        ]
    ];

    curl_setopt_array($ch, $ch_post);
    curl_exec($ch);
}

Шаг 4. Делаем WebHook и конкретизируем код бота

Итак, базовый код бота мы сделали. Он сможет отвечать на 2 команды: /help (Помощь) и /about (Информация о нас). Но как теперь это заставить работать и, как работает функция message_to_telegram? 

  1. Чтобы все заработало, нужно сособщить сервису Телеграм, что наш бот лежит там-то — используй его код для такого-то бота verysimple_bot.
    Для этого нужно сформировать ссылку, которая называется WebHook и её мы и сообщим телеграму:

    https://api.telegram.org/bot1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG/setWebhook?url=https://www.mysite.ru/verysimple_bot.php

    Не забываем где красное заменяем на свои данные!
    Как сформируете эту ссылку — вставьте её в браузер и запустите!

    Если все пройдет правильно, то ответ на эту ссылку в браузере будет примерно такой:
      {"ok":true,"result":true,"description":"Webhook was set"}  
     
  2. Функция message_to_telegram отправляет сообщение через Telegram Bot API в диалог бота, формируя массив в нужном формате через вызов библиотеки CURL (обычно встроена в PHP). С CURL более правильно и структурировано работает с https-запросами.

    То есть мы обращаемся к телеграм бот API, указав ему нашего бота и сделав запрос /sendMessage и передав наш текст, а бот Api уже "запихает" это сообщение в мессенджер Телеграм — и мы увидем реультат. Получается цепочка:
    1. Пользователь в диалоге с ботом пишет запрос, например /help
    2. Telegram Bot API через WebHook, что мы установили, берет этот запрос и отправляет в код бота
    3. Мы в боте получаем его, анализируем, видим  например, /help и через Telegram Bot API и
      функцию message_to_telegram отправляем ответ — который появлется в диалоге как ответ бота.

Шаг 5. Добавим возможность делать заявки через бота

Заявкой будем считать сообщение или вопрос, которое можно будет отправить через нашего бота какому-то пользователю, назовем его менеджер компании. То есть нам нужно организовать такую цепочку:

  1. Пользователь запрашивает у бота "Оставить заявку", например набрав команду /order
  2. Бот входит в режим ожидания текста Заявки
  3. Если пользователь ввел текст и нажал Enter, только тогда отослать это сообщение заранее запрограммированному по менеджеру компании.

Получим идентификатор chat_id пользователя кому нужно отсылать заявки:

  1. Помните наш файл message.txt — вот он сейчас понадобится
  2. Присоединяемся к нашему боту тем пользователем, кому будем слать заявки (менеджер компании)
  3. Сразу открываем файл message.txt и смотрим блок: [chat]

                [chat] => Array
                    (
                        [id] => 123456789
                        [first_name] => manager
                        [last_name] => company
                        [username] => username
                        [type] => private
                    )
  4. Сохраняем это в коде бота сверху и добавим переменную состояния бота:
$order_chat_id = '123456789';  //chat_id менеджера компании для заявок
$bot_state = ''; // состояние бота, по-умолчанию пустое

Сохраняем состояние бота для каждого пользователя

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

Напишем две функции: set_bot_state($chat_id, $data) и get_bot_state($chat_id) — которые сохраняют текущее состояние бота и получают соответсвенно, для нужного пользователя. Сохранять будем в подпапке /users на сервере, которую создадим предварительно не забыв дать права на запись. Состояния будут хранится все в тех же текстовых файлах с именами chat_id пользователей и содержать последнюю команду:

// сохранить состояние бота для пользователя
function set_bot_state ($chat_id, $data)
{
    file_put_contents(__DIR__ . '/users/'.$chat_id.'.txt', $data);
}

// получить текущее состояние бота для пользователя
function get_bot_state ($chat_id)
{
    if (file_exists(__DIR__ . '/users/'.$chat_id.'.txt')) {
        $data = file_get_contents(__DIR__ . '/users/'.$chat_id.'.txt');
        return $data;
    }
    else {
        return '';
    }
}

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

/**
*   Very simple chat bot @verysimple_bot by Novelsite.ru
*   05.07.2021
*/
header('Content-Type: text/html; charset=utf-8'); // на всякий случай досообщим PHP, что все в кодировке UTF-8

$site_dir = dirname(dirname(__FILE__)).'/'; // корень сайта
$bot_token = '1234567899:AAKJhkkjhkjhKhKhjkhkhk_kJhgkjhJhgjghjhG'; // токен вашего бота
$data = file_get_contents('php://input'); // весь ввод перенаправляем в $data
$data = json_decode($data, true); // декодируем json-закодированные-текстовые данные в PHP-массив

$order_chat_id = '123456789';  //chat_id менеджера компании для заявок
$bot_state = ''; // состояние бота, по-умолчанию пустое

// Для отладки, добавим запись полученных декодированных данных в файл message.txt, 
// который можно смотреть и понимать, что происходит при запросе к боту
// Позже, когда все будет работать закомментируйте эту строку:
file_put_contents(__DIR__ . '/message.txt', print_r($data, true));

// Основной код: получаем сообщение, что юзер отправил боту и 
// заполняем переменные для дальнейшего использования
if (!empty($data['message']['text'])) {
    $chat_id = $data['message']['from']['id'];
    $user_name = $data['message']['from']['username'];
    $first_name = $data['message']['from']['first_name'];
    $last_name = $data['message']['from']['last_name'];
    $text = trim($data['message']['text']);
    $text_array = explode(" ", $text);

	// получим текущее состояние бота, если оно есть
	$bot_state = get_bot_state ($chat_id);

    // если текущее состояние бота отправка заявки, то отправим заявку менеджеру компании на $order_chat_id
    if (substr($bot_state, 0, 6) == '/order') {
        $text_return = "
Заявка от @$user_name:
Имя: $first_name $last_name 
$text
";
        message_to_telegram($bot_token, $order_chat_id, $text_return);
        set_bot_state ($chat_id, ''); // не забудем почистить состояние на пустоту, после отправки заявки
    }
    // если состояние бота пустое -- то обычные запросы
    else {
    
    	// вывод информации Помощь
        if ($text == '/help') {
            $text_return = "Привет, $first_name $last_name, вот команды, что я понимаю: 
    /help - список команд
    /about - о нас
    /order - оставить заявку
    ";
            message_to_telegram($bot_token, $chat_id, $text_return);
            set_bot_state ($chat_id, '/help');
        }
        
        // вывод информации о нас
        elseif ($text == '/about') {
            $text_return = "verysimple_bot:
    Я пример самого простого бота для телеграм, написанного на простом PHP.
    Мой код можно скачивать, дополнять, исправлять. Код доступен в этой статье:
    https://www.novelsite.ru/kak-sozdat-prostogo-bota-dlya-telegram-na-php.html
    ";
            message_to_telegram($bot_token, $chat_id, $text_return);
            set_bot_state ($chat_id, '/about');
        }
        
        // переход в режим Заявки
        elseif ($text == '/order') {
            $text_return = "$first_name $last_name, для подтверждения Заявки введите текст вашей заявки и нажмите отправить. 
Наши специалисты свяжутся с вами в ближайшее время!
";
            message_to_telegram($bot_token, $chat_id, $text_return);
            set_bot_state ($chat_id, '/order');
        }
	}
}

// функция отправки сообщения от бота в диалог с юзером
function message_to_telegram($bot_token, $chat_id, $text, $reply_markup = '')
{
    $ch = curl_init();
    $ch_post = [
        CURLOPT_URL => 'https://api.telegram.org/bot' . $bot_token . '/sendMessage',
        CURLOPT_POST => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_POSTFIELDS => [
            'chat_id' => $chat_id,
            'parse_mode' => 'HTML',
            'text' => $text,
            'reply_markup' => $reply_markup,
        ]
    ];

    curl_setopt_array($ch, $ch_post);
    curl_exec($ch);
}

// сохранить состояние бота для пользователя
function set_bot_state ($chat_id, $data)
{
    file_put_contents(__DIR__ . '/users/'.$chat_id.'.txt', $data);
}

// получить текущее состояние бота для пользователя
function get_bot_state ($chat_id)
{
    if (file_exists(__DIR__ . '/users/'.$chat_id.'.txt')) {
        $data = file_get_contents(__DIR__ . '/users/'.$chat_id.'.txt');
        return $data;
    }
    else {
        return '';
    }
}

Шаг 6. Регистрация команд бота

Теперь, если у вас все работает и бот отзывается на все команды, можно будет зарегистрировать эти команды у отца ботов @BotFather

  • Заходим к боту @BotFather
  • Запрашиваем установку команд /setcommands 
  • Выбираем нашего бота 
  • Вбиваем команды (без слешей вначале):
    help - список команд
    about - о нас
    order - оставить заявку
  • Все — теперь в вашем боте появится список команд, если нажать в диалоге /
     

 

Вот и все — простой бот работает! Всем спасибо, если дочитали и что-то заработало.

 


Николай Комарков


Смотрите также: Кейсы интернет-рекламы


620026, Россия, Свердловская область, Екатеринубрг, ул. Энгельса 36, оф. 640
Телефон: +7 (343) 221-00-40
Почта: info@novelsite.ru
Продолжая использовать наш сайт, вы даете согласие на обработку файлов cookie и пользовательских персональных данных.

Я принимаю

Заполните Бриф на расчет интернет-рекламы

Для того, чтобы мы рассчитали смету по рекламной кампании для вас, пожалуйста, заполните данный бриф из 10 блоков, как можно подробнее. Кнопка "Отправить" находится внизу формы.

ОТПРАВИТЬ ЗАПРОС НА РАССЧЕТ — Нажимая на кнопку "ОТПРАВИТЬ ЗАПРОС", я даю согласие на обработку персональных данных

Заявка успешно отправлена!

Спасибо, что обратилиcь в нашу компанию!

Наши специалисты обработают заявку в течении нескольких рабочих дней. Скорее всего, нам потребуется с вами пообщаться по телефону для уточнения деталей рекламной кампании для вас, поэтому постарайтесь быть на связи.

Закрыть

Подписывайся на наш Телеграм

Подписывайся на наш
Телеграм канал!
Контекст решает