Inclusion à distance des scripts Mikrotik de Telegram v 2.0

Tout avec les vacances passées. Ce sujet est une meilleure version de ce que j'ai écrit en 2016 ici .

En général, le principe du travail n'a pas changé, la seule différence étant qu'il fonctionne maintenant instantanément sans délai.

Nous téléchargeons le script dans Mikrotik, changeons BotID et ChatID en nôtres et créons un calendrier pour cela. Définissez le paramètre «Heure de début» sur démarrage (exécutez le script au démarrage.)
Intervalle: 00:00:00
Sinon, tout est comme ça.

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 < $startLoc) do={ :set endLoc ($startLoc + 1); }; :local message [:pick $content $startLoc $endLoc] #:log info $message; :return $message; } :while ( true ) do={ :do { #:log info "https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60"; :tool fetch url=("https://api.telegram.org/$botID/getUpdates\?offset=$messageId&limit=1&allowed_updates=message&timeout=60") dst-path="getUpdates"; :local content [/file get [/file find name=getUpdates] contents] ; #:log info $content; :if ([:len $content] > 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={} }; 


Pendant quelques années d'utilisation, un bug a été découvert, pour une raison quelconque, Mikrotik faible pour une raison quelconque arrête le script, il fonctionne sans s'arrêter sur les plus puissants.

À ces fins, j'ai jeté une béquille WatchDog. ici, nous changeons le nom du script en celui indiqué ci-dessus. et définissez l'intervalle de redémarrage sur 5 minutes. Toutes les 5 minutes, notre «chien qui regarde» vérifiera le script, et si cela ne fonctionne pas, il s'exécutera.

WatchDogT.me
 :global scriptname "t.me" :if ([:len [/system script job find script=$"scriptname"]] > 0) do={ :log info "$scriptname Already Running - killing old script before continuing" :foreach counter in=[/system script job find script=$"scriptname"] do={ /system script job remove $counter } } /system script run $scriptname 


Eh bien, pour le dessert, le script est tiré du forum Mikrotik.
Envoie des sujets importants du journal à notre panier.

Nous déposons le script dans le calendrier et spécifions l'intervalle de redémarrage toutes les 5 minutes, changeons BotID et ChatID en nôtres.

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] < 1) || (([: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 } } 


On obtient le résultat:

image

Source: https://habr.com/ru/post/fr482802/


All Articles