Проблема

Нужно автоматизировать публикацию постов, новостей или каких-либо других периодически появляющихся материалов с сайта в телеграм-канал.

Решение

Общая схема выглядит следующим образом:
  1. Создаём канал
  2. Создаём бота с правами администратора на канал
  3. Получаем API клюк для того чтобы выполнять запросы к сервисам телеграм и использовать бота для управления каналом
  4. Получение материалов и публикация ссылки в канал

Создаём телеграм канал

Тут всё просто. Ставим приложение на ПК (так удобнее) Telegram Desktop, авторизуемся. И создаём канал через меню профиля.

Создание канала

Указываем название и описание канала.

Настройка телеграм канала

Меняем тип канала на публичный и задаём уникальную ссылку. Телеграм подскажет доступна ли эта ссылка или нет.

Тип канала

Создаём бота для управления телеграм каналом

Ищем специального бота @BotFather через приложение.  Жмём кнопку "Запустить" или вводим команду сообщением /start. Бот ответит и выдаст инструкцию с командами и их описанием.

Создаём бота

Выбираем команду /newbot , вам будет предложено ввести имя и уникальный ник бота по которому его можно будет найти в telegram.

Указываем имя и ник бота

Я указал имя «it-svalka.ru бот» и ник «itsvalkaru_bot». Обратите внимание что ник бота должен оканчиваться словом bot.

Если всё хорошо, @BotFather пришлёт вам сообщение с уникальным ключом API для дальнейшего взаимодействия с ботом через telargram api. Сохраните его для дальнейшей работы.

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

Управление каналом

Выбираем пункт «Администраторы»

Администраторы

Жмём кнопку «Добавить администратора» 

Добавить администратора

И находим нашего бота itsvalkaru_bot . В следующем окне оставляем стандартные настройки прав.

Права администратора канала

И сохраняем настройки канала.

Работаем с telagram-ботом через API

В самом простом варианте нам потребуется несколько функций помещённых в init.php сайта. Список функций будет примерно такой:
  1. sendTelegramPost() - непосредственно отправка данных в канал
  2. Обработчик события создания нового элемента инфоблока
Так же нам потребуется пару констант:
  1. ID канала
  2. API ключ бота
Начнём с констант


//Ключ бота телеграм
define('TELEGRAM_API_KEY', 'тут ваш API ключ полученный от @BotFather');

//ID телеграм канала, тут укащываете имя вашего канала. В моём случае это @itsvalkaru
define('TELEGRAM_CHAT_ID', '@itsvalkaru');


Теперь напишем функцию отправки сообщения. Будем использовать curl php.


/**
 * Отправка данных в телеграм канал
 * @param $letterHtml
 * @return bool|string
 */
function sendTelegramPost($letterHtml){
  //Подготовка праметров запроса к telegram api
  $url = 'https://api.telegram.org/bot'. TELEGRAM_API_KEY . '/sendMessage';
  $post = 'chat_id='. TELEGRAM_CHAT_ID .'&text='. $letterHtml . '&parse_mode=markdown';

  //Выполняем запрос
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  $result = curl_exec($ch);
  curl_close($ch);

  return $result;
}



Осталось получить содержание запроса, т.е. заголовок и ссылка на пост. Всю эту информацию нужно будет указать в качестве аргумента $letterHtml функции sendTelegramPost().


/**
 * Обработка события создания элемента инфоблока
 * @param $arFields
 * @return void
 */
function addPostToTelegram(&$arFields){
  $arFilter = ['IBLOCK_ID'=>$arFields['IBLOCK_ID'], 'ID'=>$arFields['ID']];
  $res = CIBlockElement::GetList(['ID'=>'ASC'], $arFilter, false, false, ['ID', 'DETAIL_PAGE_URL']);
  while($ob = $res->GetNextElement())
  {
    $arItemFields = $ob->GetFields();
    $url = $arItemFields['DETAIL_PAGE_URL'];
  }

  $letterHtml ="[". $arFields['NAME'] ."](https://it-svalka.ru/" . $url . ")" . " - " . $arFields['PREVIEW_TEXT'];
  sendTelegramPost($letterHtml);
}

Подвешиваем обработчик на событие:


use Bitrix\Main;
$eventManager = Main\EventManager::getInstance();

//Отправка данных о новом посте в телеграм канал
$eventManager->addEventHandler('iblock', 'OnAfterIBlockElementAdd', 'addPostToTelegram');

В функцию addPostToTelegram() пришлось добавить отдельный запрос к инфоблоку, чтобы получить DETAIL_PAGE_URL для вывода ссылки на пост. Если всё ок, то вы увидите новое сообщение в вашем телеграм-канале

Вывод сообщения в канале


Другие решения
Скачать изображение средствами CURL PHP

Скачать изображение средствами CURL PHP

Как загрузить файл изображения по имеющейся в распоряжении ссылке (URL), при этом проверить его на допустимое разрешение (размер) и вес и mime-тип.

Вывод блока недавно просмотренных товаров 1С Битрикс

Вывод блока недавно просмотренных товаров 1С Битрикс

Как вывести недавно просмотренные товары в произвольном месте сайта

Установить водяной знак на изображение в 1С Битрикс

Установить водяной знак на изображение в 1С Битрикс

Как установить водяной знак на изображение на лету (перед показом пользователю), не трогая сам оригинал


Комментарии
Защита от автоматических сообщений
CAPTCHA
Введите слово на картинке