Отправка сообщения в Telegram в MODx Revo

Сегодня нам хотелось бы вам рассказать, как связать MODx с Telegram. Рассказ будет на основе связки AjaxForm с FormIt. Но любой может адаптировать код по своему и присылать сообщения в телеграм по любому событию в MODx Revo.

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

https://api.telegram.org/bot[token]/getUpdates

, где [token] — это тот токен, который вы получили при создании бота. На данной странице вы увидите JSON код, в котором вам необходимо найти следующую строчку: «chat»:{«id»:<chat_id>"}, где <chat_id> — это идентификатор чата, который нам понадобится в дальнейшем.

Отлично! Теперь у нас есть токен и идентификатор чата и мы можем приступить к написанию сниппета, который будет hook’ом для FormIt:

<?php
$token = "<token>";
$chat_id = "<chat_id>";

$values = $hook->getValues();

// Получаем название формы
$formName = $modx->getOption('formName', $formit->config, 'form-'.$modx->resource->get('id'));

// Получаем ip адрес отправителя
$ip = $modx->getOption('REMOTE_ADDR', $_SERVER, '');

// Берем данные с формы
$name = $values['name'];
$phone = $values['phone'];
$email = $values['email'];
$subject = $values['subject'];
$text = $values['text'];

// Создаем массив данных
$arr = array(
"Название формы" => $formName,
"IP" => $ip,
"Имя" => $name);

if($phone){
	$arr["Телефон"] = $phone;
}

if($email){
	$arr["Email"] = $email;
}

if($subject){
	$arr["Тема сообщения"] = $subject;
}

if($text){
	$arr["Текст сообщения"] = $text;
}

$txt = '<b>Заполнена форма - '.$formName."</b>\n";
// Цикл по массиву (собираем сообщение)
foreach($arr as $key => $value) { 
     $txt .= "<b>".$key."</b>: ".$value." \n"; 
  }

// Отправляем сообщение посредством cURL
$website="https://api.telegram.org/bot".$token;
$params=[
    'chat_id' => $chat_id,
    'text' => $txt,
	'parse_mode' => 'html'
];
$ch = curl_init($website . '/sendMessage');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ($params));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
$modx->log(MODX_LOG_LEVEL_ERROR, $result);
curl_close($ch);

//Возвращаем true – это особенность написания хуков для FormIt.
return true;

Хук у нас написан! Теперь вызовем его при инициализации FormIt:

[[!AjaxForm?
	&snippet=`FormIt`
	&form=`contactFormTpl`
	&hooks=`spam,email,FormItSaveForm,telegrambot`
	&emailTpl=`contactEmailTpl`
	&emailSubject=`Вам сообщение с сайта [[++site_name]]`
	&emailTo=`info@dart.agency`
	&emailFrom=`noreply@dart.agency`
	&formName=`Сообщение с сайта`
	&validate=`name:required,email:required,text:required,user:blank,username:blank,captcha:blank`
]]

Теперь вы получите не только email сообщение, но и сообщение в Telegram от бота.

telegram api php modx revo

Отправка сообщения в Telegram в MODx Revo

0 Число голосов: 13
4
5
1
13

