Удаленный запуск скриптов через Телеграм

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

ievq писал(а): 02 авг 2022, 13:45 Парни, подскажите плз, куда копать.
Подключил бота, все ок. Логи шлёт, команды выполняет, если писать, а вот команды из меню, которое создаётся в BotFatherне хочет..
Имя роутера sboard
Имя скрипта check
Создал пункт меню как
/sboard_check - Check status sboard
В групповом чате выбираешь из меню, отправляешь - тишина..
Если просто написать /sboard check, скрипт выполняется
Если написать /sboard_check, то тишина

Пробел и _ тождественны же. Ладно накосячил может где при создании меню, но если в ручную вводить то, работает тоже только с пробелом.

p.s. все команды пишу в групповом чате тг
Скорее всего это происходит потому, что в групповых чатах после команды добавляется @имябота. А скрипт на это наверное не заточен, ему нужна чистая команда, т.к. команда - это имя скрипта.

Чтобы заработало из чатов, добавьте в конец имени скрипта @имябота. Чтобы и так и так работало, просто скопировать нужный скрипт и добавить в конец имени @имябота.


-13-
Сообщения: 124
Зарегистрирован: 18 мар 2021, 12:45

Brook писал(а): 03 авг 2022, 17:49
ievq писал(а): 02 авг 2022, 13:45 Парни, подскажите плз, куда копать.
Подключил бота, все ок. Логи шлёт, команды выполняет, если писать, а вот команды из меню, которое создаётся в BotFatherне хочет..
Имя роутера sboard
Имя скрипта check
Создал пункт меню как
/sboard_check - Check status sboard
В групповом чате выбираешь из меню, отправляешь - тишина..
Если просто написать /sboard check, скрипт выполняется
Если написать /sboard_check, то тишина

Пробел и _ тождественны же. Ладно накосячил может где при создании меню, но если в ручную вводить то, работает тоже только с пробелом.

p.s. все команды пишу в групповом чате тг
Скорее всего это происходит потому, что в групповых чатах после команды добавляется @имябота. А скрипт на это наверное не заточен, ему нужна чистая команда, т.к. команда - это имя скрипта.

Чтобы заработало из чатов, добавьте в конец имени скрипта @имябота. Чтобы и так и так работало, просто скопировать нужный скрипт и добавить в конец имени @имябота.

Или можно сделать универсальную для групповых и приватных, например:

Код: Выделить всё

:if ($message ~"@") do={
    :set $message [:pick $message 0 [:find $message "@"]]
}


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

-13- писал(а): 04 авг 2022, 12:20
Или можно сделать универсальную для групповых и приватных, например:

Код: Выделить всё

:if ($message ~"@") do={
    :set $message [:pick $message 0 [:find $message "@"]]
}
Конечно так лучше в данном случае.
Я иногда использую эту особенность именования команд, чтобы исключить выполнение кода из приватных чатов.


Аватара пользователя
drpioneer
Сообщения: 142
Зарегистрирован: 30 май 2013, 10:20

-13- писал(а): 04 авг 2022, 12:20
Brook писал(а): 03 авг 2022, 17:49
ievq писал(а): 02 авг 2022, 13:45 ...
В групповом чате выбираешь из меню, отправляешь - тишина..
Если просто написать /sboard check, скрипт выполняется
Если написать /sboard_check, то тишина
...
Скорее всего это происходит потому, что в групповых чатах после команды добавляется @имябота. А скрипт на это наверное не заточен, ему нужна чистая команда, т.к. команда - это имя скрипта.
...
...
Или можно сделать универсальную для групповых и приватных, например:

Код: Выделить всё

:if ($message ~"@") do={
    :set $message [:pick $message 0 [:find $message "@"]]
}
Приветствую!

Обновил скрипт с учётом написанного выше.
Также добавил проверку на предмет уже запущенного скрипта.

Код: Выделить всё




# TLGRM - combined notifications script & launch of commands (scripts & functions) via Telegram
# Script uses ideas by Sertik, Virtue, Pepelxl, Dimonw, -13-, Jotne, Alice Tails, Chupaka, drPioneer
# https://forummikrotik.ru/viewtopic.php?p=81945#p81945
# tested on ROS 6.49.6
# updated 2022/08/05

:global scriptTlgrm;        # Flag of the running script:   false=>in progress, true=>idle

