Фаъолсозии дурдасти скриптҳои Mikrotik аз Telegram v 2.0

Иди дершуда ба ҳама муборак. Ин мавзӯъ беҳтар аст версияи он чизе ки ман дар соли 2016 дар ин ҷо навишта будам.

Умуман, принципи кор таѓйир наёфтааст, ягона тафовут дар он аст, ки њоло он бетаъхир кор мекунад.

Мо скриптро ба Mikrotik бор мекунем, BotID ва ChatID-ро ба худамон иваз мекунем ва ҷадвали онро месозем. Параметри "Вақти оғоз" -ро барои оғозёбӣ таъин кунед (Скриптро ҳангоми оғозёбӣ иҷро кунед.)
"Фосила": 00:00:00
Дар акси ҳол ҳама чиз мисли пештара аст.

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

Пас аз чанд соли истифода, хатогӣ ошкор шуд: бо сабабҳои номаълум Микротики заиф скриптро қатъ мекунад, аммо дар қавитараш он бе таваққуф кор мекунад.

Бо ин мақсадҳо ман асои WatchDog-ро партофтам. Дар ин ҷо мо номи скриптро ба номи дар боло зикршуда иваз мекунем. ва фосилаи бозоғозро ба 5 дақиқа муқаррар кунед. Дар хар 5 дакика «саги посбон»-и мо скриптро тафтиш мекунад ва агар кор накунад, онро ба кор мебарад.

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

Хуб, барои шириниҳо, скрипт аз форуми Микротик гирифта шудааст.
Мавзӯҳои муҳимро аз журнал ба аробаи мо мефиристад.

Мо скриптро барои ҷадвал илова мекунем ва фосилаи аз нав оғоз кардани ҳар 5 дақиқаро муайян мекунем, BotID ва ChatID-ро ба худамон иваз мекунем.

Огоҳӣ-журнал

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

Мо натиҷа мегирем:

Фаъолсозии дурдасти скриптҳои Mikrotik аз Telegram v 2.0

Манбаъ: will.com

Илова Эзоҳ