Re: Работа с данным типа id (internal ID)
Добавлено: 29 июл 2021, 12:56
Спасибо и за ссылку и за функцию.
Пойду писать алгоритм... и, наверно, обратную функцию.
Пойду писать алгоритм... и, наверно, обратную функцию.
Форум поддержи и обмена опытом пользователей оборудования RouterBOARD и операционной системы RouterOS Латвийского производителя MikroTik
https://forummikrotik.ru/
Не догадался отрезать * но по идее работать не будет. скорее всего он преобразует 10 в 10, а не в 16 т.к. тип я так понимаю str будет.
Код: Выделить всё
#idd номер записи лога с которого стартовать должен быть задан глобально до запуска данного скрипта
#в данном скрипте нет защиты от ситуации если ВСЕ записи в логах будут иметь номер больше, чем текущий idd. т.к. данная ситуация не должна случиться при нормальном использовании а писать проверку влом.
#используются функции telegram и num2id
#переменные: Idd и idh: id digital и id hex т.е. формате id. logarray-запись лога
:global telegram
:global num2id
:global idd
local logarray
if (idd=0) do={
$telegram ([/log get *0 time] . " я включился")
#put ([/log get *0 time] . " я включился")
set $idd ($idd+1)
}
:local idh [$num2id $idd]
while (true) do={
set logarray [log get $idh]
if ([typeof [pick $logarray 1]] != "nil") do={
if ([pick $logarray 2] != "changed script settings by admin" and ([pick $logarray 2] != "user admin logged in from 192.168.67.3 via telnet")) do={
#строка для отладки вывод в консоль вместо телеграмма.
#put ([pick $logarray 3] . " |" . [pick $logarray 4] . " |" . [pick $logarray 2])
#put ([pick $logarray 3] . " |" . [tostr [pick $logarray 4]] . " |" . [pick $logarray 2])
$telegram ([pick $logarray 3] . "%0A" . [tostr [pick $logarray 4]] . "%0A" . [pick $logarray 2])
}
set $idd ($idd+1)
set $idh [$num2id $idd]} else {
delay 10
}
}
Код: Выделить всё
:global telegram do={
:global FuncStrToTele
:global mikrotikbot
:global mikrotikchat
set $1 [$FuncStrToTele $1]
:tool fetch url=("https://api.telegram.org/$mikrotikbot/sendmessage\?chat_id=$mikrotikchat&text=$1") keep-result=no
}
# 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;
}
# convert from hex (string) to num
global HexToNum do={
:local Input [ :tostr $1 ];
:local Hex "0123456789abcdef0123456789ABCDEF";
:local Multi 1;
:local Return 0;
:for I from=([ :len $Input ] - 1) to=0 do={
:set Return ($Return + (([ :find $Hex [ :pick $Input $I ] ] % 16) * $Multi));
:set Multi ($Multi * 16);
}
:return $Return;
}
:global num2hex do={
:local number [:tonum $1]
:local hexadec "0"
:local remainder 0
:local hexChars "0123456789ABCDEF"
:if ($number > 0) do={:set hexadec ""}
:while ( $number > 0 ) do={
:set remainder ($number % 16)
:set number (($number-$remainder) / 16)
:set hexadec ([:pick $hexChars $remainder].$hexadec)
}
:return "0x$hexadec"
}
global num2id do={
global num2hex
set $1 ("*" . [pick [$num2hex $1] 2 99])
return $1
}