Pengaktifan jauh skrip Mikrotik dari Telegram

Alexander Koryukin mendorong saya kepada pelaksanaan ini GeXoGeN dengan penerbitannyaJauh menghidupkan komputer secara percuma, tanpa SMS dan tanpa awan, menggunakan Mikrotik".

Dan komen dalam salah satu kumpulan VK oleh Kirill Kazakov:

Ya, ia tidak selamat sama sekali. Saya lebih suka menulis bot telegram yang hanya menerima arahan pengaktifan daripada akaun saya.

Saya memutuskan untuk menulis bot sedemikian.

Jadi, perkara pertama yang perlu dilakukan ialah mencipta bot dalam telegram.

  • Kami dapati dalam carian akaun bernama @botfather
  • Klik pada butang Mula di bahagian bawah skrin
  • Kemudian kami menulis arahan / newbot kepadanya

Kemudian kami menjawab 2 soalan mudah:

  • Soalan pertama ialah nama bot yang akan dibuat. MyMikrotikROuter
  • Soalan kedua ialah nama panggilan bot yang sedang dibuat (harus berakhir dengan bot) MikrotikROuter_bot

Sebagai tindak balas, kami akan menerima token bot kami, dalam kes saya ialah:

Gunakan token ini untuk mengakses API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Pengaktifan jauh skrip Mikrotik dari Telegram
Kemudian, anda perlu mencari bot kami dalam carian mengikut nama @MikrotikROuter_bot dan tekan butang Mula.

Selepas itu, anda perlu membuka penyemak imbas dan masukkan baris berikut:

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

Di mana XXXXXXXXXXXXXXXXXX ialah token bot anda.

Halaman yang serupa dengan yang berikut akan dibuka:

Pengaktifan jauh skrip Mikrotik dari Telegram

Kami dapati teks berikut di atasnya:

"sembang":{"id":631290,

Jadi, kami mempunyai semua maklumat yang diperlukan untuk menulis skrip untuk Mikrotik, iaitu:

Token bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID sembang di mana dia harus menulis: 631290

Untuk menyemak, kita boleh pergi melalui penyemak imbas:

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

Harus mendapat keputusan:

Pengaktifan jauh skrip Mikrotik dari Telegram

Untuk kemudahan kami, kami akan segera menambah arahan untuk bot:

Mencari akaun dengan nama @botfather
Kemudian kami menulis arahan kepadanya / set perintah

  • Dia akan bertanya bot yang mana

Kami menulis:
@MikrotikROuter_bot

Tambah arahan:

  • helloworld< β€” Uji mesej pada sembang 1
  • itsworking-Test Mesej pada sembang 2
  • wolmypc-bangun PC saya

Sekarang jika anda menaip "/" dalam sembang, anda sepatutnya mendapat:

Pengaktifan jauh skrip Mikrotik dari Telegram

Sekarang mari kita beralih kepada MikroTik.

RouterOS mempunyai utiliti konsol untuk menyalin fail melalui ftp atau http / https, utiliti itu dipanggil fetch, yang akan kami gunakan.

Buka terminal dan masukkan:

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

Sila ambil perhatian bahawa MikroTik memerlukan "Β»untuk melarikan diri dari tanda itu Β«?' dalam URL.

Harus mendapat keputusan:

Pengaktifan jauh skrip Mikrotik dari Telegram

Sekarang mari kita beralih kepada skrip:

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

ianya berkesan

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 antara muka yang betul, serta bot-token dan chat_id.

Sekarang saya akan menerangkan sedikit apa yang mereka lakukan:

Skrip "helloworld" menghantar mesej: "Hello, world!" ke sembang kami dengan bot.
Skrip "berfungsi" menghantar mesej: "Uji OK, ia Berfungsi!" ke sembang kami dengan bot.
Skrip ini adalah untuk tujuan demonstrasi.
Saya menambah skrip "wolmypc" sebagai salah satu pelaksanaan yang mungkin.
Setelah melaksanakan skrip, bot akan menulis "wol OK" pada sembang.
Malah, anda boleh menjalankan apa-apa skrip sama sekali.

Buat tugasan:

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

Pandangan Boleh Dibacaia tidak jelas mengapa, tetapi daripada skrip yang berfungsi ia tidak mendedahkan data global, menambah skrip apabila sistem but.
Permulaan 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; 
} 

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Muat turun mesej "getUpdates" kami setiap 30 saat, kemudian hurai untuk mengetahuinya kemas kini_id (nombor mesej) dan teks (pasukan kami) dan chat_id . Secara lalai, getUpdates memaparkan dari 1 hingga 100 mesej, untuk kemudahan, selepas membaca arahan, kami memadamkan mesej itu. Telegram api mengatakan untuk membaca mesej anda memerlukan nombor mesej + 1

/getUpdates?offset=update_id + 1

Semua diuji pada Mikrotik rb915 RouterOS 6.37.1
Jika anda menghantar banyak arahan serentak, semuanya akan dilaksanakan secara bergilir-gilir dengan selang 30 saat.

PS Terima kasih banyak kepada Kirill Kazakov untuk idea dan rakan saya Alexander untuk bantuan dengan skrip.

rujukan

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

kemas kini:

03:11:16

Skrip yang dipertingkatkan:

Ditambah cek untuk chat_id
Memeriksa orang bodoh, jika seseorang menulis kepada bot kami, dia akan menjawabnya: "Saya tidak boleh bercakap dengan anda. β€œ, akan sama menjawab kami jika ia tidak mengenali arahan itu.
Selepas melaksanakan arahan, bot berhenti melanggan sembang (lihat skrip wolmypc)

DUP

Ditemui dengan 7Stuntman7 bahawa fail dengan ~14 mesej di atas tidak lagi diproses oleh arahan cari (had Mikrotik). Oleh itu, pada masa akan datang, saya akan menukar skrip kepada lua, terima kasih 7Stuntman7 untuk ini, saya tidak tahu tentang lua.

UPD 08.12.2016/XNUMX/XNUMX

dalam Telegram, nampaknya, mereka mengubah sedikit "ekzos" getUpdate. kini dalam skrip utama anda perlu membetulkan offset mesej dari 2 kepada 1

perubahan

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

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

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

Sumber: www.habr.com