Создание бота
Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный 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(' ', ' ', $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;
}
}
?>