Оглавление
Проблема
Нужно автоматизировать публикацию постов, новостей или каких-либо других периодически появляющихся материалов с сайта в телеграм-канал.Решение
Общая схема выглядит следующим образом:- Создаём канал
- Создаём бота с правами администратора на канал
- Получаем API клюк для того чтобы выполнять запросы к сервисам телеграм и использовать бота для управления каналом
- Получение материалов и публикация ссылки в канал
Создаём телеграм канал
Тут всё просто. Ставим приложение на ПК (так удобнее) Telegram Desktop, авторизуемся. И создаём канал через меню профиля.Указываем название и описание канала.
Меняем тип канала на публичный и задаём уникальную ссылку. Телеграм подскажет доступна ли эта ссылка или нет.
Создаём бота для управления телеграм каналом
Ищем специального бота @BotFather через приложение. Жмём кнопку "Запустить" или вводим команду сообщением/start
. Бот ответит и выдаст инструкцию с командами и их описанием.Выбираем команду
/newbot
, вам будет предложено ввести имя и уникальный ник бота по которому его можно будет найти в telegram.Я указал имя «it-svalka.ru бот» и ник «
itsvalkaru_bot
». Обратите внимание что ник бота должен оканчиваться словом bot.Если всё хорошо, @BotFather пришлёт вам сообщение с уникальным ключом API для дальнейшего взаимодействия с ботом через telargram api. Сохраните его для дальнейшей работы.
Теперь необходимо назначить созданного бота администратором нашего канала. Для этого перейдите в настройки канала, пункт «Управление каналом»
Выбираем пункт «Администраторы»
Жмём кнопку «Добавить администратора»
И находим нашего бота
itsvalkaru_bot
. В следующем окне оставляем стандартные настройки прав.И сохраняем настройки канала.
Работаем с telagram-ботом через API
В самом простом варианте нам потребуется несколько функций помещённых в init.php сайта. Список функций будет примерно такой:- sendTelegramPost() - непосредственно отправка данных в канал
- Обработчик события создания нового элемента инфоблока
- ID канала
- 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 для вывода ссылки на пост. Если всё ок, то вы увидите новое сообщение в вашем телеграм-канале