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

Alexander Koryukin đã thúc đẩy tôi thực hiện điều này GeXoGeN với ấn phẩm của mìnhBật máy tính từ xa miễn phí, không cần SMS và không có đám mây, sử dụng Mikrotik".

Và một bình luận trong một trong các nhóm VK của Kirill Kazakov:

Vâng, nó không an toàn chút nào. Tôi thà viết một bot điện tín chỉ chấp nhận các lệnh kích hoạt từ tài khoản của tôi.

Tôi quyết định viết một bot như vậy.

Vì vậy, điều đầu tiên cần làm là tạo một bot trong telegram.

  • Chúng tôi tìm thấy trong tìm kiếm một tài khoản có tên @botfather
  • Nhấp vào nút Bắt đầu ở cuối màn hình
  • Sau đó, chúng tôi viết cho anh ta lệnh / newbot

Sau đó, chúng tôi trả lời 2 câu hỏi đơn giản:

  • Câu hỏi đầu tiên là tên của bot sẽ được tạo. MyMikrotikRouter
  • Câu hỏi thứ hai là biệt danh của bot được tạo (nên kết thúc bằng bot) MikrotikROuter_bot

Đáp lại, chúng tôi sẽ nhận được mã thông báo bot của chúng tôi, trong trường hợp của tôi, đó là:

Sử dụng mã thông báo này để truy cập API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Kích hoạt từ xa các tập lệnh Mikrotik từ Telegram
Sau đó, bạn cần tìm bot của chúng tôi trong tìm kiếm theo tên @MikrotikROuter_bot và nhấn nút Bắt đầu.

Sau đó, bạn cần mở trình duyệt và nhập dòng sau:

 https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates

Trong đó XXXXXXXXXXXXXXXXXX là mã thông báo bot của bạn.

Một trang tương tự như sau sẽ mở ra:

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

Chúng tôi tìm thấy văn bản sau trên đó:

