Conversor de funciones para enviar mensajes en ruso a Telegram desde Mikrotik RouterOS

El mensajero de Telegram es extremadamente conveniente para notificar sobre el funcionamiento de los equipos de TI, que los administradores del sistema utilizan activamente. Las API populares de WhatsApp y Viber admiten, pero no tienen tecnología incorporada para crear sus propios bots.



RouterOS de la conocida empresa Mikrotik no permite enviar mensajes en ruso a Telegram por medios habituales. Los caracteres rusos se pueden mostrar adecuadamente en los mensajes si se envían en codificación UTF-8. Bueno, los códigos son conocidos, ¿por qué no escribir un transcodificador?



Para simplificar la tarea, no utilicé algoritmos de conversión, sino que creé una matriz de claves que contiene, en forma de claves, los propios caracteres rusos en diseños de cadenas y mayúsculas, y en los valores correspondientes: los códigos de estos caracteres en UTF-8.



Esta matriz de datos puede resultar útil para otras tareas:



Matriz clave de caracteres del alfabeto ruso y los valores de sus códigos en 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"}]






Ahora escribimos directamente el propio convertidor de cadenas.

En la entrada, la variable $ string debe contener una cadena que contenga texto ruso o una mezcla de ruso e inglés. La salida es una cadena recopilada, lista para ser enviada a un Telegram. Al mismo tiempo, los caracteres Latin Afavite y los signos de puntuación no se recodifican, ya que normalmente se muestran en los chats de mensajería. En lugar de caracteres rusos, sus contrapartes en códigos UTF-8 se insertan en la cadena, separados por signos "%", utilizados por Telegram para mostrar caracteres codificados.



# 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")}




Pongamos todo esto en la función FuncStrToTele para que pueda llamarlo desde cualquiera de sus scripts en RouterOs Mikrotik. También puede usarlo en DUDe. Aquí está su código completo (puede insertar RouterOS Mikrotik en el repositorio de sus scripts y ejecutar el script para colocar la función en el entorno de script / system):



Función de conversión de cadena mixta
# 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;

}





Como puede ver en el comentario, el único parámetro de la función es la cadena de caracteres de entrada, la función devuelve la cadena generada para ser enviada a la variable $ cadena



En nuestros scripts, no olvide declarar una función previamente definida para ser llamada:



:global FuncStrToTele
[$FuncStrToTele ", user !"]




Para enviar un mensaje, debe crear su bot en Telegram, averiguar su API BOTToken y su ID de chat. Varias veces se han publicado instrucciones para crear bots y obtener ID. Por ejemplo, puede consultar los siguientes enlaces:





Enviamos nuestro mensaje de prueba al chat del bot:



: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


Compruebe que funciona bien para mí. ¡Ahora puedes enviar fácilmente mensajes en ruso a Telegram! Los comentarios y adiciones son bienvenidos.



Probablemente sea aconsejable agregar el envío de un código de carácter de avance de línea, no es difícil de hacer.



All Articles