Fora aktivigo de Mikrotik-skriptoj de Telegram v 2.0

Feliĉan malfruan ferion al ĉiuj. Ĉi tiu temo estas pli bona versio de tio, kion mi skribis en 2016 ĉi tie.

Ĝenerale, la principo de funkciado ne ŝanĝiĝis, la sola diferenco estas, ke nun ĝi funkcias tuj sen prokrasto.

Ni alŝutas la skripton al Mikrotik, ŝanĝas la BotID kaj ChatID al niaj propraj kaj kreas horaron por ĝi. Agordu la parametron "Komenca Tempo" al ekfunkciigo (Rulu la skripton ĉe ekfunkciigo.)
"Intervalo": 00:00:00
Alie ĉio estas tia, kia ĝi estis.

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

Post kelkaj jaroj da uzo, cimo estis malkovrita: pro iu nekonata kialo, malforta Mikrotik ĉesigas la skripton, sed ĉe pli potencaj ĝi funkcias senhalte.

Por ĉi tiuj celoj, mi ĵetis la lambastonon WatchDog. Ĉi tie ni ŝanĝas la nomon de la skripto al tiu supre indikita. kaj starigu la rekomencan intervalon al 5 minutoj. Ĉiujn 5 minutojn nia "gardisto" kontrolos la skripton kaj se ĝi ne funkcias, ĝi ruligos ĝin.

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

Nu, por deserto, la skripto estis prenita el la forumo Mikrotik.
Sendas gravajn temojn de la protokolo al nia ĉaro.

Ni aldonas la skripton por plani kaj specifi la rekomencan intervalon ĉiujn 5 minutojn, ŝanĝas BotID kaj ChatID al niaj propraj.

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

Ni ricevas la rezulton:

Fora aktivigo de Mikrotik-skriptoj de Telegram v 2.0

fonto: www.habr.com

Aldoni komenton