Простой бот для приветствия пользователя в группе Телеграм - HelloBot

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

Для создания такого простого бота как HelloBot нам нужно лишь словить служебные сообщения от Telegram Bot Api, которое отправляется из группы при добавлении нового участника. Новый участник может быть добавлен действующим участником, присоединиться по ссылке приглашению или самостоятельно присоединиться.

Нас интересует объект message и в нем объект по ключу new_chat_participant и там находиться информация о новом участнике.

Структура служебного уведомления:

Array
(
    [update_id] =>
    [message] => Array
        (
            [message_id] => 
            [from] => Array
                (
                    [id] =>
                    [is_bot] =>
                    [first_name] =>
                    [last_name] =>
                    [username] =>
                    [language_code] =>
                )

            [chat] => Array
                (
                    [id] => 
                    [title] =>
                    [type] =>
                    [all_members_are_administrators] =>
                )

            [date] =>
            [new_chat_participant] => Array
                (
                    [id] =>
                    [is_bot] => 
                    [first_name] =>
                    [username] =>
                )

            [new_chat_member] => Array
                (
                    [id] =>
                    [is_bot] => 
                    [first_name] =>
                    [username] =>
                )
            [new_chat_members] => Array
                (
                    [0] => Array
                        (
                            [id] =>
                            [is_bot] => 
                            [first_name] =>
                            [username] =>
                        )
                )
        )
)

В наш класс бота добавим свойство, в котором будем хранить приветствие, имя пользователя {%username%} будем в последствии заменять на полученные данные из объекта функцией str_replace

<?php
    // Приветствие пользователя
    private $helloText = "Приветствую, {%username%}";
?>

Для получения необходимого объекта в методе router() нашего класса сделаем проверку передаваемых данных и при наличии получим имя пользователя и выведем приветствие.

<?php
    /** Роутер - Определяем что делать с данными от АПИ
     * @param $data
     * @return bool
     */
    private function router($data)
    {
        // проверяем массив данных на нужный нам ключ
        if (array_key_exists("new_chat_participant", $data['message'])) {
            // достаем имя нового пользователя
            $name = trim($data['message']['new_chat_participant']['first_name'] 
                 . ' ' . $data['message']['new_chat_participant']['last_name']);
            // отправляем приветствие в чат
            $this->botApiQuery("sendMessage", [
                    'chat_id' => $data['message']['chat']['id'],
                    'text' => str_replace("{%username%}", $name, $this->helloText)]
            );
        }
        return true;
    }
?>

* * *

Исходный код бота

Привожу исходный код бота приветствия для группы в Телеграм по типу HelloBot.

<?php
// определим кодировку UTF-8 и ответ 200
header("HTTP/1.1 200 OK");
header('Content-type: text/html; charset=utf-8');
// создаем объект бота
$newBot = new HelloBot();
// запускаем бота
$newBot->init();

/** Класс Бота
 * Class HelloBot
 */
class HelloBot
{
    // токен вашего бота
    private $token = "ВАШ_ТОКЕН";
    // Приветствие пользователя
    private $helloText = "Приветствую, {%username%}";

    /** Стартуем  бота
     * @return bool
     */
    public function init()
    {
        // получаем данные от АПИ и преобразуем их в ассоциативный массив
        $rawData = json_decode(file_get_contents('php://input'), true);
        // направляем данные из бота в метод
        // для определения дальнейшего выбора действий
        $this->router($rawData);
        // в любом случае вернем true для бот апи
        return true;
    }

    /** Роутер - Определяем что делать с данными от АПИ
     * @param $data
     * @return bool
     */
    private function router($data)
    {
        // проверяем массив данных на нужный нам ключ
        if (array_key_exists("new_chat_participant", $data['message'])) {
            // достаем имя нового пользователя
            $name = trim($data['message']['new_chat_participant']['first_name']
                . ' ' . $data['message']['new_chat_participant']['last_name']);
            // отправляем приветствие в чат
            $this->botApiQuery("sendMessage", [
                    'chat_id' => $data['message']['chat']['id'],
                    'text' => str_replace("{%username%}", $name, $this->helloText)
                ]
            );
        }
        return true;
    }

    /** Запрос к BotApi
     * @param $method
     * @param array $fields
     * @return mixed
     */
    private function botApiQuery($method, $fields = array())
    {
        $ch = curl_init('https://api.telegram.org/bot' . $this->token . '/' . $method);
        curl_setopt_array($ch, array(
            CURLOPT_POST => count($fields),
            CURLOPT_POSTFIELDS => http_build_query($fields),
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT => 10
        ));
        $r = json_decode(curl_exec($ch), true);
        curl_close($ch);
        return $r;
    }
}
?>
15 комментариев
Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте бот @iMakeBot, нажмите кнопку Старт/Start. Следуйте инструкциям бота.

  • Oleg Oskolsky [4 года назад]

    На Node.JS и Telegraf это делается в несколько строчек кода.

  • iMakeBots [4 года назад → Oleg Oskolsky]

    Олег, рад вас видеть!

    Даже не сомневаюсь в возможностях Node.JS и тем более Telegraf - по сути это же полноценный фреймворк для разработки Telegram Bot. 

    Если вы поделитесь своими знаниями, буду очень благодарен, ведь у вас в части разработки ботов Телеграм опыта много (стараюсь следить за вашим творчеством).

  • Artem [2 года назад]

    Добрый день, а как включить форматирование для приветственного сообщения: маркдаун, например?

  • iMakeBots [2 года назад → Artem]

    Можете добавить в массив данных параметр parse_mode

    $this->botApiQuery("sendMessage", [
            'chat_id' => $data['message']['chat']['id'],
            'text' => str_replace("{%username%}", $name, $this->helloText),
            'parse_mode' => 'html'
        ]
    );
  • Artem [2 года назад → iMakeBots]

    спасибо) будем пробовать. То есть если я передам с этим параметром сообщение - телеграм интерпретирует мой текст как форматированный?

  • iMakeBots [2 года назад → Artem]

    Да, только по их правилам форматирования.

  • Christina Soroka [2 года назад]

    Куда вставлять этот крд

  • iMakeBots [2 года назад → Christina Soroka]

    Не совсем понятен вопрос.
    Загружайте на хостинг, настраивайте вебхук, добавляйте бота в группу.

  • Аlex [2 года назад]

    Настроил WebHook, создал php файл с кодом бота, добавил бота в группу. Ничего не происходит при входе нового участника.

  • iMakeBots [2 года назад → Аlex]

    Посмотрите логи на сервере и в Телеграм getWebhookInfo

  • Сергей Тест [1 год назад]

    Здравствуйте! Подскажите, пожалуйста, доступен ли этот способ не для группы, а для канала?

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

  • VLADMIR GABDULLIN [1 год назад]

    Кому то удалось запустить бота? Не понимаю, как этот бот интегрируется в группу, как он обрабатывает новых пользователей, точнее, как он их видит то, ему никто не говорит, что следи именно за этой группой, а не за тем, кто тебя активирует?

  • VLADMIR GABDULLIN [1 год назад → VLADMIR GABDULLIN]

    Решил, бдагодарю 

  • 5reelancer [2 месяца назад]

    Здравствуйте, подскажите пожалуйста, как мне собрать этот код и запустить бота?

  • iMakeBots [2 месяца назад → 5reelancer]

    Код собран, его надо разместить на хостинге например и настроить на него вебхук бота