[Программирование, Lua, Лайфхаки для гиков] Функция-конвертер для отправки сообщений на русском языке в Телеграмм из Микротик РоутерОС

Автор Сообщение
news_bot ®

Стаж: 6 лет 9 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
10-Сен-2020 12:30

Мессенджер Телеграмм крайне удобен для уведомления о работе IT-оборудования, чем активно пользуются СисАдмины. Популярные WatsApp и Wiber не поддерживают API и в них нет встроенной технологии создания своих Ботов.
РоутерОС известной компании Микротик не позволяет штатными средствами отправлять сообщения на русском языке в Телеграмм. Русские символы могут быть адекватно отображены в сообщениях, если отправлены в кодировке UTF-8. Ну что же коды известны, почему бы не написать перекодировщик?
Для упрощения задачи я не пользовался алгоритмами преобразования, а создал ключевой массив, содержащий в виде ключей сами русские символы в строковой и прописной раскладках, а в соответствующих им значениях — коды этих символов в UTF-8.
Вот этот массив данных, может и для других задач пригодится:

ключевой массив символов русского алфавита и значений их кодов в UTF8

SPL
# 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 кодах, разделенные знаками "%", используемые Телеграмм для отображения символов в кодах.

Конвертер смешанной строки

SPL
# 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. Вот ёё полный код:

Функция перекодировки смешанной строки FuncStrToTele для отправки сообщений в Телеграмм

SPL
# Function Converter of Russian characters for sending in Telegram
# by Sertik 09/09/2020
# usage [$FuncStrToTele «Строка String .,!+»]
:global FuncStrToTele do={
:global 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»}]
# 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")}
:set $string $StrTele
:return $string;
}

Как видно из комментария единственным параметром функции является входная строка символов, возвращает функция сформированную строку для отправки в переменной $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=(«api.telegram.org$botID/sendmes… xt=$string») keep-result=no
Проверяйте, у меня отлично работает. Теперь можно без всякого труда отправлять в Телегу сообщения на русском языке! Замечания и дополнения приветствуются.
Вероятно целесообразно добавить отправку кода символа переноса строки, это не сложно сделать.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_programmirovanie (Программирование), #_lua, #_lajfhaki_dlja_gikov (Лайфхаки для гиков), #_mikrotik_router_os (Микротик Роутер ОС), #_messendzher_telegramm (мессенджер Телеграмм), #_otpravka_russkih_simvolov (отправка русских символов), #_programmirovanie (
Программирование
)
, #_lua, #_lajfhaki_dlja_gikov (
Лайфхаки для гиков
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Ноя 18:21
Часовой пояс: UTC + 5