:do {
    :local botID    "botXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    :local myChatID "-XXXXXXXXX";
    :local broadCast false; # Non-addressed reception mode
    :local launchScr true;  # Permission to execute scripts
    :local launchFnc true;  # Permission to perform functions
    :local launchCmd true;  # Permission to execute commands

    # Function of searching comments for MAC-address
    # https://forummikrotik.ru/viewtopic.php?p=73994#p73994
    :local FindMacAddr do={
        :if ($1~"[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
            :foreach idx in=[/ip dhcp-server lease find disabled=no] do={
                :local mac [/ip dhcp-server lease get $idx mac-address];
                :if ($1~"$mac") do={:return ("$1 [$[/ip dhcp-server lease get $idx address]/$[/ip dhcp-server lease get $idx comment]].")};
            }
            :foreach idx in=[/interface bridge host find] do={
                :local mac [/interface bridge host get $idx mac-address];
                :if ($1~"$mac") do={:return ("$1 [$[/interface bridge host get $idx on-interface]].")};
            }
        }
        :return ($1);
    }

    # Function of converting CP1251 to UTF8
    # https://forummikrotik.ru/viewtopic.php?p=81457#p81457
    :local CP1251toUTF8 do={
        :local cp1251 [:toarray {
            "\20";"\01";"\02";"\03";"\04";"\05";"\06";"\07";"\08";"\09";"\0A";"\0B";"\0C";"\0D";"\0E";"\0F";\
            "\10";"\11";"\12";"\13";"\14";"\15";"\16";"\17";"\18";"\19";"\1A";"\1B";"\1C";"\1D";"\1E";"\1F";\
            "\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\3A";\
            "\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\7B";"\7C";"\7D";"\7E";\
            "\C0";"\C1";"\C2";"\C3";"\C4";"\C5";"\C6";"\C7";"\C8";"\C9";"\CA";"\CB";"\CC";"\CD";"\CE";"\CF";\
            "\D0";"\D1";"\D2";"\D3";"\D4";"\D5";"\D6";"\D7";"\D8";"\D9";"\DA";"\DB";"\DC";"\DD";"\DE";"\DF";\
            "\E0";"\E1";"\E2";"\E3";"\E4";"\E5";"\E6";"\E7";"\E8";"\E9";"\EA";"\EB";"\EC";"\ED";"\EE";"\EF";\
            "\F0";"\F1";"\F2";"\F3";"\F4";"\F5";"\F6";"\F7";"\F8";"\F9";"\FA";"\FB";"\FC";"\FD";"\FE";"\FF";\
            "\A8";"\B8";"\B9"}];
        :local utf8 [:toarray {
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"000A";"0020";"0020";"000D";"0020";"0020";\
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";\
            "0021";"0022";"0023";"0024";"0025";"0026";"0027";"0028";"0029";"002A";"002B";"002C";"002D";"002E";"002F";"003A";\
            "003B";"003C";"003D";"003E";"003F";"0040";"005B";"005C";"005D";"005E";"005F";"0060";"007B";"007C";"007D";"007E";\
            "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";"2116"}];
        :local convStr ""; 
        :local code "";
        :for i from=0 to=([:len $1]-1) do={
            :local symb [:pick $1 $i ($i+1)]; 
            :local idx [:find $cp1251 $symb];
            :local key ($utf8->$idx);
            :if ([:len $key]!=0) do={
                :set $code ("%$[:pick ($key) 0 2]%$[:pick ($key) 2 4]");
                :if ([pick $code 0 3]="%00") do={:set $code ([:pick $code 3 6])};
            } else={:set code ($symb)}; 
            :set $convStr ($convStr.$code);
        }
        :return ($convStr);
    }

    # Telegram messenger response parsing function
    # https://habr.com/ru/post/482802/
    :local MsgParser do={
        :local variaMod ("\"".$2."\"");
        :if ([:len [:find $1 $variaMod -1]]=0) do={:return ("'unknown'")};
        :local startLoc ([:find $1 $variaMod -1]+[:len $variaMod]+1);
        :local commaLoc ([:find $1 "," $startLoc]);
        :local brakeLoc ([:find $1 "}" $startLoc]);
        :local endLoc $commaLoc;
        :local startSymbol [:pick $1 $startLoc];
        :if ($brakeLoc!=0 and ($commaLoc=0 or $brakeLoc<$commaLoc)) do={:set endLoc $brakeLoc};
        :if ($startSymbol="{") do={:set endLoc ($brakeLoc+1)};
        :if ($3=true) do={:set startLoc ($startLoc+1); :set endLoc ($endLoc-1)};
        :if ($endLoc<$startLoc) do={:set endLoc ($startLoc+1)};
        :return ([:pick $1 $startLoc $endLoc]);
    }

    # Time translation function to UNIX-time
    # https://forum.mikrotik.com/viewtopic.php?t=75555#p790745
    # Usage: $EpochTime [time input]
    # Get current time: put [$EpochTime]
    # Read log time in one of three format: "hh:mm:ss", "mmm/dd hh:mm:ss" or "mmm/dd/yyyy hh:mm:ss"
    :local EpochTime do={
        :local ds [/system clock get date];
        :local ts [/system clock get time];
        :if ([:len $1]>19) do={:set ds "$[:pick $1 0 11]"; :set ts [:pick $1 12 20]};
        :if ([:len $1]>8 && [:len $1]<20) do={:set ds "$[:pick $1 0 6]/$[:pick $ds 7 11]"; :set ts [:pick $1 7 15]};
        :local yesterday false;
        :if ([:len $1]=8) do={
            :if ([:totime $1]>ts) do={:set yesterday (true)};
            :set ts $1;
        }
        :local months;
        :if ((([:pick $ds 9 11]-1)/4)!=(([:pick $ds 9 11])/4)) do={
            :set months {"an"=0;"eb"=31;"ar"=60;"pr"=91;"ay"=121;"un"=152;"ul"=182;"ug"=213;"ep"=244;"ct"=274;"ov"=305;"ec"=335};
        } else={
            :set months {"an"=0;"eb"=31;"ar"=59;"pr"=90;"ay"=120;"un"=151;"ul"=181;"ug"=212;"ep"=243;"ct"=273;"ov"=304;"ec"=334};
        }
        :set ds (([:pick $ds 9 11]*365)+(([:pick $ds 9 11]-1)/4)+($months->[:pick $ds 1 3])+[:pick $ds 4 6]);
        :set ts (([:pick $ts 0 2]*3600)+([:pick $ts 3 5]*60)+[:pick $ts 6 8]);
        :if (yesterday) do={:set ds ($ds-1)};
        :return ($ds*86400+$ts+946684800-[/system clock get gmt-offset]);
    }

    # Time conversion function from UNIX-time
    # https://forummikrotik.ru/viewtopic.php?t=11636
    # usage: [$UnixTimeToFormat "timeStamp" "type"]
    # type: "unspecified" - month/dd/yyyy <only>    (Mikrotik sheduller format)
    #                   1 - yyyy/mm/dd hh:mm:ss
    #                   2 - dd:mm:yyyy hh:mm:ss
    #                   3 - dd month yyy hh mm ss
    #                   4 - yyyy month dd hh mm ss
    #                   5 - month/dd/yyyy-hh:mm:ss  (Mikrotik sheduller format)
    :local UnixTimeToFormat do={
        :local decodedLine "";
        :local timeStamp $1;
        :local timeS ($timeStamp%86400);
        :local timeH ($timeS/3600);
        :local timeM ($timeS%3600 /60);
        :set  $timeS ($timeS-$timeH*3600-$timeM*60);
        :local dateD ($timeStamp/86400);
        :local dateM 2;
        :local dateY 1970;
        :local leap false;
        :while (($dateD/365)>0) do={
            :set $dateD ($dateD-365);
            :set $dateY ($dateY+1);
            :set $dateM ($dateM+1);
            :if ($dateM=4) do={
                :set $dateM 0;
                :if (($dateY%400=0) or ($dateY%100!=0)) do={:set $leap true; :set $dateD ($dateD-1)};
            } else={:set $leap false};
        }
        :local months [:toarray (0,31,28,31,30,31,30,31,31,30,31,30,31)];
        :if (leap) do={:set $dateD ($dateD+1); :set ($months->2) 29};
        :do {
            :for i from=1 to=12 do={
                :if (($months->$i)>$dateD) do={
                    :set $dateM $i;
                    :set $dateD ($dateD+1);
                    break;
                } else={:set $dateD ($dateD-($months->$i))};
            }
        } on-error={};
        :local tmod;
        :if ([:len $2]!=0) do={:set $tmod $2} else={:set $tmod (:nothing)};
        :local sl "/";
        :local mstr {"jan";"feb";"mar";"apr";"may";"jun";"jul";"aug";"sep";"oct";"nov";"dec"};
        :local strY [:tostr $dateY];
        :local strN;
        :local strD;
        :local strH;
        :local strM;
        :local strS;
        :if ($dateM>9) do={:set $strN [:tostr $dateM]} else={:set $strN ("0".[:tostr $dateM])};
        :if ($dateD>9) do={:set $strD [:tostr $dateD]} else={:set $strD ("0".[:tostr $dateD])};
        :if ($timeH>9) do={:set $strH [:tostr $timeH]} else={:set $strH ("0".[:tostr $timeH])};
        :if ($timeM>9) do={:set $strM [:tostr $timeM]} else={:set $strM ("0".[:tostr $timeM])};
        :if ($timeS>9) do={:set $strS [:tostr $timeS]} else={:set $strS ("0".[:tostr $timeS])};
        :do {
            :if ([:len $tmod]=0) do={:local mt ($mstr->($dateM-1)); :set $decodedLine ("$mt/"."$strD/"."$strY"); break};
            :if ($tmod=1) do={:set $decodedLine "$strY$sl$strN$sl$strD $strH:$strM:$strS"; break};
            :if ($tmod=2) do={:set $decodedLine "$strD$sl$strN$sl$strY $strH:$strM:$strS"; break};
            :if ($tmod=3) do={:set $decodedLine ("$strD ".($mstr->($dateM-1))." $strY $strH:$strM:$strS"); break};
            :if ($tmod=4) do={:set $decodedLine ("$strY ".($mstr->($dateM-1))." $strD $strH:$strM:$strS"); break};
            :if ($tmod=5) do={:local m ($mstr->($dateM-1)); :set $decodedLine ("$m/"."$strD/"."$strY"."-$strH:$strM:$strS"); break};
        } on-error={};
        :return ($decodedLine);
    }

    # Main body of the script
    :global timeAct;
    :global timeLog;
    :local  nameID [/system identity get name];
    :local  timeOf [/system clock get gmt-offset];
    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Start of TLGRM-script on '$nameID' router.");
    :if ([:len $scriptTlgrm]=0) do={:set scriptTlgrm true};
    :if ($scriptTlgrm) do={
        :set scriptTlgrm false;
        :if ([:len $timeAct]>0) do={:put ("$[$UnixTimeToFormat ($timeAct+$timeOf) 1] - Time when the last command was launched.")};
        :if ([:len $timeLog]>0) do={:put ("$[$UnixTimeToFormat ($timeLog+$timeOf) 1] - Time when the log entries were last sent.")};
    
        # Part of the script body to launch via Telegram
        # https://forummikrotik.ru/viewtopic.php?p=78085
        :local timeStmp [$EpochTime];
        :local urlString "https://api.telegram.org/$botID/getUpdates\?offset=-1&limit=1&allowed_updates=message";
        :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - *** Stage of launch scripts, function & commands via Telegram:");
        :if ([:len $timeAct]=0) do={
            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Time of the last launch of the command was not found.");
            :set timeAct $timeStmp;
        } else={
            :local httpResp [/tool fetch url=$urlString as-value output=user];
            :local content ($httpResp->"data");
            :if ([:len $content]>30) do={
                :local msgTxt [$MsgParser $content "text" true];
                :set   msgTxt ([:pick $msgTxt ([:find $msgTxt "/" -1]+1) [:len $msgTxt]]);
                :if ($msgTxt ~"@") do={:set $msgTxt [:pick $msgTxt 0 [:find $msgTxt "@"]]}
                :local newStr "";
                :local change "";
                :for i from=0 to=([:len $msgTxt]-1) do={
                    :local symb [:pick $msgTxt $i ($i+1)]; 
                    :if ($symb="_") do={:set change (" ")} else={:set change ($symb)}; 
                    :set $newStr ($newStr.$change);
                }
                :set msgTxt $newStr;
                :local msgAddr "";
                :if ($broadCast) do={:set $msgAddr $nameID} else={
                    :set msgAddr ([:pick $msgTxt 0 [:find $msgTxt " " -1]]);
                    :if ([:len [:find $msgTxt " "]]=0) do={:set msgAddr ("$msgTxt ")};
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Recipient of the Telegram message: '$msgAddr'");
                    :set msgTxt ([:pick $msgTxt ([:find $msgTxt $msgAddr -1]+[:len $msgAddr]+1) [:len $msgTxt]]);
                }
                :if ($msgAddr=$nameID or $msgAddr="forall") do={
                    :local chatID [$MsgParser [$MsgParser $content "chat"] "id"];
                    :local userNm [$MsgParser $content "username"];
                    :set timeStmp [$MsgParser $content "date"];
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Sender of the Telegram message: $userNm");
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Command to execute: '$msgTxt'");
                    :local restline [];
                    :if ([:len [:find $msgTxt " "]]!=0) do={
                        :set restline [:pick $msgTxt ([:find $msgTxt " "]+1) [:len $msgTxt]];
                        :set msgTxt [:pick $msgTxt 0 [:find $msgTxt " "]];
                    }
                    :if ($chatID=$myChatID && $timeAct<$timeStmp) do={
                        :set timeAct $timeStmp;
                        :if ([/system script environment find name=$msgTxt]!="" && $launchFnc=true) do={   
                            :if (([/system script environment get [/system script environment find name=$msgTxt] value]="(code)") \
                                or ([:len [:find [/system script environment get [/system script environment find name=$msgTxt] value] "(eval"]]>0)) do={
                                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm launches function '$msgTxt'.");
                                :log warning ("Telegram user $userNm launches function '$msgTxt'.");
                                [:parse ":global $msgTxt; [\$$msgTxt $restline]"];
                            } else={
                                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - '$msgTxt' is a global variable and not a function - no execute.");
                                :log warning ("'$msgTxt' is a global variable and not a function - no execute.");
                            }
                        }
                        :if ([/system script find name=$msgTxt]!="" && $launchScr=true) do={
                            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm activates script '$msgTxt'.");
                            :log warning ("Telegram user $userNm activates script '$msgTxt'.");
                            [[:parse "[:parse [/system script get $msgTxt source]] $restline"]];
                        }
                        :if ([/system script find name=$msgTxt]="" && [/system script environment find name=$msgTxt]="" && $launchCmd=true) do={
                            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm is trying to execute command '$msgTxt'.");
                            :log warning ("Telegram user $userNm is trying to execute command '$msgTxt'.");
                            :do {[:parse "/$msgTxt $restline"]} on-error={};
                        }
                    } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Wrong time to launch.")};
                } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - No command found for this device.")};
            } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Completion of response from Telegram.")};
        }

        # Part of the script body for notifications in Telegram
        # https://www.reddit.com/r/mikrotik/comments/onusoj/sending_log_alerts_to_telegram/
        :local outMsg "";
        :local logGet [:toarray [/log find ($topics~"warning" or $topics~"error" or $topics~"critical" or $topics~"caps" or $topics~"wireless" or $message~"logged in")]];
        :local logCnt [:len $logGet];
        :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - *** Stage of sending notifications to Telegram:");
        :if ([:len $timeLog]=0) do={ 
            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Time of the last log entry was not found.");
            :set outMsg (">$[/system clock get time] Telegram notification started.");
        }
        :if ($logCnt>0) do={
            :local lastTime [$EpochTime [/log get [:pick $logGet ($logCnt-1)] time]];
            :local index 0;
            :local tempTim "";
            :local tempMsg "";
            :local tempTpc "";
            :local unixTim "";
            :do {
                :set index ($index+1); 
                :set tempTim [/log get [:pick $logGet ($logCnt-$index)] time];
                :set tempTpc [/log get [:pick $logGet ($logCnt-$index)] topics];
                :set tempMsg [/log get [:pick $logGet ($logCnt-$index)] message];
                :set tempMsg (">$tempTim $tempMsg");
                :local findMacMsg ([$FindMacAddr $tempMsg]);
                :set unixTim [$EpochTime $tempTim];
                :if (($unixTim>$timeLog) && (!(($tempTpc~"caps" or $tempTpc~"wireless" or $tempTpc~"dhcp") && ($tempMsg!=$findMacMsg)))) do={
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Found log entry: $findMacMsg");
                    :set outMsg ($findMacMsg."\n".$outMsg);
                }
            } while=(($unixTim>$timeLog) && ($index<$logCnt));
            :if (([:len $timeLog]<1) or (([:len $timeLog]>0) && ($timeLog!=$lastTime) && ([:len $outMsg]>8))) do={
                :set timeLog $lastTime;
                :if ([:len $outMsg]>4096) do={:set outMsg ([:pick $outMsg 0 4096])};
                :set outMsg [$CP1251toUTF8 $outMsg];
                :local urlString ("https://api.telegram.org/$botID/sendmessage\?chat_id=$myChatID&text=$nameID:%0A$outMsg");
                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Generated string for Telegram:\r\n".$urlString);
                /tool fetch url=$urlString as-value output=user;
            } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - There are no log entries to send.")};
        } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Necessary log entries were not found.")};
        :set scriptTlgrm true;
    } else={:put "$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Script already being executed..."};
    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - End of TLGRM-script on '$nameID' router.");
} on-error={
    :set scriptTlgrm true;
    :put ("Script error: something didn't work when sending a request to Telegram.");
    :put ("*** First, check the correctness of the values of the variables botID & myChatID. ***"); 
}





ievq
Сообщения: 2
Зарегистрирован: 02 авг 2022, 13:36

Всем спасибо за подсказки.
Проблема была в моей невнимательности..
Запускал не самую свежую версию скрипта.


Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Дорогой друг DrPioneer !
Надо бы уже написать пусть небольшое, но подробное руководство по TLGRM, так как в нём появилось много новых возможностей. Я уже забыл даже что и как ... :-):


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Вышла новая версия TLGRM в интеграции с SATELLITE. Обновления доступны для скачивания. Информация в ветке о SATELLITE
viewtopic.php?f=14&t=13648&p=86773#p86773


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

обновленная версия TLGRM от 07.10.2022

- добавлена возможность записи вызова функций в формате РоутерОС (с префиксом $ или префиксом с заключением в квадратные скобки [$funcName]
- добавлена возможность выполнения смайл-команд (запуск скриптов по коду смайлика / или коду-имени)
- запуск функций, скриптов и прямых команд Рос выполняется в "многопоточном" режиме, с помощью команды :execute, что ускоряет работу TLGRM

тот же обновленный TLGRM будет в составе T&S (TLGRM и SATELLITE)в версии 2.0 уже скоро !

Код: Выделить всё

# TLGRM - combined notifications script & launch of commands (scripts & functions) via Telegram
# Script uses ideas by Sertik, Virtue, Pepelxl, Dimonw, -13-, Jotne, Alice Tails, Chupaka, drPioneer
# https://forummikrotik.ru/viewtopic.php?p=81945#p81945
# tested on ROS 6.49.6
# updated 2022/10/07

:global scriptTlgrm;        # Flag of the running script:   false=>in progress, true=>idle

:do {
    :local botID    "botXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    :local myChatID "-XXXXXXXXX";
    :local broadCast false; # Non-addressed reception mode
    :local launchScr true;  # Permission to execute scripts
    :local launchFnc true;  # Permission to perform functions
    :local launchCmd true;  # Permission to execute commands

    # Function of searching comments for MAC-address
    # https://forummikrotik.ru/viewtopic.php?p=73994#p73994
    :local FindMacAddr do={
        :if ($1~"[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
            :foreach idx in=[/ip dhcp-server lease find disabled=no] do={
                :local mac [/ip dhcp-server lease get $idx mac-address];
                :if ($1~"$mac") do={:return ("$1 [$[/ip dhcp-server lease get $idx address]/$[/ip dhcp-server lease get $idx comment]].")};
            }
            :foreach idx in=[/interface bridge host find] do={
                :local mac [/interface bridge host get $idx mac-address];
                :if ($1~"$mac") do={:return ("$1 [$[/interface bridge host get $idx on-interface]].")};
            }
        }
        :return ($1);
    }

    # Function of converting CP1251 to UTF8
    # https://forummikrotik.ru/viewtopic.php?p=81457#p81457
    :local CP1251toUTF8 do={
        :local cp1251 [:toarray {
            "\20";"\01";"\02";"\03";"\04";"\05";"\06";"\07";"\08";"\09";"\0A";"\0B";"\0C";"\0D";"\0E";"\0F";\
            "\10";"\11";"\12";"\13";"\14";"\15";"\16";"\17";"\18";"\19";"\1A";"\1B";"\1C";"\1D";"\1E";"\1F";\
            "\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\3A";\
            "\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\7B";"\7C";"\7D";"\7E";\
            "\C0";"\C1";"\C2";"\C3";"\C4";"\C5";"\C6";"\C7";"\C8";"\C9";"\CA";"\CB";"\CC";"\CD";"\CE";"\CF";\
            "\D0";"\D1";"\D2";"\D3";"\D4";"\D5";"\D6";"\D7";"\D8";"\D9";"\DA";"\DB";"\DC";"\DD";"\DE";"\DF";\
            "\E0";"\E1";"\E2";"\E3";"\E4";"\E5";"\E6";"\E7";"\E8";"\E9";"\EA";"\EB";"\EC";"\ED";"\EE";"\EF";\
            "\F0";"\F1";"\F2";"\F3";"\F4";"\F5";"\F6";"\F7";"\F8";"\F9";"\FA";"\FB";"\FC";"\FD";"\FE";"\FF";\
            "\A8";"\B8";"\B9"}];
        :local utf8 [:toarray {
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"000A";"0020";"0020";"000D";"0020";"0020";\
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";\
            "0021";"0022";"0023";"0024";"0025";"0026";"0027";"0028";"0029";"002A";"002B";"002C";"002D";"002E";"002F";"003A";\
            "003B";"003C";"003D";"003E";"003F";"0040";"005B";"005C";"005D";"005E";"005F";"0060";"007B";"007C";"007D";"007E";\
            "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";"2116"}];
        :local convStr ""; 
        :local code "";
        :for i from=0 to=([:len $1]-1) do={
            :local symb [:pick $1 $i ($i+1)]; 
            :local idx [:find $cp1251 $symb];
            :local key ($utf8->$idx);
            :if ([:len $key]!=0) do={
                :set $code ("%$[:pick ($key) 0 2]%$[:pick ($key) 2 4]");
                :if ([pick $code 0 3]="%00") do={:set $code ([:pick $code 3 6])};
            } else={:set code ($symb)}; 
            :set $convStr ($convStr.$code);
        }
        :return ($convStr);
    }

    # Telegram messenger response parsing function
    # https://habr.com/ru/post/482802/
    :local MsgParser do={
        :local variaMod ("\"".$2."\"");
        :if ([:len [:find $1 $variaMod -1]]=0) do={:return ("'unknown'")};
        :local startLoc ([:find $1 $variaMod -1]+[:len $variaMod]+1);
        :local commaLoc ([:find $1 "," $startLoc]);
        :local brakeLoc ([:find $1 "}" $startLoc]);
        :local endLoc $commaLoc;
        :local startSymbol [:pick $1 $startLoc];
        :if ($brakeLoc!=0 and ($commaLoc=0 or $brakeLoc<$commaLoc)) do={:set endLoc $brakeLoc};
        :if ($startSymbol="{") do={:set endLoc ($brakeLoc+1)};
        :if ($3=true) do={:set startLoc ($startLoc+1); :set endLoc ($endLoc-1)};
        :if ($endLoc<$startLoc) do={:set endLoc ($startLoc+1)};
        :return ([:pick $1 $startLoc $endLoc]);
    }

    # Time translation function to UNIX-time
    # https://forum.mikrotik.com/viewtopic.php?t=75555#p790745
    # Usage: $EpochTime [time input]
    # Get current time: put [$EpochTime]
    # Read log time in one of three format: "hh:mm:ss", "mmm/dd hh:mm:ss" or "mmm/dd/yyyy hh:mm:ss"
    :local EpochTime do={
        :local ds [/system clock get date];
        :local ts [/system clock get time];
        :if ([:len $1]>19) do={:set ds "$[:pick $1 0 11]"; :set ts [:pick $1 12 20]};
        :if ([:len $1]>8 && [:len $1]<20) do={:set ds "$[:pick $1 0 6]/$[:pick $ds 7 11]"; :set ts [:pick $1 7 15]};
        :local yesterday false;
        :if ([:len $1]=8) do={
            :if ([:totime $1]>ts) do={:set yesterday (true)};
            :set ts $1;
        }
        :local months;
        :if ((([:pick $ds 9 11]-1)/4)!=(([:pick $ds 9 11])/4)) do={
            :set months {"an"=0;"eb"=31;"ar"=60;"pr"=91;"ay"=121;"un"=152;"ul"=182;"ug"=213;"ep"=244;"ct"=274;"ov"=305;"ec"=335};
        } else={
            :set months {"an"=0;"eb"=31;"ar"=59;"pr"=90;"ay"=120;"un"=151;"ul"=181;"ug"=212;"ep"=243;"ct"=273;"ov"=304;"ec"=334};
        }
        :set ds (([:pick $ds 9 11]*365)+(([:pick $ds 9 11]-1)/4)+($months->[:pick $ds 1 3])+[:pick $ds 4 6]);
        :set ts (([:pick $ts 0 2]*3600)+([:pick $ts 3 5]*60)+[:pick $ts 6 8]);
        :if (yesterday) do={:set ds ($ds-1)};
        :return ($ds*86400+$ts+946684800-[/system clock get gmt-offset]);
    }

    # Time conversion function from UNIX-time
    # https://forummikrotik.ru/viewtopic.php?t=11636
    # usage: [$UnixTimeToFormat "timeStamp" "type"]
    # type: "unspecified" - month/dd/yyyy <only>    (Mikrotik sheduller format)
    #                   1 - yyyy/mm/dd hh:mm:ss
    #                   2 - dd:mm:yyyy hh:mm:ss
    #                   3 - dd month yyy hh mm ss
    #                   4 - yyyy month dd hh mm ss
    #                   5 - month/dd/yyyy-hh:mm:ss  (Mikrotik sheduller format)
    :local UnixTimeToFormat do={
        :local decodedLine "";
        :local timeStamp $1;
        :local timeS ($timeStamp%86400);
        :local timeH ($timeS/3600);
        :local timeM ($timeS%3600 /60);
        :set  $timeS ($timeS-$timeH*3600-$timeM*60);
        :local dateD ($timeStamp/86400);
        :local dateM 2;
        :local dateY 1970;
        :local leap false;
        :while (($dateD/365)>0) do={
            :set $dateD ($dateD-365);
            :set $dateY ($dateY+1);
            :set $dateM ($dateM+1);
            :if ($dateM=4) do={
                :set $dateM 0;
                :if (($dateY%400=0) or ($dateY%100!=0)) do={:set $leap true; :set $dateD ($dateD-1)};
            } else={:set $leap false};
        }
        :local months [:toarray (0,31,28,31,30,31,30,31,31,30,31,30,31)];
        :if (leap) do={:set $dateD ($dateD+1); :set ($months->2) 29};
        :do {
            :for i from=1 to=12 do={
                :if (($months->$i)>$dateD) do={
                    :set $dateM $i;
                    :set $dateD ($dateD+1);
                    break;
                } else={:set $dateD ($dateD-($months->$i))};
            }
        } on-error={};
        :local tmod;
        :if ([:len $2]!=0) do={:set $tmod $2} else={:set $tmod (:nothing)};
        :local sl "/";
        :local mstr {"jan";"feb";"mar";"apr";"may";"jun";"jul";"aug";"sep";"oct";"nov";"dec"};
        :local strY [:tostr $dateY];
        :local strN;
        :local strD;
        :local strH;
        :local strM;
        :local strS;
        :if ($dateM>9) do={:set $strN [:tostr $dateM]} else={:set $strN ("0".[:tostr $dateM])};
        :if ($dateD>9) do={:set $strD [:tostr $dateD]} else={:set $strD ("0".[:tostr $dateD])};
        :if ($timeH>9) do={:set $strH [:tostr $timeH]} else={:set $strH ("0".[:tostr $timeH])};
        :if ($timeM>9) do={:set $strM [:tostr $timeM]} else={:set $strM ("0".[:tostr $timeM])};
        :if ($timeS>9) do={:set $strS [:tostr $timeS]} else={:set $strS ("0".[:tostr $timeS])};
        :do {
            :if ([:len $tmod]=0) do={:local mt ($mstr->($dateM-1)); :set $decodedLine ("$mt/"."$strD/"."$strY"); break};
            :if ($tmod=1) do={:set $decodedLine "$strY$sl$strN$sl$strD $strH:$strM:$strS"; break};
            :if ($tmod=2) do={:set $decodedLine "$strD$sl$strN$sl$strY $strH:$strM:$strS"; break};
            :if ($tmod=3) do={:set $decodedLine ("$strD ".($mstr->($dateM-1))." $strY $strH:$strM:$strS"); break};
            :if ($tmod=4) do={:set $decodedLine ("$strY ".($mstr->($dateM-1))." $strD $strH:$strM:$strS"); break};
            :if ($tmod=5) do={:local m ($mstr->($dateM-1)); :set $decodedLine ("$m/"."$strD/"."$strY"."-$strH:$strM:$strS"); break};
        } on-error={};
        :return ($decodedLine);
    }

    # Main body of the script
    :global timeAct;
    :global timeLog;
    :local  nameID [/system identity get name];
    :local  timeOf [/system clock get gmt-offset];
    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Start of TLGRM-script on '$nameID' router.");
    :if ([:len $scriptTlgrm]=0) do={:set scriptTlgrm true};
    :if ($scriptTlgrm) do={
        :set scriptTlgrm false;
        :if ([:len $timeAct]>0) do={:put ("$[$UnixTimeToFormat ($timeAct+$timeOf) 1] - Time when the last command was launched.")};
        :if ([:len $timeLog]>0) do={:put ("$[$UnixTimeToFormat ($timeLog+$timeOf) 1] - Time when the log entries were last sent.")};
    
        # Part of the script body to launch via Telegram
        # https://forummikrotik.ru/viewtopic.php?p=78085
        :local timeStmp [$EpochTime];
        :local urlString "https://api.telegram.org/$botID/getUpdates\?offset=-1&limit=1&allowed_updates=message";
        :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - *** Stage of launch scripts, function & commands via Telegram:");
        :if ([:len $timeAct]=0) do={
            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Time of the last launch of the command was not found.");
            :set timeAct $timeStmp;
        } else={
            :local httpResp [/tool fetch url=$urlString as-value output=user];
            :local content ($httpResp->"data");
            :if ([:len $content]>30) do={
                :local msgTxt [$MsgParser $content "text" true];
                :set   msgTxt ([:pick $msgTxt ([:find $msgTxt "/" -1]+1) [:len $msgTxt]]);
                :if ($msgTxt ~"@") do={:set $msgTxt [:pick $msgTxt 0 [:find $msgTxt "@"]]}
                :local newStr "";
                :local change "";
                :for i from=0 to=([:len $msgTxt]-1) do={
                    :local symb [:pick $msgTxt $i ($i+1)]; 
                    :if ($symb="_") do={:set change (" ")} else={:set change ($symb)}; 
                    :set $newStr ($newStr.$change);
                }
                :set msgTxt $newStr;
                :local msgAddr "";
                :if ($broadCast) do={:set $msgAddr $nameID} else={
                    :set msgAddr ([:pick $msgTxt 0 [:find $msgTxt " " -1]]);
                    :if ([:len [:find $msgTxt " "]]=0) do={:set msgAddr ("$msgTxt ")};
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Recipient of the Telegram message: '$msgAddr'");
                    :set msgTxt ([:pick $msgTxt ([:find $msgTxt $msgAddr -1]+[:len $msgAddr]+1) [:len $msgTxt]]);
                }
   # added 04/10/2022 skipping the function prefix "$"  or [$ .....]
                :if ([:pick $msgTxt 0 1]="\$") do={:set $msgTxt [:pick $msgTxt 1 [:len $msgTxt]]}
                :if (([:pick $msgTxt 0 2]="[\$") and ([:pick $msgTxt ([:len $msgTxt]-1) [:len $msgTxt]]="]")) do={:set $msgTxt [:pick $msgTxt 2 ([:len $msgTxt]-1)]}

                :if ($msgAddr=$nameID or $msgAddr="forall") do={
                    :local chatID [$MsgParser [$MsgParser $content "chat"] "id"];
                    :local userNm [$MsgParser $content "username"];
                    :set timeStmp [$MsgParser $content "date"];
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Sender of the Telegram message: $userNm");
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Command to execute: '$msgTxt'");
                    :local restline [];
                    :if ([:len [:find $msgTxt " "]]!=0) do={
                        :set restline [:pick $msgTxt ([:find $msgTxt " "]+1) [:len $msgTxt]];
                        :set msgTxt [:pick $msgTxt 0 [:find $msgTxt " "]];
                    }
                    :if ($chatID=$myChatID && $timeAct<$timeStmp) do={
                        :set timeAct $timeStmp;
                        :if ([/system script environment find name=$msgTxt]!="" && $launchFnc=true) do={   
                            :if (([/system script environment get [/system script environment find name=$msgTxt] value]="(code)") \
                                or ([:len [:find [/system script environment get [/system script environment find name=$msgTxt] value] "(eval"]]>0)) do={
                                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm launches function '$msgTxt'.");
                                :log warning ("Telegram user $userNm launches function '$msgTxt'.");
# Instead of parse 04/10/2022
                                 :execute script="[:parse [\$$msgTxt $restline]]";
                            } else={
                                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - '$msgTxt' is a global variable and not a function - no execute.");
                                :log warning ("'$msgTxt' is a global variable and not a function - no execute.");
                            }
                        }
       # added 07/10/2022 allow to perform emodji !
        :if ([:pick $msgTxt 0 1]="\5C") do={:set $msgTxt [:pick $msgTxt 1 [:len $msgTxt]]
        :if ([:find $msgTxt "\5C"]!=0) do={:local a [:pick $msgTxt 0 [:find $msgTxt "\5C"]]; :local b [:pick $msgTxt ([:find $msgTxt "\5C"]+1) [:len $msgTxt]]; :set $msgTxt ($a.$b)}}
                        :if ([/system script find name=$msgTxt]!="" && $launchScr=true) do={
                            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm activates script '$msgTxt'.");
                            :log warning ("Telegram user $userNm activates script '$msgTxt'.");
# Instead of parse 04/10/2022
                            :execute script="[[:parse \"[:parse [/system script get $msgTxt source]] $restline\"]]";
                        }
                        :if ([/system script find name=$msgTxt]="" && [/system script environment find name=$msgTxt]="" && $launchCmd=true) do={
                            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm is trying to execute command '$msgTxt'.");
                            :log warning ("Telegram user $userNm is trying to execute command '$msgTxt'.");
# Instead of parse 04/10/2022
                            :do {:execute script="[:parse \"/$msgTxt $restline\"]"} on-error={};
                        }
                    } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Wrong time to launch.")};
                } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - No command found for this device.")};
            } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Completion of response from Telegram.")};
        }

        # Part of the script body for notifications in Telegram
        # https://www.reddit.com/r/mikrotik/comments/onusoj/sending_log_alerts_to_telegram/
        :local outMsg "";
        :local logGet [:toarray [/log find ($topics~"warning" or $topics~"error" or $topics~"critical" or $topics~"caps" or $topics~"wireless" or $message~"logged in")]];
        :local logCnt [:len $logGet];
        :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - *** Stage of sending notifications to Telegram:");
        :if ([:len $timeLog]=0) do={ 
            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Time of the last log entry was not found.");
            :set outMsg (">$[/system clock get time] Telegram notification started.");
        }
        :if ($logCnt>0) do={
            :local lastTime [$EpochTime [/log get [:pick $logGet ($logCnt-1)] time]];
            :local index 0;
            :local tempTim "";
            :local tempMsg "";
            :local tempTpc "";
            :local unixTim "";
            :do {
                :set index ($index+1); 
                :set tempTim [/log get [:pick $logGet ($logCnt-$index)] time];
                :set tempTpc [/log get [:pick $logGet ($logCnt-$index)] topics];
                :set tempMsg [/log get [:pick $logGet ($logCnt-$index)] message];
                :set tempMsg (">$tempTim $tempMsg");
                :local findMacMsg ([$FindMacAddr $tempMsg]);
                :set unixTim [$EpochTime $tempTim];
                :if (($unixTim>$timeLog) && (!(($tempTpc~"caps" or $tempTpc~"wireless" or $tempTpc~"dhcp") && ($tempMsg!=$findMacMsg)))) do={
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Found log entry: $findMacMsg");
                    :set outMsg ($findMacMsg."\n".$outMsg);
                }
            } while=(($unixTim>$timeLog) && ($index<$logCnt));
            :if (([:len $timeLog]<1) or (([:len $timeLog]>0) && ($timeLog!=$lastTime) && ([:len $outMsg]>8))) do={
                :set timeLog $lastTime;
                :if ([:len $outMsg]>4096) do={:set outMsg ([:pick $outMsg 0 4096])};
                :set outMsg [$CP1251toUTF8 $outMsg];
                :local urlString ("https://api.telegram.org/$botID/sendmessage\?chat_id=$myChatID&text=$nameID:%0A$outMsg");
                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Generated string for Telegram:\r\n".$urlString);
                /tool fetch url=$urlString as-value output=user;
            } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - There are no log entries to send.")};
        } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Necessary log entries were not found.")};
        :set scriptTlgrm true;
    } else={:put "$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Script already being executed..."};
    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - End of TLGRM-script on '$nameID' router.");
} on-error={
    :set scriptTlgrm true;
    :put ("Script error: something didn't work when sending a request to Telegram.");
    :put ("*** First, check the correctness of the values of the variables botID & myChatID. ***"); 
}


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1598
Зарегистрирован: 15 сен 2017, 09:03

Обновленная версия TLGRM от 17.10.2022

добавлено игнорирование регистра identity роутера, что позволяет не менять identity большинства ранее настроенных девайсов для корректной работы с командами чата. Проблема описывалась здесь: viewtopic.php?p=85108#p85108
ID роутеров и названия скриптов могут состоять только из цифр и маленьких латинских букв (заглавные буквы, пробелы, знаки подчёркивания, спецсимволы и кириллица недопустимы!!!).
Теперь заглавные буквы в ID-роутеров допустимы ! остальные перечисленные ограничения остаются.

то есть если Ваш роутер имеет /system identity например, MikroTik1 Вы можете подавать команду ему как для /mikrotik1
такие команды будут выполнены TLGRM. В списке команд бота Вы можете заполнять список как:
/mikrotik1_command1
/mikrotik1_command2
и они будут выполняться по "одному касанию" обновленной версией TLGRM роутера MikroTik1 благодаря введенному игнорированию регистра

Код: Выделить всё

# TLGRM - combined notifications script & launch of commands (scripts & functions) via Telegram
# Script uses ideas by Sertik, Virtue, Pepelxl, Dimonw, -13-, Jotne, Alice Tails, Chupaka, drPioneer
# https://forummikrotik.ru/viewtopic.php?p=81945#p81945
# tested on ROS 6.49.6
# updated 2022/10/17


:global scriptTlgrm;        # Flag of the running script:   false=>in progress, true=>idle

:do {
    :local botID    "botXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    :local myChatID "-XXXXXXXXX";
    :local broadCast false; # Non-addressed reception mode
    :local launchScr true;  # Permission to execute scripts
    :local launchFnc true;  # Permission to perform functions
    :local launchCmd true;  # Permission to execute commands

    # Function of searching comments for MAC-address
    # https://forummikrotik.ru/viewtopic.php?p=73994#p73994
    :local FindMacAddr do={
        :if ($1~"[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
            :foreach idx in=[/ip dhcp-server lease find disabled=no] do={
                :local mac [/ip dhcp-server lease get $idx mac-address];
                :if ($1~"$mac") do={:return ("$1 [$[/ip dhcp-server lease get $idx address]/$[/ip dhcp-server lease get $idx comment]].")};
            }
            :foreach idx in=[/interface bridge host find] do={
                :local mac [/interface bridge host get $idx mac-address];
                :if ($1~"$mac") do={:return ("$1 [$[/interface bridge host get $idx on-interface]].")};
            }
        }
        :return ($1);
    }

    # Function of converting CP1251 to UTF8
    # https://forummikrotik.ru/viewtopic.php?p=81457#p81457
    :local CP1251toUTF8 do={
        :local cp1251 [:toarray {
            "\20";"\01";"\02";"\03";"\04";"\05";"\06";"\07";"\08";"\09";"\0A";"\0B";"\0C";"\0D";"\0E";"\0F";\
            "\10";"\11";"\12";"\13";"\14";"\15";"\16";"\17";"\18";"\19";"\1A";"\1B";"\1C";"\1D";"\1E";"\1F";\
            "\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\3A";\
            "\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\7B";"\7C";"\7D";"\7E";\
            "\C0";"\C1";"\C2";"\C3";"\C4";"\C5";"\C6";"\C7";"\C8";"\C9";"\CA";"\CB";"\CC";"\CD";"\CE";"\CF";\
            "\D0";"\D1";"\D2";"\D3";"\D4";"\D5";"\D6";"\D7";"\D8";"\D9";"\DA";"\DB";"\DC";"\DD";"\DE";"\DF";\
            "\E0";"\E1";"\E2";"\E3";"\E4";"\E5";"\E6";"\E7";"\E8";"\E9";"\EA";"\EB";"\EC";"\ED";"\EE";"\EF";\
            "\F0";"\F1";"\F2";"\F3";"\F4";"\F5";"\F6";"\F7";"\F8";"\F9";"\FA";"\FB";"\FC";"\FD";"\FE";"\FF";\
            "\A8";"\B8";"\B9"}];
        :local utf8 [:toarray {
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"000A";"0020";"0020";"000D";"0020";"0020";\
            "0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";"0020";\
            "0021";"0022";"0023";"0024";"0025";"0026";"0027";"0028";"0029";"002A";"002B";"002C";"002D";"002E";"002F";"003A";\
            "003B";"003C";"003D";"003E";"003F";"0040";"005B";"005C";"005D";"005E";"005F";"0060";"007B";"007C";"007D";"007E";\
            "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";"2116"}];
        :local convStr ""; 
        :local code "";
        :for i from=0 to=([:len $1]-1) do={
            :local symb [:pick $1 $i ($i+1)]; 
            :local idx [:find $cp1251 $symb];
            :local key ($utf8->$idx);
            :if ([:len $key]!=0) do={
                :set $code ("%$[:pick ($key) 0 2]%$[:pick ($key) 2 4]");
                :if ([pick $code 0 3]="%00") do={:set $code ([:pick $code 3 6])};
            } else={:set code ($symb)}; 
            :set $convStr ($convStr.$code);
        }
        :return ($convStr);
    }

# convert string to lowstring
:local fsLowStr do={
  :local fsLowerChar do={
    :local "fs_lower" "0123456789abcdefghijklmnopqrstuvwxyz";
    :local "fs_upper" "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    :local pos [:find $"fs_upper" $1]
      :if ($pos > -1) do={:return [:pick $"fs_lower" $pos];}
       :return $1}
:local result ""; :local in $1
  :for i from=0 to=([:len $in] - 1) do={
    :set result ($result . [$fsLowerChar [:pick $in $i]])}
    :return $result;
}

    # Telegram messenger response parsing function
    # https://habr.com/ru/post/482802/
    :local MsgParser do={
        :local variaMod ("\"".$2."\"");
        :if ([:len [:find $1 $variaMod -1]]=0) do={:return ("'unknown'")};
        :local startLoc ([:find $1 $variaMod -1]+[:len $variaMod]+1);
        :local commaLoc ([:find $1 "," $startLoc]);
        :local brakeLoc ([:find $1 "}" $startLoc]);
        :local endLoc $commaLoc;
        :local startSymbol [:pick $1 $startLoc];
        :if ($brakeLoc!=0 and ($commaLoc=0 or $brakeLoc<$commaLoc)) do={:set endLoc $brakeLoc};
        :if ($startSymbol="{") do={:set endLoc ($brakeLoc+1)};
        :if ($3=true) do={:set startLoc ($startLoc+1); :set endLoc ($endLoc-1)};
        :if ($endLoc<$startLoc) do={:set endLoc ($startLoc+1)};
        :return ([:pick $1 $startLoc $endLoc]);
    }

    # Time translation function to UNIX-time
    # https://forum.mikrotik.com/viewtopic.php?t=75555#p790745
    # Usage: $EpochTime [time input]
    # Get current time: put [$EpochTime]
    # Read log time in one of three format: "hh:mm:ss", "mmm/dd hh:mm:ss" or "mmm/dd/yyyy hh:mm:ss"
    :local EpochTime do={
        :local ds [/system clock get date];
        :local ts [/system clock get time];
        :if ([:len $1]>19) do={:set ds "$[:pick $1 0 11]"; :set ts [:pick $1 12 20]};
        :if ([:len $1]>8 && [:len $1]<20) do={:set ds "$[:pick $1 0 6]/$[:pick $ds 7 11]"; :set ts [:pick $1 7 15]};
        :local yesterday false;
        :if ([:len $1]=8) do={
            :if ([:totime $1]>ts) do={:set yesterday (true)};
            :set ts $1;
        }
        :local months;
        :if ((([:pick $ds 9 11]-1)/4)!=(([:pick $ds 9 11])/4)) do={
            :set months {"an"=0;"eb"=31;"ar"=60;"pr"=91;"ay"=121;"un"=152;"ul"=182;"ug"=213;"ep"=244;"ct"=274;"ov"=305;"ec"=335};
        } else={
            :set months {"an"=0;"eb"=31;"ar"=59;"pr"=90;"ay"=120;"un"=151;"ul"=181;"ug"=212;"ep"=243;"ct"=273;"ov"=304;"ec"=334};
        }
        :set ds (([:pick $ds 9 11]*365)+(([:pick $ds 9 11]-1)/4)+($months->[:pick $ds 1 3])+[:pick $ds 4 6]);
        :set ts (([:pick $ts 0 2]*3600)+([:pick $ts 3 5]*60)+[:pick $ts 6 8]);
        :if (yesterday) do={:set ds ($ds-1)};
        :return ($ds*86400+$ts+946684800-[/system clock get gmt-offset]);
    }

    # Time conversion function from UNIX-time
    # https://forummikrotik.ru/viewtopic.php?t=11636
    # usage: [$UnixTimeToFormat "timeStamp" "type"]
    # type: "unspecified" - month/dd/yyyy <only>    (Mikrotik sheduller format)
    #                   1 - yyyy/mm/dd hh:mm:ss
    #                   2 - dd:mm:yyyy hh:mm:ss
    #                   3 - dd month yyy hh mm ss
    #                   4 - yyyy month dd hh mm ss
    #                   5 - month/dd/yyyy-hh:mm:ss  (Mikrotik sheduller format)
    :local UnixTimeToFormat do={
        :local decodedLine "";
        :local timeStamp $1;
        :local timeS ($timeStamp%86400);
        :local timeH ($timeS/3600);
        :local timeM ($timeS%3600 /60);
        :set  $timeS ($timeS-$timeH*3600-$timeM*60);
        :local dateD ($timeStamp/86400);
        :local dateM 2;
        :local dateY 1970;
        :local leap false;
        :while (($dateD/365)>0) do={
            :set $dateD ($dateD-365);
            :set $dateY ($dateY+1);
            :set $dateM ($dateM+1);
            :if ($dateM=4) do={
                :set $dateM 0;
                :if (($dateY%400=0) or ($dateY%100!=0)) do={:set $leap true; :set $dateD ($dateD-1)};
            } else={:set $leap false};
        }
        :local months [:toarray (0,31,28,31,30,31,30,31,31,30,31,30,31)];
        :if (leap) do={:set $dateD ($dateD+1); :set ($months->2) 29};
        :do {
            :for i from=1 to=12 do={
                :if (($months->$i)>$dateD) do={
                    :set $dateM $i;
                    :set $dateD ($dateD+1);
                    break;
                } else={:set $dateD ($dateD-($months->$i))};
            }
        } on-error={};
        :local tmod;
        :if ([:len $2]!=0) do={:set $tmod $2} else={:set $tmod (:nothing)};
        :local sl "/";
        :local mstr {"jan";"feb";"mar";"apr";"may";"jun";"jul";"aug";"sep";"oct";"nov";"dec"};
        :local strY [:tostr $dateY];
        :local strN;
        :local strD;
        :local strH;
        :local strM;
        :local strS;
        :if ($dateM>9) do={:set $strN [:tostr $dateM]} else={:set $strN ("0".[:tostr $dateM])};
        :if ($dateD>9) do={:set $strD [:tostr $dateD]} else={:set $strD ("0".[:tostr $dateD])};
        :if ($timeH>9) do={:set $strH [:tostr $timeH]} else={:set $strH ("0".[:tostr $timeH])};
        :if ($timeM>9) do={:set $strM [:tostr $timeM]} else={:set $strM ("0".[:tostr $timeM])};
        :if ($timeS>9) do={:set $strS [:tostr $timeS]} else={:set $strS ("0".[:tostr $timeS])};
        :do {
            :if ([:len $tmod]=0) do={:local mt ($mstr->($dateM-1)); :set $decodedLine ("$mt/"."$strD/"."$strY"); break};
            :if ($tmod=1) do={:set $decodedLine "$strY$sl$strN$sl$strD $strH:$strM:$strS"; break};
            :if ($tmod=2) do={:set $decodedLine "$strD$sl$strN$sl$strY $strH:$strM:$strS"; break};
            :if ($tmod=3) do={:set $decodedLine ("$strD ".($mstr->($dateM-1))." $strY $strH:$strM:$strS"); break};
            :if ($tmod=4) do={:set $decodedLine ("$strY ".($mstr->($dateM-1))." $strD $strH:$strM:$strS"); break};
            :if ($tmod=5) do={:local m ($mstr->($dateM-1)); :set $decodedLine ("$m/"."$strD/"."$strY"."-$strH:$strM:$strS"); break};
        } on-error={};
        :return ($decodedLine);
    }

    # Main body of the script
    :global timeAct;
    :global timeLog;
# updated 2022/10/17 added ignore registre identity
    :local  nameID [$fsLowStr [/system identity get name]];
    :local  timeOf [/system clock get gmt-offset];
    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Start of TLGRM-script on '$nameID' router.");
    :if ([:len $scriptTlgrm]=0) do={:set scriptTlgrm true};
    :if ($scriptTlgrm) do={
        :set scriptTlgrm false;
        :if ([:len $timeAct]>0) do={:put ("$[$UnixTimeToFormat ($timeAct+$timeOf) 1] - Time when the last command was launched.")};
        :if ([:len $timeLog]>0) do={:put ("$[$UnixTimeToFormat ($timeLog+$timeOf) 1] - Time when the log entries were last sent.")};
    
        # Part of the script body to launch via Telegram
        # https://forummikrotik.ru/viewtopic.php?p=78085
        :local timeStmp [$EpochTime];
        :local urlString "https://api.telegram.org/$botID/getUpdates\?offset=-1&limit=1&allowed_updates=message";
        :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - *** Stage of launch scripts, function & commands via Telegram:");
        :if ([:len $timeAct]=0) do={
            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Time of the last launch of the command was not found.");
            :set timeAct $timeStmp;
        } else={
            :local httpResp [/tool fetch url=$urlString as-value output=user];
            :local content ($httpResp->"data");
            :if ([:len $content]>30) do={
                :local msgTxt [$MsgParser $content "text" true];
                :set   msgTxt ([:pick $msgTxt ([:find $msgTxt "/" -1]+1) [:len $msgTxt]]);
                :if ($msgTxt ~"@") do={:set $msgTxt [:pick $msgTxt 0 [:find $msgTxt "@"]]}
                :local newStr "";
                :local change "";
                :for i from=0 to=([:len $msgTxt]-1) do={
                    :local symb [:pick $msgTxt $i ($i+1)]; 
                    :if ($symb="_") do={:set change (" ")} else={:set change ($symb)}; 
                    :set $newStr ($newStr.$change);
                }
                :set msgTxt $newStr;
                :local msgAddr "";
                :if ($broadCast) do={:set $msgAddr $nameID} else={
                    :set msgAddr ([:pick $msgTxt 0 [:find $msgTxt " " -1]]);
# updated 2022/10/17 added ignore registre identity
                    :set msgAddr [$fsLowStr $msgAddr]
                    :if ([:len [:find $msgTxt " "]]=0) do={:set msgAddr ("$msgTxt ")};
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Recipient of the Telegram message: '$msgAddr'");
                    :set msgTxt ([:pick $msgTxt ([:find $msgTxt $msgAddr -1]+[:len $msgAddr]+1) [:len $msgTxt]]);
                }
   # added 04/10/2022 skipping the function prefix "$"  or [$ .....]
                :if ([:pick $msgTxt 0 1]="\$") do={:set $msgTxt [:pick $msgTxt 1 [:len $msgTxt]]}
                :if (([:pick $msgTxt 0 2]="[\$") and ([:pick $msgTxt ([:len $msgTxt]-1) [:len $msgTxt]]="]")) do={:set $msgTxt [:pick $msgTxt 2 ([:len $msgTxt]-1)]}

                :if ($msgAddr=$nameID or $msgAddr="forall") do={
                    :local chatID [$MsgParser [$MsgParser $content "chat"] "id"];
                    :local userNm [$MsgParser $content "username"];
                    :set timeStmp [$MsgParser $content "date"];
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Sender of the Telegram message: $userNm");
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Command to execute: '$msgTxt'");
                    :local restline [];
                    :if ([:len [:find $msgTxt " "]]!=0) do={
                        :set restline [:pick $msgTxt ([:find $msgTxt " "]+1) [:len $msgTxt]];
                        :set msgTxt [:pick $msgTxt 0 [:find $msgTxt " "]];
                    }
                    :if ($chatID=$myChatID && $timeAct<$timeStmp) do={
                        :set timeAct $timeStmp;
                        :if ([/system script environment find name=$msgTxt]!="" && $launchFnc=true) do={   
                            :if (([/system script environment get [/system script environment find name=$msgTxt] value]="(code)") \
                                or ([:len [:find [/system script environment get [/system script environment find name=$msgTxt] value] "(eval"]]>0)) do={
                                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm launches function '$msgTxt'.");
                                :log warning ("Telegram user $userNm launches function '$msgTxt'.");
# Instead of parse 04/10/2022
                                 :execute script="[:parse [\$$msgTxt $restline]]";
                            } else={
                                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - '$msgTxt' is a global variable and not a function - no execute.");
                                :log warning ("'$msgTxt' is a global variable and not a function - no execute.");
                            }
                        }
       # added 07/10/2022 allow to perform emodji !
        :if ([:pick $msgTxt 0 1]="\5C") do={:set $msgTxt [:pick $msgTxt 1 [:len $msgTxt]]
        :if ([:find $msgTxt "\5C"]!=0) do={:local a [:pick $msgTxt 0 [:find $msgTxt "\5C"]]; :local b [:pick $msgTxt ([:find $msgTxt "\5C"]+1) [:len $msgTxt]]; :set $msgTxt ($a.$b)}}
                        :if ([/system script find name=$msgTxt]!="" && $launchScr=true) do={
                            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm activates script '$msgTxt'.");
                            :log warning ("Telegram user $userNm activates script '$msgTxt'.");
# Instead of parse 04/10/2022
                            :execute script="[[:parse \"[:parse [/system script get $msgTxt source]] $restline\"]]";
                        }
                        :if ([/system script find name=$msgTxt]="" && [/system script environment find name=$msgTxt]="" && $launchCmd=true) do={
                            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Telegram user $userNm is trying to execute command '$msgTxt'.");
                            :log warning ("Telegram user $userNm is trying to execute command '$msgTxt'.");
# Instead of parse 04/10/2022
                            :do {:execute script="[:parse \"/$msgTxt $restline\"]"} on-error={};
                        }
                    } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Wrong time to launch.")};
                } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - No command found for this device.")};
            } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Completion of response from Telegram.")};
        }

        # Part of the script body for notifications in Telegram
        # https://www.reddit.com/r/mikrotik/comments/onusoj/sending_log_alerts_to_telegram/
        :local outMsg "";
        :local logGet [:toarray [/log find ($topics~"warning" or $topics~"error" or $topics~"critical" or $topics~"caps" or $topics~"wireless" or $message~"logged in")]];
        :local logCnt [:len $logGet];
        :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - *** Stage of sending notifications to Telegram:");
        :if ([:len $timeLog]=0) do={ 
            :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Time of the last log entry was not found.");
            :set outMsg (">$[/system clock get time] Telegram notification started.");
        }
        :if ($logCnt>0) do={
            :local lastTime [$EpochTime [/log get [:pick $logGet ($logCnt-1)] time]];
            :local index 0;
            :local tempTim "";
            :local tempMsg "";
            :local tempTpc "";
            :local unixTim "";
            :do {
                :set index ($index+1); 
                :set tempTim [/log get [:pick $logGet ($logCnt-$index)] time];
                :set tempTpc [/log get [:pick $logGet ($logCnt-$index)] topics];
                :set tempMsg [/log get [:pick $logGet ($logCnt-$index)] message];
                :set tempMsg (">$tempTim $tempMsg");
                :local findMacMsg ([$FindMacAddr $tempMsg]);
                :set unixTim [$EpochTime $tempTim];
                :if (($unixTim>$timeLog) && (!(($tempTpc~"caps" or $tempTpc~"wireless" or $tempTpc~"dhcp") && ($tempMsg!=$findMacMsg)))) do={
                    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Found log entry: $findMacMsg");
                    :set outMsg ($findMacMsg."\n".$outMsg);
                }
            } while=(($unixTim>$timeLog) && ($index<$logCnt));
            :if (([:len $timeLog]<1) or (([:len $timeLog]>0) && ($timeLog!=$lastTime) && ([:len $outMsg]>8))) do={
                :set timeLog $lastTime;
                :if ([:len $outMsg]>4096) do={:set outMsg ([:pick $outMsg 0 4096])};
                :set outMsg [$CP1251toUTF8 $outMsg];
                :local urlString ("https://api.telegram.org/$botID/sendmessage\?chat_id=$myChatID&text=$[/system identity get name]:%0A$outMsg");
                :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Generated string for Telegram:\r\n".$urlString);
                /tool fetch url=$urlString as-value output=user;
            } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - There are no log entries to send.")};
        } else={:put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Necessary log entries were not found.")};
        :set scriptTlgrm true;
    } else={:put "$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - Script already being executed..."};
    :put ("$[$UnixTimeToFormat ([$EpochTime]+$timeOf) 1] - End of TLGRM-script on '$nameID' router.");
} on-error={
    :set scriptTlgrm true;
    :put ("Script error: something didn't work when sending a request to Telegram.");
    :put ("*** First, check the correctness of the values of the variables botID & myChatID. ***"); 
}


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
sergey.yv
Сообщения: 3
Зарегистрирован: 26 окт 2022, 10:24

Добрый день.

Спасибо за проделанную вами работу.

У меня возникло пару вопросов

запрос в телеге
/home system identity

home:
>10:25:51 Telegram user 'unknown' is trying to execute command 'system'.

при этом
/home_test
->
home:
>10:30:40 Telegram user 'unknown' activates script 'test'.
>10:30:40 SSSSSUPERRRR

Скрипт выполняется но ругается на пользователя. ROS 7.1


Ответить