• статья
  • pantey

Drupal 8 – Отправка результатов заполнения формы в чат Telegram

30.08.2017

Популярные мессенджеры уже полностью внедрились нашу повседневную жизнь и следовательно все больше внимания привлекают разработчиков. Некоторым людям уже не достаточно собирать заказы с сайта с оповещением на Email адрес – они хотят дублировать его еще и себе в мессенджер.

На данный момент отправка сообщений в мессенджер, в открытом доступе, реализован только у Telegram. Естественно другие мессенджеры Viber и WhatsApp, так же имеют свои API, но доступ к ним предоставлен только крупным компаниям.

Сегодня мы на конкретном примере разберем, как можно отправить результаты заполнения себе в чат Telegram. В качестве подопытной формы будем использовать стандартную форму обратной связи.

Drupal_8_send_notification_telegram.png

Данная форма имеет 4 поля:

  • Ваше имя
  • Ваш адрес электронной почты
  • Тема
  • Сообщение

Значения, которых мы и будем дублировать в чат Telegram.

Итак, для возможности получать Telegram наши сообщения нам необходимо создать своего бота.

Создание бота Telegram

Хочу заметить, что я выставляю скриншоты в том виде, которые были созданы в процессе работы с данным ботом. В последствии данный бот был удален, так что не пытайтесь использовать токен и ID чат указанные на скриншотах в данной статье.

Бот создается очень просто, всё, что вам нужно – это найти в поиске бота @BotFather:

Drupal_8_send_notification_telegram_1.png

Далее ввести команду боту /start или же нажать на кнопку START.

Drupal_8_send_notification_telegram_2.png

После чего, бот вам покажет список всех возможных команд.

Drupal_8_send_notification_telegram_3.png

Нас интересует команда /newbot, которая поможет создать бота. Вводим данную команду, после чего он попросит ввести имя бота.

Хочу заметить, что имя бота должно заканчиваться на _bot. В противном случае, он попросит изменить имя для создаваемого бота.

Drupal_8_send_notification_telegram_4.png

После того, как вы задали правильное имя, в ответном сообщении вам придет текст с поздравлениями и токен для доступа к вашему боту. Данный токен нам понадобится, поэтому сохраните его себе.

Drupal_8_send_notification_telegram_5.png

Далее нам необходимо получить ID чата, т.е. что бы сообщение приходило именно вам. Для получения ID чата - первоначально напишите любое сообщение вашему созданному боту, тем самым вы инициализируете чат с вашим ботом. После чего необходимо пройти поURL, которое строится по шаблону

https://api.telegram.org/bot<token>/getUpdates

Где:

  • <token> - это ваш уникальный токен, который был вам дан при создании бота. (Я просил вас себе его сохранить)

При переходе по указанному URL вы получите ответ в JSON формате, где нас интересует объект chat и в нем объект id

Drupal_8_send_notification_telegram_6.png

Так же сохраняем его себе. На этом с созданием бота мы закончили, теперь переходим к программной части.

Хочу заметить, что Telegram Bot Api имеет достаточное кол-во методов, с которыми можно ознакомиться на официальном ресурсе

Отправка сообщения из формы в Telegram

Как всегда, все действия будем реализовывать в модуле, в моем случае он будет называться – telegram_notification.

name: Telegram Notification
description: Пример отправки результата заполнения формы в чат Telegram
core: 8.x
type: module

Как вы наверное уже поняли, мы будет писать дополнительный callback для кнопки формы «Отправить сообщение».

Файл telegram_notification.module

<?php

/**
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @param $form
 * Implements hook_form_FORM_ID_alter()
 */
function telegram_notification_form_contact_message_feedback_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id){
  $form['actions']['submit']['#submit'][] = '_telegram_notification_form_submit';
}

/**
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * Callback telegram_notification
 */
function _telegram_notification_form_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state){

  # Telegram data
  $telegram_token = 'bot'; // Ваш токен, который строится по шаблону bot+token
  $telegram_id_chat = '';  // ID чата

  if(!empty($telegram_token) && !empty($telegram_id_chat)){
    # Form data
    $data = $form_state->getValues();
    $data_result = array(
      'name'    => '<b>Имя:</b> ' .$data['name'],
      'email'   => '<b>Email:</b> ' .$data['mail'],
      'title'   => '<b>Тема:</b> ' .$data['subject'][0]['value'],
      'message' => '<b>Сообщение:</b> ' .$data['message'][0]['value']
    );

    # Send message
    $message = implode($data_result, '%0A');
    $send_message = fopen("https://api.telegram.org/{$telegram_token}/sendMessage?chat_id={$telegram_id_chat}&parse_mode=html&text={$message}","r");

    if($send_message){
      drupal_set_message('Сообщение успешно отправлено в Telegram');
    }else{
      drupal_set_message('Сообщение не отправлено в Telegram', 'error');
    }
  }else{
    drupal_set_message('Сообщение не возможно отправить, отсутсвует toke или id_chat', 'error');
  }

}

По коду вы можете видеть что переменные:

  • $telegram_token – содержит токен бота
  • $telegram_id_chat – содержит ID чат

Для того, что бы отправить сообщение боту, достаточно перейти по URL, который строится по шаблону:

https://api.telegram.org/bot<token>/sendMessage?chat_id=<chat_id>&text=<text>

Хочу заметить, что токен должен начинаться со слов bot.

Далее активируем модуль и смотрим все ли у нас работает:

Drupal_8_send_notification_telegram_7.png

На этом думаю можно закончить.

Скачать используемый в примере модуле

Скачать

-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (8)

Profile picture for user 1541
Anton
05.12.2017

Спасибо за материал! Полезно. 

По Viber уже упростили создание ботов.

Profile picture for user pantey
pantey
08.12.2017

отлично !

Profile picture for user 1541
Артём
02.02.2019

Подскажите пожалуйста, как таким же образом получать данные со страницы созданного мной типа (на подобии Article), чтобы также их отправлять?

Profile picture for user 1541
Алекс Крутов
11.12.2017

Вау! Очень прошу вас сделайте пожалуйста для Drupal 7 - очень нужно

Profile picture for user 1541
Артём
02.02.2019

Подскажите пожалуйста, как таким же образом получать данные со страницы созданного мной типа (на подобии Article), чтобы также их отправлять?

Profile picture for user 1541
Я
02.04.2019

Благодарю за статью!

Поскажите как сделать чтобы вебформа contact тоже отправляла в телеграм?

Profile picture for user 1541
Альберт
18.07.2019

Пожалуйста, сделайте решение на Drupal 7 !

Profile picture for user Oleg
Oleg
16.08.2019

Поддерживаю. Очень надо.