Kích hoạt từ xa các tập lệnh Mikrotik từ Telegram v 2.0

Chúc mọi người nghỉ lễ muộn vui vẻ. Chủ đề này tốt hơn phiên bản của những gì tôi đã viết vào năm 2016 tại đây.

Nhìn chung, nguyên lý hoạt động không có gì thay đổi, điểm khác biệt duy nhất là giờ đây nó hoạt động ngay lập tức không chậm trễ.

Chúng tôi tải tập lệnh lên Mikrotik, thay đổi BotID và ChatID thành tập lệnh của riêng chúng tôi và tạo lịch trình cho tập lệnh đó. Đặt tham số “Thời gian bắt đầu” thành khởi động (Chạy tập lệnh khi khởi động.)
"Khoảng": 00:00:00
Nếu không thì mọi thứ vẫn như cũ.

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

Sau một vài năm sử dụng, một lỗi đã được phát hiện: vì lý do nào đó không rõ, Mikrotik yếu đã dừng tập lệnh, nhưng trên những tập lệnh mạnh hơn thì nó hoạt động không ngừng.

Vì những mục đích này, tôi đã sử dụng chiếc nạng WatchDog. Ở đây chúng tôi thay đổi tên của tập lệnh thành tên được chỉ ra ở trên. và đặt khoảng thời gian khởi động lại là 5 phút. Cứ sau 5 phút, "cơ quan giám sát" của chúng tôi sẽ kiểm tra tập lệnh và nếu nó không hoạt động, nó sẽ chạy nó.

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

Chà, để tráng miệng, kịch bản được lấy từ diễn đàn Mikrotik.
Gửi các chủ đề quan trọng từ nhật ký đến giỏ hàng của chúng tôi.

Chúng tôi thêm tập lệnh để lên lịch và chỉ định khoảng thời gian khởi động lại sau mỗi 5 phút, thay đổi BotID và ChatID thành tập lệnh của riêng chúng tôi.

Nhật ký thông báo

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

Chúng tôi nhận được kết quả:

Kích hoạt từ xa các tập lệnh Mikrotik từ Telegram v 2.0

Nguồn: www.habr.com

Thêm một lời nhận xét