Отрпавка сообщений в Telegram с emoji

Пытаюсь написать глобальную функцию для отправки уведомлений в Телеграм.

Для реализации задуманного пришлось запаковать сообщение в 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.

Интересно что напрямую через консоль все хорошо уходит :slight_smile:

Добрый день!

Да, прихожу к такому же выводу. Направил запрос разработчикам — возможно, они подготовят фикс или уточнят, что поддерживаются только простые конструкции.

Как будет ответ — сообщу. Если появятся дополнительные наблюдения с вашей стороны, также буду признателен.

Приветствую, у меня вот в таком формате работает с эмоджи:

  var formattedMessage = formatMessage(message);
  var token = botConfig.token;
  var chat_id = botConfig.chatId;
  var encodedMessage = encodeURIComponent(formattedMessage);

А более полный код есть?
В JSON пакуете или текст сразу в encodeURI…?

просто текст

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

Коллеги а могли бы поделиться полным кодом скрипта работы с telegram?
Делали ли вы управление через телеграм (inline-меню кажется это называется)?

Сторонняя разработка, вполне неплоха: GitHub - aadegtyarev/telegram2wb: Телеграм-бот на wb-rules

2 Likes

Для отправки в Tg в тестинге в wb-rules добавлена поддержка Notify.sendTelegramMessage(token, chatId, text).

4 Likes