Комментарии ()

  1. DATE 07 апреля 2018, 21:52 # 0
    Как указать 2 chat_id
    1. Андрей 22 ноября 2019, 15:42 # 0
      Вы разобрались, как отправлять в несколько чатов?
      1. Виктор 01 августа 2021, 14:59(Комментарий был изменён) # 0
        Поддерживаю вопрос
        Получилось сделать, скопировав сниппет. Но, наверное, есть решение поизящнее
        1. Ринат 09 апреля 2023, 12:15 # 0
          Писать цикл который будет по очереди отсылать.И простое, создать групповой чат:1. Сделать его общедоступным2. Добавить туда бота в администраторы например3. Далее гуглим «Как узнать ID чата телеграмм», через ботов и пересылки сообщений можно узнать.4. Вписываем ID чата в chat_id через знак минуса (-3241234324).5. Делаем чат приватным.
        2. Андрей 06 ноября 2019, 16:52 # 0
          Как узнать chat_id бота? Ссылка api.telegram.org/bot/getUpdates не работает.
          1. Виктор 01 августа 2021, 14:26(Комментарий был изменён) # 0
            У меня ссылка работает. После «bot» нужно добавить ID бота:
            api.telegram.org/bot0000-0000-0000-0000/getUpdates

            Видимо, верстка съела слово «token» из примера ссылки

            Ну и предварительно что-то черкануть в чат боту, как и написано в статье
          2. Андрей 27 ноября 2019, 13:14 # 0
            Ответа не дождался. В итоге поступил таким образом:1) Создал бота и сниппет по инструкции, как написал автор.2) Создал беседу в Телеграм и добавил туда людей.3) В $chat_id указал id этой беседы. Она будет со знаком минус, типа такого: "-123456"Готово)
            1. Oleg 24 сентября 2021, 11:23(Комментарий был изменён) # 0
              Вы можете подсказать, для Viber это должно работать похожим образом? или нельзя отправлять сообщения из formit — в viber? Может быть у вас есть пример скрипта для viber
              1. Петропавловский Артем 24 сентября 2021, 11:48 # 0
                Попробуйте REST API
              2. Виталик 05 ноября 2021, 12:14 # 0
                Автор удаляет коментарии, не работает его творение.
                1. Петропавловский Артем 05 ноября 2021, 16:05 # 0
                  Решение рабочее и у людей выше получилось. Если вы не можете посмотреть в логи и выяснить из-за чего выводится ошибка, почитать документацию к API Telegram, а выманиваете уже полностью рабочее решение, забыв об элементарных нормах приличия, мне вам помочь не чем. Меняйте свой подход в общении с другими людьми.
                2. Виталий 01 декабря 2021, 15:22 # 0
                  Все прекрасно работает, проверено не на одном сайте. Артём, подскажите, пожалуйста, как получить и отправить массив инпутов
                  '+input[]'
                  ?В сообщении выводит просто слово Array…Заранее благодарен за ответ!
                  1. Сергей 28 января 2022, 11:21 # 0
                    Есть ли пример как добавить в сообщение вложение, это может быть изображение или файл
                    1. Петропавловский Артем 28 января 2022, 13:53 # 0
                      У Telegram есть методы sendPhoto и sendDocument. Можно вызвать их после отправки формы.
                      1. Sergey 23 марта 2023, 21:20 # 0
                        Подскажите, как правильно прописать, если есть файл?Никакие способы не работают почему то
                    2. Иван 03 октября 2022, 09:23 # 0
                      Добрый день подскажите где прописать Хук при инициализации FormIt?
                      1. Петропавловский Артем 03 октября 2022, 09:53 # 0
                        В параметре &hooks
                      2. Олег 08 января 2023, 10:03 # 0
                        Добрый день. Можно как-то сделать такой hook для формы отзывов ecForm?
                        1. Петропавловский Артем 09 января 2023, 11:06 # 0
                          Вы можете использовать плагин для этого на событие OnEcMessageSave:
                          <?php
                          
                          switch($modx->event->name){
                          		
                          	case 'OnEcMessageSave':
                          		if($object){
                          			$data = $object->toArray();
                          			$time = time();
                          			$newMessage = 5;
                          			$createdon = strtotime($object->get("createdon")) + $newMessage;
                          			if ($createdon > $time) {
                          				// если сообщение новое то дальше отправляем в телеграм
                          			}
                          		}
                          		break;
                          }
                          
                        2. Любовь 24 мая 2023, 10:29 # 0
                          Подскажите, пожалуйста. Сделала бота по вашей статье. Всё работает — в чат сообщения приходят. Но мне нужно, чтобы заказчик, добавив этот же чат себе в телеграм, тоже видел всё, что туда приходит. Но он не видит почему-то. У него там пусто, только /start написано. Попросила написать любые сообщения туда (думала, может так активируется), но нет — тоже пусто.Что с этим можно сделать?
                          1. YanaShine 22 октября 2023, 11:52 # 0
                            По сути можно сделать массив чатов куда будет высылаться сообщения
                            $token = "";
                            $chat_ids = "chat_id_1,chat_id_2,chat_id_3"; // Замените на фактические ID чатов, перечисленные через запятую
                            
                            $values = $hook->getValues();
                            
                            // Остальной код остается таким же
                            
                            // Разбиваем строку с ID чатов на массив
                            $chat_ids = explode(",", $chat_ids);
                            
                            // Отправляем сообщение в каждый чат
                            $website = "https://api.telegram.org/bot".$token;
                            foreach ($chat_ids as $chat_id) {
                                $params = [
                                    'chat_id' => trim($chat_id), // Удаляем лишние пробелы
                                    'text' => $txt,
                                    'parse_mode' => 'html'
                                ];
                                $ch = curl_init($website . '/sendMessage');
                                curl_setopt($ch, CURLOPT_HEADER, false);
                                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                                curl_setopt($ch, CURLOPT_POST, 1);
                                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
                                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                                $result = curl_exec($ch);
                                $modx->log(MODX_LOG_LEVEL_ERROR, $result);
                                curl_close($ch);
                            }
                            
                            //Возвращаем true – это особенность написания хуков для FormIt.
                            return true;
                          2. YanaShine 22 октября 2023, 11:15(Комментарий был изменён) # 0
                            Может кому пригодится допиленный код который указывает название страницы и URL а так же определяет по IP страну, область и город
                            <?php
                            $token = "";
                            $chat_id = "";
                            
                            $values = $hook->getValues();
                            
                            // Получаем текущий ресурс
                            $resource = $modx->resource;
                            
                            // Получаем ссылку откуда была заполнена форма
                            $urlAdress = $modx->makeUrl($resource->get('id'));
                            
                            // Получаем название страницы откуда была заполнена форма
                            $pageTitle = $resource->get('pagetitle');
                            
                            // Получаем название формы
                            $formName = $modx->getOption('formName', $formit->config, 'form-'.$modx->resource->get('id'));
                            
                            // Получаем ip адрес отправителя
                            $ip = $modx->getOption('REMOTE_ADDR', $_SERVER, '');
                            
                            // Функция для получения информации о стране и регионе по IP
                            function getCountryAndRegion($ip) {
                                $ipInfo = file_get_contents("https://ipinfo.io/{$ip}/json");
                                $ipData = json_decode($ipInfo, true);
                                return $ipData;
                            }
                            
                            $ipData = getCountryAndRegion($ip);
                            $country = $ipData['country'] ?? 'Unknown'; // Страна
                            $region = $ipData['region'] ?? 'Unknown';   // Регион
                            $city = $ipData['city'] ?? 'Unknown';   // Город
                            
                            // Берем данные с формы
                            $fio = $values['fio'];
                            $phone = $values['phone'];
                            $email = $values['email'];
                            $message = $values['message'];
                            
                            // Создаем массив данных
                            $arr = array(
                                "URL страницы" => 'https://mebel-murom33.ru/' . $urlAdress,
                                "IP" => "$ip ($country, $region, $city)",
                                "Имя" => $fio
                            );
                            
                            if($phone){
                                $arr["Телефон"] = $phone;
                            }
                            
                            if($email){
                                $arr["Email"] = $email;
                            }
                            
                            if($message){
                                $arr["Текст сообщения"] = $message;
                            }
                            
                            $txt = '<strong>Заявка со страницы - '.$pageTitle."</strong>\n";
                            // Цикл по массиву (собираем сообщение)
                            foreach($arr as $key => $value) {
                                $txt .= "<strong>".$key."</strong>: ".$value." \n";
                            }
                            
                            // Отправляем сообщение посредством cURL
                            $website = "https://api.telegram.org/bot".$token;
                            $params = [
                                'chat_id' => $chat_id,
                                'text' => $txt,
                                'parse_mode' => 'html'
                            ];
                            $ch = curl_init($website . '/sendMessage');
                            curl_setopt($ch, CURLOPT_HEADER, false);
                            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                            curl_setopt($ch, CURLOPT_POST, 1);
                            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
                            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                            $result = curl_exec($ch);
                            $modx->log(MODX_LOG_LEVEL_ERROR, $result);
                            curl_close($ch);
                            
                            //Возвращаем true – это особенность написания хуков для FormIt.
                            return true;
                            1. kotolehka 28 февраля 2024, 23:30 # 0
                              Спасибо. Все работает! И геолокацию определяет) Шикарно!
                              1. Петропавловский Артем 29 февраля 2024, 11:40 # 0
                                Сейчас есть компонент для этих целей. Если нужно добавить туда определение геолокации, то напишите в Issue на Github

                              Наши клиенты

                              Многие компании уже доверяют нам. Будьте в их числе!

                              Хотите реализовать проект?

                              Контакты

                              Напишите нам - мы расскажем вам много интересного!


                              Пермь, ул. Крупской 34, офис 510