Функция-конвертер для отправки сообщений на русском языке в Телеграмм из Микротик РоутерОС

ПрограммированиеLuaЛайфхаки для гиков
Мессенджер Телеграмм крайне удобен для уведомления о работе IT-оборудования, чем активно пользуются СисАдмины. Популярные WhatsApp и Viber поддерживают API но в них нет встроенной технологии создания своих ботов.

РоутерОС известной компании Микротик не позволяет штатными средствами отправлять сообщения на русском языке в Телеграмм. Русские символы могут быть адекватно отображены в сообщениях, если отправлены в кодировке UTF-8. Ну что же коды известны, почему бы не написать перекодировщик?

Для упрощения задачи я не пользовался алгоритмами преобразования, а создал ключевой массив, содержащий в виде ключей сами русские символы в строковой и прописной раскладках, а в соответствующих им значениях — коды этих символов в UTF-8.

Вот этот массив данных, может и для других задач пригодится:

Ключевой массив символов русского алфавита и значений их кодов в UTF8
#  table of the codes of Russian letters UTF8
:local rsimv [:toarray {"А"="D090"; "Б"="D091"; "В"="D092"; "Г"="D093"; "Д"="D094"; "Е"="D095"; "Ж"="D096"; "З"="D097"; "И"="D098"; "Й"="D099"; "К"="D09A"; "Л"="D09B"; "М"="D09C"; "Н"="D09D"; "О"="D09E"; "П"="D09F"; "Р"="D0A0"; "С"="D0A1"; "Т"="D0A2"; "У"="D0A3"; "Ф"="D0A4"; "Х"="D0A5"; "Ц"="D0A6"; "Ч"="D0A7"; "Ш"="D0A8"; "Щ"="D0A9"; "Ъ"="D0AA"; "Ы"="D0AB"; "Ь"="D0AC"; "Э"="D0AD"; "Ю"="D0AE"; "Я"="D0AF"; "а"="D0B0"; "б"="D0B1"; "в"="D0B2"; "г"="D0B3"; "д"="D0B4"; "е"="D0B5"; "ж"="D0B6"; "з"="D0B7"; "и"="D0B8"; "й"="D0B9"; "к"="D0BA"; "л"="D0BB"; "м"="D0BC"; "н"="D0BD"; "о"="D0BE"; "п"="D0BF"; "р"="D180"; "с"="D181"; "т"="D182"; "у"="D183"; "ф"="D184"; "х"="D185"; "ц"="D186"; "ч"="D187"; "ш"="D188"; "щ"="D189"; "ъ"="D18A"; "ы"="D18B"; "ь"="D18C"; "э"="D18D"; "ю"="D18E"; "я"="D18F"; "Ё"="D001"; "ё"="D191"}]



Теперь пишем непосредственно сам конвертер строки.
На входе в переменной $string должна быть строка, содержащая русский или смешанный русско-английский текст. На выходе — собранная строка, готовая для отправки в Телеграмм. При этом символы латинского афавита и знаки препинания не перекодируются, так как нормально отображаются в чатах мессенджера. Вместо русских символов в строку вставляются их аналоги в UTF-8 кодах, разделенные знаками "%", используемые Телеграмм для отображения закодированных символов.

# encoding of the symbols and аssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}


Оформим всё это в функцию FuncStrToTele, чтобы можно было вызывать её из любых своих скриптов в РоутерОс Микротик. Также можно её использовать в DUDe. Вот её полный код (можно вставить в реппозиторий своих скриптов РоутерОС Микротик и выполнить скрипт для размещения функции в /system script environment):

Функция конвертер смешанной строки
# Function Converter of Russian characters for sending in Telegram
# by Sertik 09/09/2020
# usage [$FuncStrToTele «Строка String .,!+»]

:global FuncStrToTele do={
:local string; :set $string $1;

# table of the codes of Russian letters UTF8
:local rsimv [:toarray {«А»=«D090»; «Б»=«D091»; «В»=«D092»; «Г»=«D093»; «Д»=«D094»; «Е»=«D095»; «Ж»=«D096»; «З»=«D097»; «И»=«D098»; «Й»=«D099»; «К»=«D09A»; «Л»=«D09B»; «М»=«D09C»; «Н»=«D09D»; «О»=«D09E»; «П»=«D09F»; «Р»=«D0A0»; «С»=«D0A1»; «Т»=«D0A2»; «У»=«D0A3»; «Ф»=«D0A4»; «Х»=«D0A5»; «Ц»=«D0A6»; «Ч»=«D0A7»; «Ш»=«D0A8»; «Щ»=«D0A9»; «Ъ»=«D0AA»; «Ы»=«D0AB»; «Ь»=«D0AC»; «Э»=«D0AD»; «Ю»=«D0AE»; «Я»=«D0AF»; «а»=«D0B0»; «б»=«D0B1»; «в»=«D0B2»; «г»=«D0B3»; «д»=«D0B4»; «е»=«D0B5»; «ж»=«D0B6»; «з»=«D0B7»; «и»=«D0B8»; «й»=«D0B9»; «к»=«D0BA»; «л»=«D0BB»; «м»=«D0BC»; «н»=«D0BD»; «о»=«D0BE»; «п»=«D0BF»; «р»=«D180»; «с»=«D181»; «т»=«D182»; «у»=«D183»; «ф»=«D184»; «х»=«D185»; «ц»=«D186»; «ч»=«D187»; «ш»=«D188»; «щ»=«D189»; «ъ»=«D18A»; «ы»=«D18B»; «ь»=«D18C»; «э»=«D18D»; «ю»=«D18E»; «я»=«D18F»; «Ё»=«D001»; «ё»=«D191»; "№"=«0023»}]

# encoding of the symbols and аssembly line
:local StrTele ""; :local code "";
:for i from=0 to=([:len $string]-1) do={:local keys [:pick $string $i (1+$i)]; :local key ($rsimv->$keys); if ([:len $key]!=0) do={:set $code ("%"."$[:pick ($rsimv->$keys) 0 2]"."%"."$[:pick ($rsimv->$keys) 2 4]");} else={:set $code $keys}; :set $StrTele ("$StrTele"."$code")}

:return $StrTele;
}


Как видно из комментария единственным параметром функции является входная строка символов, возвращает функция сформированную строку для отправки в переменной $string

В своих скриптах не забываем объявлять ранее определенную функцию для вызова:

:global FuncStrToTele
[$FuncStrToTele "Привет, user !"]


Чтобы отправить сообщение нужно создать своего бота в Телеграмм, узнать его API BOTToken и ID чата. Инструкции по созданию ботов и получению идентификаторов неоднократно публиковались. Например, можно посмотреть по следующим ссылкам:


Отправляем наше тестовое сообщение в чат бота:

:local botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:local myChatID "YYYYYY" ;
:global FuncStrToTele;
:local string [$FuncStrToTele "Привет от Sertik ! Работает функция-конвертер Russian alfabit для Telegramm"]
:tool fetch url=("https://api.telegram.org/$botID/sendmes ... xt=$string") keep-result=no

Проверяйте, у меня отлично работает. Теперь можно без всякого труда отправлять в Телеграмм сообщения на русском языке! Замечания и дополнения приветствуются.

Вероятно целесообразно добавить отправку кода символа переноса строки, это не сложно сделать.
Теги:Микротик Роутер ОСмессенджер Телеграммотправка русских символов
Хабы: Программирование Lua Лайфхаки для гиков
+6
4,3k 63
Комментарии 12

Похожие публикации

Лучшие публикации за сутки