Aktivasi jarak jauh skrip Mikrotik dari Telegram

Alexander Koryukin mendorong saya ke implementasi ini GeXoGeN dengan publikasinyaMenyalakan komputer jarak jauh secara gratis, tanpa SMS dan tanpa cloud, menggunakan Mikrotik".

Dan komentar di salah satu grup VK oleh Kirill Kazakov:

Ya, itu tidak aman sama sekali. Saya lebih suka menulis bot telegram yang hanya menerima perintah aktivasi dari akun saya.

Saya memutuskan untuk menulis bot seperti itu.

Jadi, hal pertama yang harus dilakukan adalah membuat bot di telegram.

  • Kami menemukan dalam pencarian akun bernama @botfather
  • Klik tombol Mulai di bagian bawah layar
  • Lalu kami menulisnya perintah / newbot

Kemudian kami menjawab 2 pertanyaan sederhana:

  • Pertanyaan pertama adalah nama bot yang akan dibuat. MyMikrotikROuter
  • Pertanyaan kedua adalah nama panggilan bot yang dibuat (harus diakhiri dengan bot) MikrotikROuter_bot

Sebagai tanggapan, kami akan menerima token bot kami, dalam kasus saya ini adalah:

Gunakan token ini untuk mengakses API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Aktivasi jarak jauh skrip Mikrotik dari Telegram
Kemudian, Anda perlu menemukan bot kami dalam pencarian berdasarkan nama @MikrotikROuter_bot dan tekan tombol Mulai.

Setelah itu, Anda perlu membuka browser dan memasukkan baris berikut:

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

Di mana XXXXXXXXXXXXXXXXX adalah token bot Anda.

Halaman yang mirip dengan berikut ini akan terbuka:

Aktivasi jarak jauh skrip Mikrotik dari Telegram

Kami menemukan teks berikut di atasnya:

"obrolan":{"id":631290,

Jadi, kami memiliki semua informasi yang diperlukan untuk menulis skrip di Mikrotik, yaitu:

Token bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID Obrolan di mana dia harus menulis: 631290

Untuk mengeceknya, kita bisa melalui browser:

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

Harus mendapatkan hasil:

Aktivasi jarak jauh skrip Mikrotik dari Telegram

Demi kenyamanan kami, kami akan segera menambahkan perintah untuk bot:

Menemukan akun dengan nama @botfather
Lalu kami menulis perintah untuknya / setcommands

  • Dia akan menanyakan bot yang mana

Kami menulis:
@MikrotikROuter_bot

Tambahkan perintah:

  • helloworld< β€” Tes pesan pada obrolan 1
  • itsworking-Test Message on chat 2
  • wolmypc-bangunkan PC saya

Sekarang jika Anda mengetik "/" di obrolan, Anda akan mendapatkan:

Aktivasi jarak jauh skrip Mikrotik dari Telegram

Sekarang mari beralih ke MikroTik.

RouterOS memiliki utilitas konsol untuk menyalin file melalui ftp atau http / https, utilitas tersebut disebut mengambil, yang akan kita gunakan.

Buka terminal dan masukkan:

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

Harap dicatat bahwa MikroTik membutuhkan "Β» untuk menghindari tanda Β«?' di URL.

Harus mendapatkan hasil:

Aktivasi jarak jauh skrip Mikrotik dari Telegram

Sekarang mari beralih ke skrip:

Halo Dunia

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}

bekerja

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"

Jangan lupa untuk menentukan nama mac dan antarmuka yang benar, serta bot-token dan chat_id.

Sekarang saya akan menjelaskan sedikit apa yang mereka lakukan:

Skrip "helloworld" mengirim pesan: "Halo, dunia!" ke obrolan kami dengan bot.
Skrip "berfungsi" mengirim pesan: "Uji Oke, Berhasil!" ke obrolan kami dengan bot.
Skrip ini untuk tujuan demonstrasi.
Saya menambahkan skrip "wolmypc" sebagai salah satu implementasi yang memungkinkan.
Setelah eksekusi skrip, bot akan menulis "wol OK" ke obrolan.
Faktanya, Anda benar-benar dapat menjalankan skrip apa pun.

Buat tugas:

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

Tampilan yang Dapat Dibacatidak jelas mengapa, tetapi dari skrip yang berfungsi tidak mengungkapkan data global, menambahkan skrip saat sistem melakukan booting.
Peluncuran telegram

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

Bagaimana itu bekerja

Unduh pesan "getUpdates" kami setiap 30 detik, lalu uraikan untuk mencari tahu pembaruan_id (nomor pesan) dan teks (tim kami) dan obrolan_id . Secara default, getUpdates menampilkan dari 1 hingga 100 pesan, untuk kenyamanan, setelah membaca perintah, kami menghapus pesan tersebut. Telegram api mengatakan untuk membaca pesan Anda memerlukan nomor pesan +1

/getUpdates?offset=update_id + 1

Semua diuji pada Mikrotik rb915 RouterOS 6.37.1
Jika Anda mengirim banyak perintah sekaligus, semuanya akan dieksekusi secara bergantian dengan selang waktu 30 detik.

PS Terima kasih banyak kepada Kirill Kazakov atas idenya dan teman saya Alexander atas bantuan skripnya.

referensi

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: Penulisan naskah

pembaruan:

03:11:16

Skrip yang ditingkatkan:

Menambahkan cek untuk chat_id
Memeriksa orang bodoh, jika seseorang menulis ke bot kami, dia akan menjawabnya: "Saya tidak dapat berbicara dengan Anda. β€œ, juga akan menjawab kami jika tidak mengenali perintah.
Setelah menjalankan perintah, bot berhenti berlangganan obrolan (lihat skrip wolmypc)

DUP

Ditemukan dengan 7Pemeran pengganti7 bahwa file dengan pesan di atas ~14 tidak lagi diproses oleh perintah find (batasan Mikrotik). Oleh karena itu kedepannya akan saya ubah scriptnya menjadi lua, terima kasih 7Pemeran pengganti7 untuk ini, saya tidak tahu tentang lua.

UPD 08.12.2016/XNUMX/XNUMX

di Telegram, rupanya, mereka sedikit mengubah "knalpot" dari getUpdate. sekarang di skrip utama Anda perlu mengoreksi offset pesan dari 2 menjadi 1

perubahan

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

Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° :

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

Sumber: www.habr.com