Уведомления с MODX в Telegram

Уведомления с MODX в Telegram MODX Revo
В данном уроке разберем, как настроить отправку различных уведомлений в Telegram из MODX: отправка форм, заказов, редактирование ресурсов.

Заводим себе бота

Для этого запускаем телеграмм, и ищем пользователя @botfather, выбираем его и запускаем, набрав /start и Enter (если работаете c ПК) или отправить. После чего должны прийти все доступные команды. Для создания нового бота, выбираем (/newbot).

Создание нового бота

После чего botFather попросит нас ввести название бота (Alright, a new bot. How are we going to call it? Please choose a name for your bot.). Я написал (web-revenue). Вводите свое имя и отправляете.

Потом botFather попросит ввести имя пользователя (Username). Username должен заканчиваться на Bot или _bot. Это то имя, по которому можно будет этого бота найти (в моем случае @webrev_bot). Вводите и отправляете.

После этого всего должно прийти сообщение о создании бота с токеном. Он то нам и нужен, запишите его.

Вводите свое имя и отправляете.

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

Запускаем своего бота

Теперь нам нужно узнать ID бота, для этого, заходим по ссылке:

https://api.telegram.org/bot<bot_token>/getUpdates

где <bot_token> — тот самый токен который мы получили ранее (Use this token to access the HTTP API: токен).

Там подсматриваем свой id:

Смотрим ID бота
Записываем его рядом с токеном) Теперь у нас есть все необходимые данные чтобы можно было отправлять уведомления в телегу, например подставляя текст в ссылку:

https://api.telegram.org/bot<bot_token>/sendMessage?chat_id=<id>&text=<text>

Отправка сообщений с FormIt + AjaxForm в Telegram

Для того чтобы дублировать сообщения с AjaxForm (в связке с FormIt), на просто FormIt не тестировал, необходимо написать хук и добавить его в вызовы форм!

Создаем сниппет с именем sendMessageTelegram (это и есть хук) со следующим кодом:

<?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'];
$message = $values['message'];

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

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

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

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

$txt = '<strong>Заполнена форма - '.$formName."</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, ($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;

Здесь вам нужно вписать вместо <token> — свой токен, <chat_id> — id чата бота.

Где берем данные с формы и создаем массив указываются названия полей (из формы или форм) и их расшифровка.

Заполняем хук

Важно! В данном хуке использует синтаксис fenom, по этому у вас обязательно должен быть установлен компонент PdoTools и должны быть включены настройки pdotools_fenom_default и pdotools_fenom_modx.

Теперь подключаем наш хук к вызову формы, пример:

[[!AjaxForm?
                        &form=`tpl.AjaxForm.kon`
                        &snippet=`FormIt`
                        &hooks=`email,sendMessageTelegram`
                        &emailSubject=`Обратная связь с сайта [[++site_name]]`
                        &emailTo=`[[++emailsender]]`
                        &emailFrom=`info@site.ru`
                        &emailTpl=`tpl.email.o`
                        &validationErrorMessage=`В форме содержатся ошибки!`
                        &successMessage=`Спасибо за вашу заявку! В ближайшее время с Вами свяжется наш специалист.`
                    ]]

После чего можно попробовать отправить тестовое сообщение, делать это лучше в режиме инкогнито. Если все сделали правильно, форма прилетит в телегу боту.

Результат работы бота

Уведомления о заказах из MiniShop2 в Telegram

Устанавливаем с репозитория modstore бесплатно дополнение msTelegram. После чего идете в системные настройки, там есть 2 опции:

  • mstelegram_token, сюда вводим токен.
  • mstelegram_recepients, сюда вводим id чатов, кто будет получать уведомления.

И проверяем чтобы плагин был повешен на событие msOnCreateOrder

msOnCreateOrder

Все)

MODX — уведомления об обновлениях ресурсов

К примеру у вас есть проект на котором копирайтеры , журналисты или к примеру SEO специалисты наполняют сайт и вы хотите быть в курсе, что вам публикуют. Тогда создайте плагин, с именем telegram со следующим кодом:

<?php
$title= $resource->get('pagetitle');
$alias= $resource->get('uri');

if ($resource->get('published') == "1")  {

$fp=fopen("https://api.telegram.org/bot<bot_token>/sendMessage?chat_id=<id>&text={$title} http://site.info/{$alias}","r"); 
while(!feof($fp)) 
{  $content .= fread($fp,1024); } 
fclose($fp); };

