Ynskeakelje op ôfstân fan Mikrotik-skripts fan Telegram v 2.0

Noflike letfakânsje foar elkenien. Dit tema is better ferzje fan wat ik skreau werom yn 2016 hjir.

Yn it algemien is it prinsipe fan wurking net feroare, it ienige ferskil is dat it no direkt sûnder fertraging wurket.

Wy uploade it skript nei Mikrotik, feroarje de BotID en ChatID nei ús eigen en meitsje der in skema foar. Stel de parameter "Starttiid" yn op opstart (It skript útfiere by it opstarten.)
"Ynterfal": 00:00:00
Oars is alles sa't it wie.

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

Nei in pear jier fan gebrûk waard in brek ûntdutsen: om ien of oare ûnbekende reden stopet swak Mikrotik it skript, mar op machtigere wurket it sûnder stopjen.

Foar dizze doelen smiet ik de WatchDog-kruk op. Hjir feroarje wy de namme fan it skript nei de hjirboppe oantsjutte. en set it werstart ynterval op 5 minuten. Elke 5 minuten sil ús "watchdog" it skript kontrolearje en as it net wurket, sil it it útfiere.

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

No, foar neigesetsje waard it skript helle fan it Mikrotik-foarum.
Stjoert wichtige ûnderwerpen út it log nei ús karre.

Wy foegje it skript ta oan it plannen en spesifisearje it werstartynterval elke 5 minuten, feroarje BotID en ChatID nei ús eigen.

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

Wy krije it resultaat:

Ynskeakelje op ôfstân fan Mikrotik-skripts fan Telegram v 2.0

Boarne: www.habr.com

Add a comment