Пытаюсь написать глобальную функцию для отправки уведомлений в Телеграм.
Для реализации задуманного пришлось запаковать сообщение в JSON, но к сожалению, при отправке текста с emoji возвращается ошибка:
{“ok”:false,“error_code”:400,“description”:“Bad Request: text must be encoded in UTF-8”}
Подскажите как можно перебороть это, так как если взять готовую строку и отправить через терминал - то всё успешно отправляется.
На текущий момент скрипт выглядит так:
global.__proto__.SendTelegramTest = function(msg, silent) {
var request = JSON.stringify({chat_id: -666666, text: msg.join('\r\n'), parse_mode: 'Markdown', disable_notification: silent});
var command = "curl -s -X POST https://api.telegram.org/bot{}/sendMessage -H 'Content-Type: application/json' -d '{}'";
runShellCommand(command.format('your_token_here', request), {
captureOutput: true,
exitCallback: function (code, output) {
log.info('command: {}', command.format("your_token_here", request));
log.info('output: {}', output);
}
});
};
// SendTelegramTest(["☑️ *Проверка*", 'Работает'], true);
SendTelegramTest(['🏠 *Проверка*', 'Не отправляет'], true);
Добрый день!
Получилось воспроизвести ситуацию — чуть позже сообщу результат изысканий.
Конструкции такого типа точно работают:
var msgLow = "⚠️ Давление упало ниже " + threshold + " бар: " + p.toFixed(2);
var msgNorm = "✅ Давление восстановлено: " + p.toFixed(2);
Но пока точную причину некорректной работы в вашем случае назвать не могу — продолжаю разбираться.
Как я понял есть простые emoji, а есть те которые за границами некого BMP.
Интересно что напрямую через консоль все хорошо уходит
Добрый день!
Да, прихожу к такому же выводу. Направил запрос разработчикам — возможно, они подготовят фикс или уточнят, что поддерживаются только простые конструкции.
Как будет ответ — сообщу. Если появятся дополнительные наблюдения с вашей стороны, также буду признателен.
Ilya_D
June 24, 2025, 11:04am
7
Приветствую, у меня вот в таком формате работает с эмоджи:
var formattedMessage = formatMessage(message);
var token = botConfig.token;
var chat_id = botConfig.chatId;
var encodedMessage = encodeURIComponent(formattedMessage);
А более полный код есть?
В JSON пакуете или текст сразу в encodeURI…?
Ilya_D
June 24, 2025, 12:03pm
9
просто текст
var CONFIG = {
//...
//... конфиг бота и других параметров
//...
// Message templates
messages: {
lockClosed: "🔒 Замок ЗАКРЫТ ⛔",
lockOpened: "🔓 Замок *ОТКРЫТ* ⚠️",
waterLeak: "💧 Протечка! ⚠️",
//...
//... другие типы сообщений...
//...
startupTest: "🔄 Telegram уведомления запущены"
}
};
function getFormattedDateTime() {
var now = new Date();
var day = padWithZeros(now.getDate(), 2);
var month = padWithZeros(now.getMonth() + 1, 2);
var year = now.getFullYear();
var hours = padWithZeros(now.getHours(), 2);
var minutes = padWithZeros(now.getMinutes(), 2);
var seconds = padWithZeros(now.getSeconds(), 2);
return day + "." + month + "." + year + " " + hours + ":" + minutes + ":" + seconds;
}
function formatMessage(message) {
if (CONFIG.notifications.includeTimestamp) {
return message + " [" + getFormattedDateTime() + "]";
}
return message;
}
1 Like
По совету попробовал этот метод:
Отправляет теперь как надо:
global.__proto__.SendTelegram = function(msg, silent) {
var request = "curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id=-{} -d text='{}' -d parse_mode='Markdown' -d disable_notification='{}'";
runShellCommand(request.format("your_token_here", 777777, encodeURIComponent(msg.join('\r\n')), silent || false));
};
SendTelegramTest(['*Проверка*', '🔒⛔💧⚠️🔄'], true);
1 Like
Teemon
June 25, 2025, 5:05pm
12
Коллеги а могли бы поделиться полным кодом скрипта работы с telegram?
Делали ли вы управление через телеграм (inline-меню кажется это называется)?
sikmir
July 4, 2025, 9:23am
15
Для отправки в Tg в тестинге в wb-rules добавлена поддержка Notify.sendTelegramMessage(token, chatId, text)
.
4 Likes