Toți cu sărbătoarea care a trecut. Această temă este o versiune mai bună .
În general, principiul de funcționare nu s-a schimbat, cu excepția că acum funcționează instantaneu, fără întârzieri.
Încărcăm scriptul în Mikrotik, schimbăm BotID și ChatID cu ale noastre și creăm un program pentru acesta. Setăm parametrul „Start Time” la startup (Pornirea scriptului la start.)
„Interval”: 00:00:00
În rest, totul e ca înainte.
Telegram-v2
:delay 10
:global mtIdentity [
/system identity get name];
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;
:local chatId 0;
:local messageId 0;
:local parse do={
:local startLoc ([:find $content $variable -1] + [:len $variable] + 2);
:local commaLoc ([:find $content "," $startLoc] - 1 + 1);
:local braceLoc ([:find $content "}" $startLoc] - 1 + 1);
:local endLoc $commaLoc;
:local startSymbol [:pick $content $startLoc]
:if ($braceLoc != 0 and ($commaLoc = 0 or $braceLoc < $commaLoc)) do={
:set endLoc $braceLoc;
};
:if ($startSymbol = "{") do={
:set endLoc ($braceLoc + 1);
};
:if ($quotas = true) do={
:set startLoc ($startLoc + 1);
:set endLoc ($endLoc - 1);
}
:if ($endLoc 30) do={
:set messageId ([$parse content=$content variable="update_id"] + 1)
:local message [$parse content=$content variable="text" quotas=true]
:local chat [$parse content=$content variable="chat"]
:local chatId [$parse content=$chat variable="id"]
:if (($chatId = $myChatID) and [/system script find name=$message] != "") do={
/system script run $message;
} else={
:tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$chatId&text=$mtIdentity: Unknown command: $message") keep-result=no
}
}
} on-error={}
};În cei câțiva ani de utilizare am descoperit un bug, din motive inexplicabile, Mikrotik-uri slabe opresc dintr-o dată scriptul, pe cele mai puternice funcționează fără opriri.
Pentru aceste scopuri am creat un workaround WatchDog. Aici schimbăm numele scriptului cu cel menționat mai sus și setăm intervalul de repornire la 5 minute. La fiecare 5 minute, „câinele de pază” va verifica scriptul și, dacă nu funcționează, îl va reporni.
WatchDogT.me
:global scriptname "t.me"
:if ([:len [/system script job find script="$scriptname"]] > 0) do={
:log info "$scriptname Deja rulează - terminând vechiul script înainte de a continua"
:foreach counter in=[/system script job find script="$scriptname"] do={
/system script job remove $counter
}
}
/system script run $scriptnameȘi ca un bonus, scriptul a fost preluat de pe forumul Mikrotik.
Trimite subiecte importante din log în telegramă.
Adăugăm scriptul în schedule și specificăm intervalul de repornire la fiecare 5 minute, schimbând BotID și ChatID cu ale noastre.
Notify-log
:global lastTime
:global output
:global mtIdentity [ /system identity get name];
:global botID "botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXX" ;
:global myChatID "YYYYYY" ;
:local LogGet [ :toarray [ /log find topics~"critical" || message~"login failure" || message~"[Ff]ailure" ] ] ;
:local LogtLineCount [ :len $LogGet ] ;
if ($LogtLineCount > 0) do={
:local currentTime "$[ /log get [ :pick $LogGet ($LogtLineCount -1) ] time ]";
:if ([:len $currentTime] = 10 ) do={
:set currentTime [ :pick $currentTime 0 10 ];
}
:set output "$currentTime - $[/log get [ :pick $LogGet ($LogtLineCount-1) ] message ]";
:if (([:len $lastTime] 0) && ($lastTime != $currentTime))) do={
:set lastTime $currentTime ;
:tool fetch url=("https://api.telegram.org/$botID/sendmessage?chat_id=$myChatID&text="$mtIdentity" : $output") keep-result=no
}
}Vom obține rezultatul:

Sursa: habr.com
