Pengaktifan skrip Mikrotik secara jarak jauh dari Telegram v 2.0

Selamat liburan yang terlambat untuk semuanya. Tema ini lebih baik versi dari apa yang saya tulis pada tahun 2016 di sini.

Secara umum prinsip pengoperasiannya tidak berubah, yang membedakan hanyalah sekarang ia bekerja secara instan tanpa penundaan.

Scriptnya kita upload ke Mikrotik, ubah BotID dan ChatID kita sendiri dan buat jadwalnya. Setel parameter β€œWaktu Mulai” ke startup (Jalankan skrip saat startup.)
"Interval": 00:00:00
Kalau tidak, semuanya akan seperti semula.

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

Setelah beberapa tahun digunakan, sebuah bug ditemukan: untuk beberapa alasan yang tidak diketahui, Mikrotik yang lemah menghentikan skrip, tetapi pada mikrotik yang lebih kuat ia bekerja tanpa henti.

Untuk tujuan ini, saya menggunakan kruk WatchDog. Di sini kita mengubah nama skrip menjadi yang ditunjukkan di atas. dan atur interval restart menjadi 5 menit. Setiap 5 menit, "anjing penjaga" kami akan memeriksa skrip dan jika tidak berhasil, 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 hidangan penutup, skripnya diambil dari forum Mikrotik.
Mengirim topik penting dari log ke keranjang kami.

Kita tambahkan script ke jadwal dan tentukan interval restart setiap 5 menit, ubah BotID dan ChatID menjadi milik kita 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 mendapatkan hasilnya:

Pengaktifan skrip Mikrotik secara jarak jauh dari Telegram v 2.0

Sumber: www.habr.com

Tambah komentar