"trò chuyện":{"id":631290,

Vì vậy, chúng tôi có tất cả thông tin cần thiết để viết tập lệnh cho Mikrotik, cụ thể là:

Mã thông báo bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID trò chuyện nơi anh ấy nên viết: 631290

Để kiểm tra, chúng ta có thể thông qua trình duyệt:

https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test

Nên nhận được kết quả:

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

Để thuận tiện, chúng tôi sẽ thêm ngay các lệnh cho bot:

Tìm tài khoản có tên @botfather
Sau đó, chúng tôi viết cho anh ta một lệnh / setcommands

  • Anh ấy sẽ hỏi bot nào

Chúng tôi viết:
@MikrotikROuter_bot

Thêm lệnh:

  • helloworld< — Kiểm tra tin nhắn trên trò chuyện 1
  • itworking-Test Tin nhắn trên trò chuyện 2
  • wolmypc-đánh thức PC của tôi

Bây giờ nếu bạn gõ "/" trong cuộc trò chuyện, bạn sẽ nhận được:

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

Bây giờ hãy chuyển sang MikroTik.

RouterOS có tiện ích bảng điều khiển để sao chép tệp qua ftp hoặc http / https, tiện ích này được gọi là tìm nạp, đây là thứ chúng ta sẽ sử dụng.

Chúng tôi mở thiết bị đầu cuối và nhập:

/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no

Xin lưu ý rằng MikroTik cần "» để thoát dấu «?' trong URL.

Nên nhận được kết quả:

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

Bây giờ hãy chuyển sang tập lệnh:

Chào thế giới

system script add name="helloworld" policy=read source={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Hello,world! " keep-result=no}

nó hoạt động

system script add name="itsworking" policy=read source={/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=Test OK, it's Working " keep-result=no}

wolmypc

system script add name="wolmypc" policy=read source="/tool wol mac=XX:XX:XX:XX:XX:XX interface=ifnamer
    n/tool fetch url="https://api.telegram.org/boXXXXXXXXXXXXXXXXXXX?chat_id=631290&text=wol OK" keep-resul
    t=no"

Đừng quên chỉ định đúng mac và tên giao diện, cũng như bot-token và chat_id.

Bây giờ tôi sẽ giải thích một chút về những gì họ làm:

Tập lệnh "helloworld" sẽ gửi một thông báo: "Xin chào, thế giới!" để trò chuyện của chúng tôi với bot.
Tập lệnh "itsworking" sẽ gửi một thông báo: "Kiểm tra OK, nó đang hoạt động!" để trò chuyện của chúng tôi với bot.
Các kịch bản này là dành cho mục đích trình diễn.
Tôi đã thêm tập lệnh "wolmypc" làm một trong những cách triển khai khả thi.
Khi thực thi tập lệnh, bot sẽ viết “wol OK” vào cuộc trò chuyện.
Trên thực tế, bạn hoàn toàn có thể chạy bất kỳ tập lệnh nào.

Tạo một nhiệm vụ:

Telegram.src

/system scheduler
add interval=30s name=Telegram on-event=":tool fetch url=("https://api.telegr
    am.org/".$botID."/getUpdates") ;r
    n:global content [/file get [/file find name=getUpdates] contents] ;r
    n:global startLoc 0;r
    n:global endLoc 0;r
    nr
    n:if ( [/file get [/file find name=getUpdates] size] > 50 ) do={r
    nr
    n:set startLoc  [:find $content "update_id" $lastEnd ] ;r
    n:set startLoc ( $startLoc + 11 ) ;r
    n:local endLoc [:find $content "," $startLoc] ;r
    n:local messageId ([:pick $content $startLoc $endLoc] + (1));r
    n:put [$messageId] ;r
    n:#log info message="updateID $messageId" ;r
    nr
    n:set startLoc  [:find $content "text" $lastEnd ] ;r
    n:set startLoc ( $startLoc  + 7 ) ;r
    n:local endLoc [:find $content "," ($startLoc)] ;r
    n:set endLoc ( $endLoc - 1 ) ;r
    n:local message [:pick $content ($startLoc + 2) $endLoc] ;r
    n:put [$message] ;r
    n:#log info message="message $message ";r
    nr
    n:set startLoc  [:find $content "chat" $lastEnd ] ;r
    n:set startLoc ( $startLoc + 12 ) ;r
    n:local endLoc [:find $content "," $startLoc] ;r
    n:local chatId ([:pick $content $startLoc $endLoc]);r
    n:put [$chatId] ;r
    n:#log info message="chatID $chatId ";r
    nr
    n:if (($chatId = $myChatID) and (:put [/system script find name=$messa
    ge] != "")) do={r
    n:system script run $message} else={:tool fetch url=("https://api.teleg
    ram.org/".$botID."/sendmessage?chat_id=".$chatId."&text=I can't t
    alk with you. ") keep-result=no} ;r
    n:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?
    offset=$messageId") keep-result=no; r
    n} r
    n" policy=
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 
    start-date=nov/02/2010 start-time=00:00:00
	
add name=Telegram-startup on-event=":delay 5r
    n:global botID "botXXXXXXXXXXXXXXXXXX" ;r
    n:global myChatID "631290" ;r
    n:global startLoc 0;r
    n:global endLoc 0;r
    n:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") 
    ;" policy=
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 
    start-time=startup

Chế độ xem có thể đọc đượckhông rõ tại sao, nhưng từ tập lệnh đang hoạt động, nó không tiết lộ dữ liệu chung, đã thêm tập lệnh khi hệ thống khởi động.
khởi động điện tín

:delay 5
:global botID "botXXXXXXXXXXXXXXXXXX" ;   token bot
:global myChatID "xxxxxx" ;                               chat_id
:global startLoc 0;
:global endLoc 0;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") ;

Telegram

:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") ;
:global content [/file get [/file find name=getUpdates] contents] ;
:global startLoc 0;
:global endLoc 0;

:if ( [/file get [/file find name=getUpdates] size] > 50 ) do={

:set startLoc  [:find $content "update_id" $lastEnd ] ;
:set startLoc ( $startLoc + 11 ) ;
:local endLoc [:find $content "," $startLoc] ;
:local messageId ([:pick $content $startLoc $endLoc] + (1));
:put [$messageId] ;
#:log info message="updateID $messageId" ;

:set startLoc  [:find $content "text" $lastEnd ] ;
:set startLoc ( $startLoc  + 7 ) ;
:local endLoc [:find $content "," ($startLoc)] ;
:set endLoc ( $endLoc - 1 ) ;
:local message [:pick $content ($startLoc + 2) $endLoc] ;
:put [$message] ;
#:log info message="message $message ";

:set startLoc  [:find $content "chat" $lastEnd ] ;
:set startLoc ( $startLoc + 12 ) ;
:local endLoc [:find $content "," $startLoc] ;
:local chatId ([:pick $content $startLoc $endLoc]);
:put [$chatId] ;
#:log info message="chatID $chatId ";

:if (($chatId = $myChatID) and (:put [/system script find name=$message] != "")) do={
:system script run $message} else={:tool fetch url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatId."&text=I can't talk with you. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no; 
} 

Làm thế nào nó hoạt động

Tải xuống tin nhắn "getUpdates" của chúng tôi cứ sau 30 giây, sau đó phân tích cú pháp để tìm hiểu cập nhật_id (số tin nhắn) và văn bản (đội của chúng tôi) và trò chuyện_id . Mặc định getUpdates hiển thị từ 1 đến 100 tin nhắn, để thuận tiện đọc lệnh xong ta xóa tin nhắn đi. Telegram api nói để đọc tin nhắn bạn cần số tin nhắn + 1

/getUpdates?offset=update_id + 1

Tất cả đã được thử nghiệm trên Mikrotik rb915 RouterOS 6.37.1
Nếu bạn gửi nhiều lệnh cùng một lúc, tất cả chúng sẽ được thực hiện lần lượt với khoảng thời gian là 30 giây.

Tái bút Rất cám ơn Kirill Kazakov vì ý tưởng và người bạn Alexander của tôi đã giúp viết kịch bản.

tài liệu tham khảo

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: Viết kịch bản

cập nhật:

03:11:16

Kịch bản cải tiến:

Đã thêm kiểm tra cho chat_id
Kiểm tra xem có ngu không, nếu ai đó viết thư cho bot của chúng tôi, anh ta sẽ trả lời anh ta: "Tôi không thể nói chuyện với bạn. “, tương tự sẽ trả lời chúng tôi nếu nó không nhận ra lệnh.
Sau khi thực hiện lệnh, bot hủy đăng ký trò chuyện (xem tập lệnh wolmypc)

CẬP NHẬT

tìm thấy với 7Diễn viên đóng thế7 rằng một tệp có ~14 thông báo ở trên không còn được xử lý bằng lệnh tìm nữa (các giới hạn của Mikrotik). Vì vậy, trong tương lai, tôi sẽ thay đổi tập lệnh thành lua, cảm ơn 7Diễn viên đóng thế7 vì điều này, tôi không biết về lua.

CẬP NHẬT 08.12.2016

trong Telegram, rõ ràng, họ đã thay đổi một chút "sự cạn kiệt" của getUpdate. bây giờ trong tập lệnh chính, bạn cần sửa thông báo bù từ 2 thành 1

thay đổi

:local message [:pick $content ($startLoc + 2) $endLoc] ;

заменить на :

:local message [:pick $content ($startLoc + 1) $endLoc] ;

Nguồn: www.habr.com