Daljinsko aktiviranje Mikrotik skripti iz Telegrama

Aleksandar Korjukin me je gurnuo na ovu implementaciju GeXoGeN sa njegovom publikacijomBesplatno daljinsko uključivanje računara, bez SMS-a i bez oblaka, koristeći Mikrotik".

I komentar u jednoj od VK grupa Kirila Kazakova:

Da, uopšte nije sigurno. Radije bih napisao telegram bota koji prihvata samo komande za aktivaciju sa mog naloga.

Odlučio sam da napišem takvog bota.

Dakle, prva stvar koju treba učiniti je kreirati bota u telegramu.

  • U pretrazi nalazimo nalog pod nazivom @botfather
  • Kliknite na dugme Start na dnu ekrana
  • Zatim mu napišemo komandu / newbot

Zatim odgovaramo na 2 jednostavna pitanja:

  • Prvo pitanje je ime bota koji se kreira. MyMikrotikROuter
  • Drugo pitanje je nadimak bota koji se kreira (treba da završava sa botom) MikrotikROuter_bot

Kao odgovor, dobićemo token našeg bota, u mom slučaju to je:

Koristite ovaj token za pristup HTTP API-ju: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Daljinsko aktiviranje Mikrotik skripti iz Telegrama
Zatim, morate pronaći našeg bota u pretrazi po imenu @MikrotikROuter_bot i pritisnite dugme Start.

Nakon toga, potrebno je da otvorite pretraživač i unesete sledeći red:

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

Gdje je XXXXXXXXXXXXXXXXXX token vašeg bota.

Otvara se stranica slična sljedećoj:

Daljinsko aktiviranje Mikrotik skripti iz Telegrama

Na njemu nalazimo sljedeći tekst:

"chat":{"id":631290,

Dakle, imamo sve potrebne informacije za pisanje skripti za Mikrotik, i to:

Bot token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID chata gdje treba napisati: 631290

Da provjerimo, možemo proći kroz pretraživač:

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

Trebalo bi dobiti rezultat:

Daljinsko aktiviranje Mikrotik skripti iz Telegrama

Radi naše pogodnosti, odmah ćemo dodati komande za bota:

Pronalaženje naloga sa imenom @botfather
Onda mu napišemo komandu / setcommands

  • Pitaće koji bot

Mi pišemo:
@MikrotikROuter_bot

Dodajte komande:

  • helloworld< — Test poruka na chatu 1
  • itsworking-Probna poruka na chatu 2
  • wolmypc-probudi moj PC

Sada ako upišete "/" u chat, trebali biste dobiti:

Daljinsko aktiviranje Mikrotik skripti iz Telegrama

Pređimo sada na MikroTik.

RouterOS ima konzolni uslužni program za kopiranje datoteka putem ftp-a ili http/https, uslužni program se zove fetch, što ćemo koristiti.

Otvori terminal i unesite:

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

Imajte na umu da MikroTik treba "» pobjeći od znaka «?' u URL-u.

Trebalo bi dobiti rezultat:

Daljinsko aktiviranje Mikrotik skripti iz Telegrama

Sada pređimo na skripte:

helloworld

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}

itsworking

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"

Ne zaboravite da navedete ispravan naziv mac i interfejsa, kao i bot-token i chat_id.

Sada ću malo objasniti šta rade:

Skripta "helloworld" šalje poruku: "Zdravo, svet!" na naš razgovor sa botom.
Skripta "itsworking" šalje poruku: "Test OK, it's Working!" na naš razgovor sa botom.
Ove skripte služe u svrhu demonstracije.
Dodao sam "wolmypc" skriptu kao jednu od mogućih implementacija.
Nakon izvršenja skripte, bot će napisati “wol OK” u chat.
U stvari, možete pokrenuti apsolutno bilo koju skriptu.

Kreirajte zadatak:

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

Readable Viewnije jasno zašto, ali iz radne skripte ne otkriva globalne podatke, dodala je skripta kada se sistem pokrene.
Pokretanje Telegrama

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

Kako ovo radi

Preuzmite naše "getUpdates" poruke svakih 30 sekundi, a zatim ih analizirajte da saznate update_id (broj poruke) i tekst (naši timovi) i chat_id . Podrazumevano, getUpdates prikazuje od 1 do 100 poruka, radi praktičnosti, nakon čitanja naredbe, brišemo poruku. Telegram API kaže da biste pročitali poruku potreban vam je broj poruke + 1

/getUpdates?offset=update_id + 1

Sve testirano na Mikrotik rb915 RouterOS 6.37.1
Ako pošaljete više naredbi odjednom, sve će se izvršavati redom u intervalu od 30 sekundi.

PS Veliko hvala Kirilu Kazakovu na ideji i mom prijatelju Aleksandru na pomoći oko scenarija.

reference

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

upd:

03:11:16

Poboljšane skripte:

Dodata provjera za chat_id
Provjeravajući budalu, ako neko napiše našem botu, on će mu odgovoriti: „Ne mogu s tobom da pričam. “, slično će nam odgovoriti ako ne prepozna komandu.
Nakon izvršenja naredbe, bot se odjavljuje na chat (pogledajte wolmypc skriptu)

DUP

Pronađeno sa 7Stuntman7 da se datoteka s iznad ~14 poruka više ne obrađuje naredbom find (Mikrotik ograničenja). Stoga ću u budućnosti promijeniti skriptu u lua, hvala 7Stuntman7 za ovo, nisam znao za lua.

UPD 08.12.2016/XNUMX/XNUMX

u Telegramu su, po svemu sudeći, malo promijenili "ispuh" getUpdate-a. sada u glavnoj skripti morate ispraviti pomak poruke sa 2 na 1

promjena

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

заменить на :

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

izvor: www.habr.com