MODX: отправка новостей в Telegram-канал

Не так давно решил попробовать написать что-нибудь для Telegram, а именно — бота, который отправляет только-что опубликованные ресурсы из MODX в Telegram-канал. 

Я не буду рассказывать о том, как создавать бота для Telegram (обращайтесь к @BotFather), получать токен и так далее, а опишу непосредственно плагин для MODX Revolution. 
Если вкратце, то порядок действий примерно такой:

  1. Регистрация бота.
  2. Регистрация канала.
  3. Добавление бота в канал в качестве администратора.
  4. Получение токена бота.
  5. Создание и настройка плагина.

Создание плагина

Имя, как обычно, можно указать любое. 

<?php
$apiHost = 'https://api.telegram.org/';
$token = '434094111:AAE4lAmRwvsaFSpPNCeBfy0shK76SyE_5uU';
$chatId = '@quasiart';
// Ресурсы с этими шаблонами будут публиковаться на канале
$articlesTemplates = [4, 6, 28];
$siteUrl = $modx->getOption('site_url');
// На тот случай, когда HTTPS есть, но MODX всё равно генерирует ссылки в HTTPS
$siteUrl = str_replace('http://', 'https://', $siteUrl);
$debug = false;

/**
 * Публикация ресурсов в случае обычной публикации, 
 * публикации по расписанию и при сохранении уже опубликованного ресурса
 */
switch ($modx->event->name) {
    case 'OnDocPublished':
    case 'OnResourceAutoPublished':
    case 'OnDocFormSave':
        // При сохранении неопубликованного ресурса ничего не делать
        if ($modx->event->name === 'OnDocFormSave' && !$resource->get('published')) {
            break;
        }
        // При создании нового ресурса его идентификатор надо брать из переменной $id
        $resourceId = ($modx->event->name === 'OnDocFormSave') ? $id : $resource->get('id');
        // При создании ресурса приходится генерировать URI ресурса таким образом
        if ($modx->event->name === 'OnDocFormSave' && $mode === 'new') {
            $uri = $siteUrl.$resource->get('uri');
        } else {
            $uri = $modx->makeUrl($resourceId, '', '', 'https');
        }

        $format = 1;

        if (in_array($resource->get('template'), $articlesTemplates)) {
            switch ($format) {
                // Формат — простая ссылка
                case 0:
                    $message = $uri;
                    $apiUri = $apiHost.'bot'.$token.'/sendMessage?chat_id='.$chatId.'&parse_mode=HTML&text='.$message;
                    break;
                case 1:
                    // Формат — Изображение с подписью (заголовок, описание и ссылка)
                    // Относительный путь до изображения
                    $image = $siteUrl.$resource->getTVValue('image');
                    // На тот случай, когда HTTPS есть, но MODX всё равно генерирует ссылки в HTTPS
                    $uri = str_replace('http://', 'https://', $uri);
                    $imageCaption = urlencode(
                        $resource->get('pagetitle').
                        // "\n\n".
                        // $resource->get('description').
                        "\n\n".
                        $uri
                    );
                    $apiUri = $apiHost.'bot'.$token.'/sendPhoto?chat_id='.$chatId.'&photo='.$image.'&caption='.$imageCaption;
                    break;
                default:
                    break;
            }

            $response = file_get_contents($apiUri);

            if ($debug) {
                $modx->log(xPDO::LOG_LEVEL_ERROR, $apiUri);
                $modx->log(xPDO::LOG_LEVEL_ERROR, $response);
            }
        }
        break;
    default:
        break;
}

Привязать плагин нужно к событиям OnDocPublished, OnResourceAutoPublished и OnDocFormSave. 

В начале кода нужно указать токен для бота, chatId — псевдоним чата с собачкой в начале, а затем просто подкорректировать формат сообщений, которые будут публиковаться на канале. 

Решение проблем

Если после публикации ресурса ничего не было отправлено в канал, то присвойте переменной $debug значение true и смотрите, что записывается в журнал ошибок. 

Заключение

С помощью удобного Telegram API можно создавать море полезных дополнений для сайта. 

Если у вас есть какие-то интересные предложения или замечания по работе плагина, пишите в комментариях или мне через форму обратной связи. 

Код плагина также доступен на GitHub: https://github.com/mishantrop/quasitelegramposter

Комментарии