Обработка реакций
Если пользователь поставил или убрал реакцию у сообщения, в сценарий приходит событие telegramReaction
.
Данные о реакциях
Если событие сработало, данные о реакциях доступны в переменной $request.rawRequest.message_reaction
.
Пример данных:
{
"chat": {…},
"message_id": 97,
"user": {…},
"date": 1742384158,
"old_reaction": [
{
"type": "custom_emoji",
"custom_emoji_id": "5334564744177133218"
}
],
"new_reaction": [
{
"type": "custom_emoji",
"custom_emoji_id": "5334564744177133218"
},
{
"type": "emoji",
"emoji": "👍"
}
]
}
Здесь:
chat
— данные о чате в Telegram.message_id
— идентификатор сообщения из чата Telegram. У этого сообщения изменились реакции.user
— пользователь, который поставил или убрал реакцию.date
— Unix-время в часовом поясе UTC, когда изменились реакции.old_reaction
— массив реакций, которые были у сообщения до события.new_reaction
— массив текущих реакций у сообщения.
Эмодзи
Массивы old_reaction
и new_reaction
содержат реакции.
Пример массива:
[
{
"type": "emoji",
"emoji": "🤔"
},
{
"type": "custom_emoji",
"custom_emoji_id": "5334564744177133218"
}
]
Здесь:
-
type
— тип реакции:emoji
— стандартный эмодзи.custom_emoji
— кастомный эмодзи.
-
emoji
— символ эмодзи. Указан только для стандартных эмодзи. -
custom_emoji_id
— идентификатор кастомного эмодзи.
Использование в сценарии
В примере ниже бот отправляет сообщение об акции. Если пользователь ставит или убирает реакцию у этого сообщения, бот записывает в аналитику все текущие стандартные эмодзи на сообщении.
-
Стейт
Promo
:- Бот отправляет сообщение об акции через Telegram API.
Это нужно, чтобы получить от Telegram
message_id
для отправленного сообщения.- Для отправки запроса бот использует сервис
$http
. - В токене
bot_api_key
указан токен Telegram-бота, который получен от BotFather. Бот получает его значение с помощью$secrets.get
и подставляет его в URL запроса.
- Для отправки запроса бот использует сервис
- Бот сохраняет значение
message_id
в$session.promoMessageId
.
предупреждениеЕсли бот отправил сообщение в Telegram через API, то оно не будет отображаться в аналитике. В этом примере бот сам записывает текст сообщения в аналитику с помощью
$analytics.setComment
. - Бот отправляет сообщение об акции через Telegram API.
Это нужно, чтобы получить от Telegram
-
Стейт
Reaction
:- Событие
telegramReaction
срабатывает, если пользователь поставил или убрал реакцию у любого сообщения бота. - Бот сравнивает
message_id
из события сmessage_id
сообщения об акции. - Если идентификаторы совпадают, то бот формирует массив из всех стандартных эмодзи, которые установлены на сообщении об акции.
- Бот записывает эмодзи в аналитику с помощью
$analytics.setComment
.
- Событие
theme: /
state: Start
q!: $regex</start>
a: Начнём.
script:
$jsapi.startSession();
// Получаем идентификатор чата в Telegram
$session.chatId = $request.rawRequest.message.chat.id;
state: Promo
q!: * промо *
script:
$session.promoText = "Новая акция — скидки до 20%";
// Отправляем сообщение об акции через API
var response = $http.post(
"https://api.telegram.org/bot" + $secrets.get("bot_api_key") + "/sendMessage",
{
body: {
// Идентификатор чата
chat_id: $session.chatId,
// Текст сообщения
text: $session.promoText
}
}
)
// Сохраняем message_id сообщения об акции
$session.promoMessageId = response.data.result.message_id;
// Записываем текст сообщения в аналитику
$analytics.setComment("Отправлено сообщение об акции: " + $session.promoText);
state: Reaction
# Пользователь поставил или снял реакцию у сообщения
event!: telegramReaction
script:
// Сравниваем message_id из события с message_id сообщения об акции
if ($request.rawRequest.message_reaction.message_id === $session.promoMessageId){
// Получаем массив из стандартных эмодзи, которые являются текущими реакциями
var currentReactions = $request.rawRequest.message_reaction.new_reaction;
var standardReactions = currentReactions.filter(function(reaction){
return reaction.type === "emoji";
});
var promoEmojis = standardReactions.map(function(item){
return item.emoji;
});
// Записываем результат в аналитику
$analytics.setComment(promoEmojis.join(",") || "Нет реакций");
}