Mikrotik-skriptien etäaktivointi Telegram v 2.0:sta

Kaikki menneen loman kera. Tämä teema on parempi versio siitä, mitä kirjoitin vuonna 2016 täällä.

Yleisesti ottaen toimintaperiaate ei ole muuttunut, sillä ainoa ero on, että nyt se toimii välittömästi ilman viivettä.

Lataamme skriptin Mikrotikiin, vaihdamme BotID:n ja ChatID:n omaksi ja luomme sille aikataulun. Aseta "Aloitusaika"-parametri käynnistykseksi (Aja komentosarja käynnistyksen yhteydessä.)
Väli: 00:00:00
Kaikki muu on niin kuin oli.

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

Parin vuoden käytön aikana paljastui bugi, jostain tuntemattomasta syystä heikko Mikrotik pysäyttää skriptin, tehokkaammilla toimii taukoamatta.

Näitä tarkoituksia varten heitin WatchDog-sauvan. tässä muutamme skriptin nimen yllä mainituksi. ja aseta uudelleenkäynnistysväliksi 5 minuuttia. 5 minuutin välein "vahtikoiramme" tarkistaa skriptin, ja jos se ei toimi, se ajaa sen.

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

Ja jälkiruoaksi käsikirjoitus on otettu Mikrotik-foorumilta.
Lähettää tärkeitä aiheita lokista ostoskoriin.

Heitä skripti aikatauluun ja määritä uudelleenkäynnistysväli 5 minuutin välein, vaihda BotID ja ChatID omaksesi.

ilmoitusloki

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

Saamme tuloksen:

Mikrotik-skriptien etäaktivointi Telegram v 2.0:sta

Lähde: will.com

Lisää kommentti