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

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

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

Для этого запускаем телеграмм, и ищем пользователя @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:


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

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

Все)

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 года!

Уведомления с MODX в Telegram: 21 комментарий

  1. Может кому пригодится допиленный код который указывает название страницы и 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 и форма остается висеть неочищенная на странице.

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

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

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

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

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

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

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

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Exit mobile version