Простой бот для приветствия пользователя в группе Телеграм - 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;
    }
}
?>

Комментарии

Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте бот @SiteAuthBot, нажмите кнопку Старт/Start. Следуйте инструкциям бота.


  • На Node.JS и Telegraf это делается в несколько строчек кода.
    Oleg Oskolsky 06.07.2018 в 12:00
    • Олег, рад вас видеть!
      Даже не сомневаюсь в возможностях Node.JS и тем более Telegraf - по сути это же полноценный фреймворк для разработки Telegram Bot.

      Если вы поделитесь своими знаниями, буду очень благодарен, ведь у вас в части разработки ботов Телеграм опыта много (стараюсь следить за вашим творчеством).
      iMakeBots 06.07.2018 в 14:23
  • На пхп я сделаю точно такую на человека понятном языке и без каких либо затруднений и кодов
    ⁠⁠⁠⁠⁠ ⁠⁠⁠⁠⁠TIΜΞ 09.08.2018 в 07:05
    • Просим, поделитесь знаниями.
      iMakeBots 09.08.2018 в 07:15
  • Assalomu alaykum
    09:16 🇺🇿 ℑᵃᵛᵒʰⁱℜ 🇷🇺07:16 06.05.2019 в 07:23
  • Добрый день, а как включить форматирование для приветственного сообщения: маркдаун, например?
    Artem 15.12.2019 в 11:36
    • Можете добавить в массив данных параметр parse_mode

                  $this-&gt;botApiQuery(&quot;sendMessage&quot;, [<br />
                          'chat_id' =&gt; $data['message']['chat']['id'],<br />
                          'text' =&gt; str_replace(&quot;{%username%}&quot;, $name, $this-&gt;helloText),<br />
                          'parse_mode' =&gt; 'html'<br />
                      ]<br />
                  );
      iMakeBots 15.12.2019 в 11:41
      • спасибо) будем пробовать. То есть если я передам с этим параметром сообщение - телеграм интерпретирует мой текст как форматированный?
        Artem 15.12.2019 в 13:51
        • Да, только по их правилам форматирования.
          iMakeBots 15.12.2019 в 13:52