Создание сайтов на 1С-Битрикс

Отправка в телеграм через чат-бот

Как настроить автоматическую отправку в свой телеграм-канал с сайта на Битрикс.

Отправка в телеграм через чат-бот Как настроить автоматическую отправку в свой телеграм-канал с сайта на Битрикс.

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

Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный id, являющийся одновременно и токеном. Для этого в Telegram существует специальный бот — @BotFather.

Пишем ему /start и получаем список всех его команд. 
Первая и главная — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем.

Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение.

Добавление скрипта в init.php

<?php

AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("sendToTelegram", "OnAfterSendTelegram"));
AddEventHandler("iblock", "OnAfterIBlockElementUpdate", Array("sendToTelegram", "OnAfterSendTelegram"));

class sendToTelegram
{
  // создаем обработчик события "OnAfterIBlockElementAdd"
  function OnAfterSendTelegram(&$arFields)
  {
    // Нужный инфоблок
    if($arFields["IBLOCK_ID"] == 17):

    // Переменные
    $siteURL = 'https://***********.ru';
    // Свойство типа список для хранения метки "Отослано в телеграм"
    $propertyName = 'SENDED_TELEGRAM';
    $propertyID = 99;
    // ID выбора свойства если новость уже отослана в Телеграм
    $propertyChoiceID = 18;

    // Ключ бота телеграм
    define('TELEGRAM_API_KEY', '**********************************************');

    // ID телеграм канала
    define('TELEGRAM_CHAT_ID', '@**********');


    $sended = false;

    foreach ($arFields['PROPERTY_VALUES'][$propertyID] as $key => $value) {
      if($value['VALUE'] == $propertyChoiceID) $sended = true;
    }
    
    // Если НЕ отправлено уже в Telegram
    if (!$sended):

      // если запись добавлена
      if($arFields["ID"]>0 && $arFields['ACTIVE'] == 'Y' && time() > strtotime($arFields['ACTIVE_FROM'])) {


        function sendTelegramPost($method = 'sendMessage', $text, $photo = false, $messageID = false)
        {
          // Подготовка праметров запроса к telegram api
          $url = 'https://api.telegram.org/bot'. TELEGRAM_API_KEY . '/' . $method;
          switch ($method) {
            case 'sendMessage':
              $post = 'chat_id=' . TELEGRAM_CHAT_ID . '&text=' . $text . '&parse_mode=HTML&' . '&disable_web_page_preview=true';
              break;

            case 'sendPhoto':
              $post = 'chat_id=' . TELEGRAM_CHAT_ID . '&photo=' . $photo . '&caption=' . $text . '&parse_mode=HTML';
              break;
            
            default:
              $post = 'chat_id='. TELEGRAM_CHAT_ID .'&text='. $text . '&parse_mode=HTML';
              break;
          }

          //Выполняем запрос
          $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;
        }

        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 = $siteURL . $arItemFields['DETAIL_PAGE_URL'];
          }

          if($arFields['DETAIL_PICTURE_ID'] > 0) {
            $photoPath = $siteURL . CFile::GetPath($arFields['DETAIL_PICTURE_ID']);
            $hasPhoto = true;
          } else if($arFields['DETAIL_PICTURE']['old_file'] > 0) {
            $photoPath = $siteURL . CFile::GetPath($arFields['DETAIL_PICTURE']['old_file']);
            $hasPhoto = true;
          } else {
            $hasPhoto = false;
          }

// Caption beginning
$letterHtml .= "
<b>". $arFields['NAME'] ."</b>

<i>" . $arFields['PREVIEW_TEXT'] . "</i>

";
          $detailText = $arFields['DETAIL_TEXT'];

          $pos = strpos($detailText, '<b>Читайте также');
          if($pos !== false) {
            $detailText = substr($detailText, 0, $pos);
          }
          
          $newDetailText = strip_tags($detailText, '<b><strong><i><em><u><ins><s><strike><del><span><tg-spoiler><a><code><pre>');
          $newDetailText = preg_replace('/^\s+/m', "\n", $newDetailText);
          $newDetailText = str_replace('&nbsp;', ' ', $newDetailText);
          $newDetailText = trim($newDetailText);

          // Cutting long text
          if($hasPhoto) {
            $newLengthText = mb_strlen($letterHtml.$newDetailText. '

' . $url, 'UTF-8');
            // Max lenght for caption photo has 1024 symbols
            if($newLengthText > 1024) {
              $otherLenght = mb_strlen($letterHtml . '

' . $url, 'UTF-8');
              $newDetailText = truncate($newDetailText, 1020-$otherLenght, array('html' => true, 'ending' => '…'));
            }
          } else {
            $newLengthText = mb_strlen($newDetailText, 'UTF-8');
            if($newLengthText > 800) {
              $newDetailText = truncate($newDetailText, 600, array('html' => true, 'ending' => '…'));
            }
          }

// Add to caption detail text
$letterHtml .= $newDetailText . '

' . $url;

          if($hasPhoto) {
            // Отправляем в Telegram фото с подписью
            $ress = sendTelegramPost('sendPhoto', $letterHtml, $photoPath, false);
          } else {
            // Отправляем в Telegram текст
            $ress = sendTelegramPost('sendMessage', $letterHtml, false, false);
          }

          $decoded_json = json_decode($ress, true);

          if($decoded_json['ok'] == 1):
            // Установим новое значение для свойства SENDED_TELEGRAM
            CIBlockElement::SetPropertyValuesEx($arFields['ID'], $arFields['IBLOCK_ID'], array($propertyName => $propertyChoiceID));
          else:
            // Log errors
            // log_array($decoded_json);
          endif;
        }
        addPostToTelegram($arFields);
      }
    endif;
    endif;
  }
}

?>


Логотип SiteBERG
Изменено: 20.02.2023 17:11

Статьи

Что нужно сделать?