Fjarvirkja Mikrotik forskriftir frá Telegram v 2.0

Gleðilega síðbúna hátíð til allra. Þetta þema er betra útgáfa af því sem ég skrifaði aftur árið 2016 hér.

Almennt hefur meginreglan um rekstur ekki breyst, eini munurinn er sá að nú virkar það samstundis án tafar.

Við hleðum upp handritinu í Mikrotik, breytum BotID og ChatID í okkar eigin og búum til áætlun fyrir það. Stilltu „Start Time“ færibreytuna á ræsingu (keyrðu handritið við ræsingu.)
"Bil": 00:00:00
Annars er allt eins og það var.

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

Eftir nokkurra ára notkun uppgötvaðist galla: af einhverjum óþekktum ástæðum stoppar veikur Mikrotik handritið, en á öflugri virkar það án þess að stoppa.

Í þessum tilgangi kastaði ég á WatchDog hækjuna. Hér breytum við nafni handritsins í það sem tilgreint er hér að ofan. og stilltu endurræsingartímabilið á 5 mínútur. Á 5 mínútna fresti mun „varðhundurinn“ okkar athuga handritið og ef það virkar ekki mun það keyra það.

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

Jæja, í eftirrétt var handritið tekið af Mikrotik spjallborðinu.
Sendir mikilvæg efni úr skránni í körfuna okkar.

Við bætum handritinu við tímaáætlun og tilgreinum endurræsingartímabilið á 5 mínútna fresti, breytum BotID og ChatID í okkar eigin.

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

Við fáum niðurstöðuna:

Fjarvirkja Mikrotik forskriftir frá Telegram v 2.0

Heimild: www.habr.com

Bæta við athugasemd