Fernaktivierung von Mikrotik-Skripten aus Telegram v 2.0

Alles mit dem vergangenen Feiertag. Dieses Thema ist besser Version von dem, was ich 2016 hier geschrieben habe.

Generell hat sich am Funktionsprinzip nichts geändert, mit dem einzigen Unterschied, dass es jetzt sofort und ohne Verzögerung funktioniert.

Wir laden das Skript auf Mikrotik hoch, ändern die BotID und ChatID in unsere eigenen und erstellen einen Zeitplan dafür. Stellen Sie den Parameter „Startzeit“ auf Start ein (Führen Sie das Skript beim Start aus.)
Intervall: 00:00:00
Alles andere ist wie es war.

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={}
};

Bei ein paar Jahren der Nutzung wurde aus unbekannten Gründen ein Fehler aufgedeckt. Schwaches Mikrotik stoppt aus irgendeinem Grund das Skript, bei leistungsstärkeren funktioniert es ohne Unterbrechung.

Zu diesem Zweck habe ich eine WatchDog-Krücke geworfen. Hier ändern wir den Namen des Skripts in den oben angegebenen. und stellen Sie das Neustartintervall auf 5 Minuten ein. Alle 5 Minuten überprüft unser „Wachhund“ das Skript und führt es aus, wenn es nicht funktioniert.

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

Und zum Nachtisch stammt das Skript aus dem Mikrotik-Forum.
Sendet wichtige Themen aus dem Protokoll an unseren Warenkorb.

Fügen Sie das Skript in den Zeitplan ein und geben Sie das Neustartintervall alle 5 Minuten an. Ändern Sie die BotID und die ChatID in Ihre eigenen.

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
   }
}

Wir erhalten das Ergebnis:

Fernaktivierung von Mikrotik-Skripten aus Telegram v 2.0

Source: habr.com

Kommentar hinzufügen