Бот для Telegram. Простейший вариант на php

Когда для своего сервиса https://qrer.ru, который занимается отправкой сообщений об изменениях на сайтах пользователей потребовалось подключить сообщение в чат Telegram, я стал искать простое и быстрое решение — как написать собственного бота на языке php.

Прежде всего для разработки бота пригодится внутренняя документация мессенджера. Хотя она на английском языке, но разобраться в ней довольно просто. Однако хотелось чего-нибудь готового и уже на php. Изучение инструкций подсказало, что код должен быть небольшой и простой, так как все манипуляции сводятся к отправке POST и GET запросов и получению ответов в формате JSON. Язык php справляется с этим без всяких проблем.

Даже документация самого сервиса в качестве примеров бота на php содержала ссылки на библиотеки, расположенные на github. Эти библиотеки показались мне избыточными. Кроме того, для подключения их требовалась установка менеджера пакетов Composer, а затем, когда я его подключил выяснилось, что библиотеки требуют PHP 7 или, в качестве минимума, php версии 5.5. Обновляться со своей 5.4.16 у меня не было никакого желания, хотя и можно было бы поставить 5.6. Но мысль о том, что для того, чтобы реализовать простейший обмен информации необходимо подгружать избыточные библиотеки не давала покоя.

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

1. Для начала, как и указано в других источниках, необходимо создать бота. Для этого необходимо обратиться к «отцу всех ботов» — роботу Telegram с ником @BotFather. Для этого открываем чат и находим этого пользователя.

2. Затем в диалоге с этим господином (запущенным командой /start) набираем команду /newbot

 

3. В ответном диалоге BotFather поздравит с пополнением, выдаст ссылку на новичка и даст буквенно-цифровой ключ, который необходимо сохранить в тайне. По нему Telegram поймет что это мы, а мы поймем, что это он. Все, теперь бот создан, с ним уже можно общаться. Правда отвечать он не будет, потому что не умеет.

4. Для того, чтобы наш сайт мог принимать сообщения, нужно сделать следующие вещи. Прежде всего создать так называемый WebHook и сообщить о нем мессенжеру. Это по сути дела в нашем случае обычный файл на php, который будет вызываться всякий раз, когда происходит новое событие. Например кто-то обратиться к нашему боту. Делается это один раз, после чего можно уже писать обработчик. Следует отметить, что наиболее правильным будет создание обработчика сообщений на сайте, на котором уже есть SSL-сертификат и который работает по протоколу HTTPS. Обычные бесплатные сертификаты Let’s Encrypt вполне подойдут. Отличная инструкция по их созданию.

Для создания WebHook пишем следующий код:

$url = "https://api.telegram.org/bot".$Telegram_botkey."/setWebhook?url=https://nash-server.ru/".$Telegram_dir."/bot.php";
$l1=file_get_contents($url);
$response = json_decode($l1);
$s=print_r($response);

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

5. Теперь собственно бот на php. Тот самый, что bot.php

$json = file_get_contents('php://input');
$obj = json_decode($json, TRUE);

— получили то, что нам прислали и перевели в массив.

if (isset($obj['message']))
{
$first_name="";
$last_name="";
$username="";
$text="";
 
$chat_id=$obj['message']['chat']['id'];
if ($obj['message']['chat']['type']=="private")
{
if (isset($obj['message']['chat']['first_name'])) $first_name=$obj['message']['chat']['first_name'];
if (isset($obj['message']['chat']['last_name'])) $last_name=$obj['message']['chat']['last_name'];
if (isset($obj['message']['chat']['username'])) $username=$obj['message']['chat']['username'];
 
if ($first_name!="" AND $last_name!="") $text="Здравствуйте, ".$first_name." ".$last_name."!";

Если получили сообщение и тип беседы «Приватная», то поняли, как зовут вашего собеседника, какой у него ник и даже составили ответное сообщение!

if ($text!="")
{
$text=urlencode ($text);
$url = "https://api.telegram.org/bot".$Telegram_botkey."/sendMessage?chat_id=".$chat_id."&text=".$text."&parse_mode=HTML&disable_web_page_preview=false&disable_notification=false";
$json=file_get_contents($url);
};
} //private chat
}; //message

Все, если текст мы составили, то мы его отправим в окошко пользователю. Здесь между последним и предпоследним фрагментом кода можно вставить свой код — проверить — есть ли пользователь в базе, выполнить еще массу шагов. Важно, что ответ мы предоставляем в виде текста.

По поводу последнего фрагмента есть несколько дополнительных необязательных перемеменных:

parse_mode=HTML — позволяет вставлять простейшее форматирование. Ссылки, делать текст жирным или курсивом. Важно — элемент href в ссылках должен быть в кавычках.

disable_web_page_preview=false — позволяет показывать в окне чата превью странички, которая скрывается за отправленной ссылкой.

disable_notification=false — не дает отправить сообщение скрыто, в фоне. В таком виде при поступлении нового сообщения телефон издает звуковой сигнал. Если поставить true, то сообщение в Telegram придет «молча».

На этом все. Еще можно внедрить последний фрагмент в любой php-код, где требуется отправка сообщения на уже открытый диалог в мессенджер. Пользователь может выйти из него, но когда он появится онлайн снова — сообщение к нему обязательно придет. Таким образом, вместо того, чтобы использовать громоздкие php-библиотеки, мы написали всего несколько строчек кода на php и реализовали значительное количество функционала бота, которое нам требуется.

Буду рад, если статья вам помогла.

6 комментариев

  • Oleg

    05.12.2017

    bot.php возвращает всегда NULL…

    Reply
    • beuser

      02.02.2018

      Олег, ищите ошибку в коде. На этом коде построены реальные боты. Вот пример: qrer_bot — зарегистрированным пользователям qrer.ru шлет дайджест изменений на сайтах, которые они мониторят. Работает как часы.

      Reply
    • EO1

      18.07.2019

      используйте proxy.

      Reply
  • Станислав

    27.03.2018

    А с кнопками не примерчика?

    Reply
  • Павел

    12.12.2019

    Всё отлично работает!
    Искал именно решение без библиотек.
    Спасибо.

    Reply
  • Леша

    27.08.2021

    нужно на & заменить, тогда работает.

    Reply

Добавить комментарий