Pembolehan jauh skrip Mikrotik daripada Telegram v 2.0

Selamat bercuti terlewat kepada semua. Tema ini lebih baik versi apa yang saya tulis pada tahun 2016 di sini.

Secara umum, prinsip operasi tidak berubah, satu-satunya perbezaan ialah kini ia berfungsi serta-merta tanpa berlengah-lengah.

Kami memuat naik skrip ke Mikrotik, menukar BotID dan ChatID kepada kami sendiri dan membuat jadual untuknya. Tetapkan parameter "Masa Mula" kepada permulaan (Jalankan skrip semasa permulaan.)
"Selang": 00:00:00
Jika tidak semuanya seperti sedia ada.

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

Selepas beberapa tahun penggunaan, pepijat ditemui: atas sebab yang tidak diketahui, Mikrotik yang lemah menghentikan skrip, tetapi pada yang lebih berkuasa ia berfungsi tanpa henti.

Untuk tujuan ini, saya melemparkan tongkat WatchDog. Di sini kita menukar nama skrip kepada yang ditunjukkan di atas. dan tetapkan selang mula semula kepada 5 minit. Setiap 5 minit "anjing pengawas" kami akan menyemak skrip dan jika ia tidak berfungsi, ia akan menjalankannya.

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

Nah, untuk pencuci mulut, skrip diambil dari forum Mikrotik.
Menghantar topik penting dari log ke troli kami.

Kami menambah skrip untuk menjadualkan dan menentukan selang mula semula setiap 5 minit, menukar BotID dan ChatID kepada kami sendiri.

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

Kami mendapat hasilnya:

Pembolehan jauh skrip Mikrotik daripada Telegram v 2.0

Sumber: www.habr.com

Tambah komen