Не забудьте в коде поставить свой токен и id, после чего вешаем плагин на системные события, например такие:

Системные события публикаций ресурсов и тикетов

И пользуемся) Надеюсь информация для вас является полезной!

Поделиться с друзьями
Алексей

Веб-дизайнер и SEO оптимизатор. Занимаюсь созданием сайтов с 2010 года и их продвижение с 2012 года!

Оцените автора
( 2 оценки, среднее 5 из 5 )
Web-Revenue.ru
Добавить комментарий

  1. YanaShine

    Может кому пригодится допиленный код который указывает название страницы и URL а так же определяет по IP страну и область и город

    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 = ‘Заявка со страницы — ‘.$pageTitle.»\n»;
    // Цикл по массиву (собираем сообщение)
    foreach($arr as $key => $value) {
    $txt .= ««.$key.»: «.$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;

    Ответить
  2. Тимур

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

    Ответить
    1. Алексей автор

      Создайте чат с нужными людьми, добавьте туда бота и получайте. В скрипте чатов $chat_id нужно указывать через минус (по моему, давно дело было уже не помню).

      Ответить
  3. Константин

    Здравствуйте. Не удается просмотреть id: {«ok»:false,»error_code»:409,»description»:»Conflict: can’t use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first»}

    Как решить? Заранее спасибо!

    Ответить
    1. Алексей автор

      Здравствуйте, делал на клиентском сайте, вроде не жалуются, доступа к нему сейчас нет. Так что не подскажу

      Ответить
  4. Любовь

    Ещё возник вопрос. Бота делала для сайта, соответственно в него вся информация из форм приходит. Но пришло время отдать всё заказчику, он добавил себе бота, но не видит сообщений. Попадалась информация, что нужно создать канал или группу в телеге и добавить туда бота. Сделала и то и другое, но сообщения из бота не поступают ни в канал, ни в группу. Кто-то может подсказать рабочий вариант?

    Ответить
  5. Егор

    Спасибо за хорошую и полезную инструкцию.
    Вопрос такой. После отправки FormIt + AjaxForm все приходит и на почту и в телегу, но после отправки сообщение подтверждение не появляется и в консоли 504 ошибка появляется на action.php у AjaxForm и форма остается висеть неочищенная на странице.

    Ответить
    1. Алексей автор

      Пожалуйста. У меня такой проблемы не было

      Ответить
  6. Amsterdam

    А как отправлять сообщение от бота, например, двум пользователям, которые добавили себя бота? Перечислить id пользователей через запятую не работает..

    Ответить
    1. Алексей автор

      Если не ошибаюсь также id чата, только через знак минус) -5 к примеру)

      Ответить
      1. Ринат

        Не помогло((

        Ответить
    2. Любовь

      Удалось найти решение?

      Ответить
  7. Amsterdam

    Хотя, id бота это первые цифры токена, сервис для его вычисления не нужен)

    Ответить
  8. Amsterdam

    Не выводит никакую информацию в браузере при попытке получить id бота https://api.telegram.org/bot/getUpdates

    Просто отдает пустой результат {«ok»:true,»result»:[]}

    Ответить
    1. Алексей автор

      Нужно https://api.telegram.org/botЗДЕСЬ_ТОКЕН/getUpdates

      Ответить
      1. Amsterdam

        Так я и делал, конечно же. Попробуйте сами, не выведет id. Но, если и вставить id нашего же бота, от имени которого отправляем сообщение, выдает следующее: {«ok»:false,»error_code»:403,»description»:»Forbidden: bot can’t send messages to bots»}

        То есть не хочет отправлять сообщение самому себе, и ботам в целом, видимо

        Ответить
    2. Любовь

      У меня также. В итоге удалось решить вопрос?

      Ответить
    3. Любовь

      Я невнимательно прочитала (слова «что-нибудь написать боту» пропустила). Как только написала, ссылка заработала и удалось выяснить id.

      Ответить
      1. Алексей автор

        Бывает) Как говорится дьявол кроется в деталях)

        Ответить
  9. Илья

    Осталось найти нормальное решение для антиспама

    Ответить
    1. Алексей автор

      Попробуйте что-то из этого https://web-revenue.ru/modx-revo/kak-izbavitsya-ot-spama-s-formit-ajaxform

      Ответить