Уведомление о новых постах через Telegram Channel на Drupal 7
21.06.16 12:49

Подписка по почте и rss - это неплохие вещи, но моему извращенному вкусу захотелось, чтобы извещение о новых постах приходили в групповой чат телеграмма.
Для этого был написан модуль, который использует telegram bot api для отправки новых уведомлений в наш чат. Модуль получился довольно простой. Буду рад адекватным предложениям по допилу :)

Ссылка на источник - http://lib365.ru/drupal-7/3

1. Создаем Telegram Bot

Прежде всего нам требуется создать Telegram Bot. Можно почитать как это делается на официальном сайте или посмотреть статью на русском языке от Blizzy. Вкратце опишу процесс регистрации нового бота:

  • Вводим в поиске Telegram @BotFather нажимаем кнопку "Start"
  • Выполняем команду /newbot и задаем имя бота
  • Вводим и отправляем наш "username" (обязательно в конце должно присутствовать слово "bot")
  • Если все выполнено правильно, Telegram вернет "token to access". Запомните его, он нам пригодится.

2. Создаем Telegram Chat

Переходим в desctop версию Telegram и создаем новый channel:

i1

Заполняем данные:

i

i

Переходим в настройки чата и добавляем нашего созданного бота в админы:

i

i

На этом подготовительные процедуры закончены. Переходим непосредственно к модулю.

3. Telegram Chat модуль для Drupal 7
Модуль состоит из таких файлов:

telegram_item.info - описание
telegram_item.install - очистка таблицы от переменных модуля
telegram_item.module - основная логика работы
telegram_item_config.inc - страница администрирования
telegram_item.forms.inc - дополнительные элементы формы
C telegram_item.info, telegram_item.install, telegram_item_config.inc в принципе все понятно и это банальные вещи. (Если все-же возникли вопросы - пишите).

Разберем telegram_item.module:

<?php/**
 * Implements hook_module_implements_alter().
 * Перемещаем hook_insert нашего модуля в самый низ (после модуля pathauto)
 * Это нужно, чтобы получить alias для url ноды через модуль pathauto
 */
function telegram_item_module_implements_alter(&$implementations$hook) {
  
$module basename(__FILE__'.module');
  if(!empty(
$implementations[$module])){
    
$group $implementations[$module];
    unset(
$implementations[$module]);
    
$implementations[$module] = $group;
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 * Присоединяем наши элементы формы к форме ноды
 */
function telegram_item_form_node_form_alter(&$form, &$form_state) {
  if (empty(
$form['#node']->type)) {
    return;
  }
  
// проверяем, имеет ли пользователь право на публикацию в Telegram
  
$user_access user_access('telegram send message');

  if (

$user_access) {
    
// дополняем форму добавления/редактирования ноды
    
form_load_include($form_state'forms.inc''telegram_item');
    
__telegram_item_process_node_form($form);
  }
}

/**
 * Implements hook_node_insert().
 */
function telegram_item_node_insert($node) {
  
__telegram_item_process_node($node);
}

/**
 * Implements hook_node_update().
 */
function telegram_item_node_update($node) {
  
__telegram_item_process_node($node);
}

/**
 * Функция отправки сообщения в Telegram channel
 */
function __telegram_item_process_node($node) {
  
$apikey variable_get('telegram_item_apikey');
  
$channel variable_get('telegram_item_channel_name');
  
$user_access user_access('telegram send message');
  
  
// проверяем, стоит ли отметка публикации ноды в Telegram
  
$post_node = isset($node->telegram_item_post_this_node) ? $node->telegram_item_post_this_node FALSE;

  if (

$apikey && $channel && $user_access && $post_node) {
    global 
$base_url;
    
// добавляем заголовок
    
$message $node->title "\r\n";

    

// добавляем url ноды
    
$message .= $base_url '/' drupal_get_path_alias('node/' $node->nid);

    

$message urlencode($message);
    
__telegram_item_send_message($message$apikey$channel);
  }
}

function 

__telegram_item_send_message($message$apikey$channel) {
  
// составляем запрос по всем правилам Telegram api
  
$query "https://api.telegram.org/bot" $apikey .
    
"/sendMessage?disable_web_page_preview=true&chat_id=" $channel .
    
"&text=" $message;

  

// выполняем наш запрос через curl
  
$curl curl_init();
  
curl_setopt($curlCURLOPT_URL$query);
  
curl_setopt($curlCURLOPT_RETURNTRANSFERTRUE);
  
curl_setopt($curlCURLOPT_HEADER0);
  
curl_exec($curl);
  
curl_close($curl);
}
?>

Как видите, все довольно банально. Самый смак в функции "__telegram_item_send_message($message, $apikey, $channel)".
Рассмотрим файл telegram_item.forms.inc, который дополняет нашу форму добавления/редактирования ноды:

<?php

/**
 * Добавляем чекбокс, который будет указывать стоит ли отсылать сообщение
 */
function __telegram_item_process_node_form(&$form) {
  
// добавляем новый fieldset и задаем ему вес
  
$form['telegram_item'] = array(
    
'#type'   => 'fieldset',
    
'#title'  => t('Telegram item'),
    
'#group'  => 'additional_settings',
    
'#weight' => -11,
  );

  

$form['telegram_item']['telegram_item_post_this_node'] = array(
    
'#type'          => 'checkbox',
    
'#title'         => t('Send to Telegram'),
    
'#description'   => t('After you submit this node it will be send to Telegram.'),
  );

  

$apikey variable_get('telegram_item_apikey');
  
$channel variable_get('telegram_item_channel_name');

  

// отключаем элемент управления, если мы не настроили telegram в админке
  
if (empty($apikey) && empty($channel)) {
    
$form['telegram_item']['telegram_item_post_this_node']['#disabled']    = TRUE;
    
$form['telegram_item']['telegram_item_post_this_node']['#value']       = 0;
    
$form['telegram_item']['telegram_item_post_this_node']['#description'] =
      
t("You can't Telegram nodes until apikey or channel is empty.");
  }
}
?>

4. Telegram Chat настройка и тестирование модуля
Устанавливаем наш модуль, включаем его в админке и переходим на страницу редактирования прав доступа /admin/people/permissions. Тут выставляем права на публикацию новости в Telegram и администрированию модуля:

i

Далее, переходим в страницу конфигурирования модуля /admin/config/services/telegram-item, вводим Bot apikey, Channel name, и сохраняемся. Я подвязал уведомление на свою группу.

i

Переходим в добавление какого-либо материала и публикуем новость, предварительно отметив галочку "Send to Telegram":

i

Смотрим результат в Telegram:

i

Вот и все, друзья. Надеюсь Вам будут полезны данные наработки. Спасибо за внимание, пишите комменты, пожелания, и хорошего дня всем :)

Read Full Article