Daljinska aktivacija Mikrotik skripti iz Telegrama

Alexander Koryukin me potaknuo na ovu implementaciju GeXoGeN svojom objavomDaljinsko paljenje računala besplatno, bez SMS-a i bez oblaka, pomoću Mikrotika”.

I komentar Kirilla Kazakova u jednoj od VK grupa:

Da, uopće nije sigurno. Radije bih napisao telegram bota koji prihvaća samo naredbe za aktivaciju s mog računa.

Odlučio sam napisati takvog bota.

Dakle, prvo što treba učiniti je stvoriti bota u telegramu.

  • U pretrazi nalazimo račun pod nazivom @botfather
  • Kliknite na gumb Start na dnu ekrana
  • Zatim mu napišemo naredbu / newbot

Zatim odgovaramo na 2 jednostavna pitanja:

  • Prvo pitanje je naziv bota koji će se izraditi. MyMikrotikROuter
  • Drugo pitanje je nadimak bota koji se kreira (trebao bi završiti sa bot) MikrotikROuter_bot

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

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

Daljinska aktivacija Mikrotik skripti iz Telegrama
Zatim, trebate pronaći našeg bota u pretrazi po imenu @MikrotikROuter_bot i pritisnite tipku Start.

Nakon toga morate otvoriti preglednik i unijeti sljedeći redak:

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

Gdje je XXXXXXXXXXXXXXXXXX token vašeg bota.

Otvorit će se stranica slična sljedećoj:

Daljinska aktivacija Mikrotik skripti iz Telegrama

Na njemu nalazimo sljedeći tekst:

"chat":{"id":631290,

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

Bot token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID chata gdje treba napisati: 631290

Da bismo provjerili, možemo proći kroz preglednik:

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

Trebalo bi dobiti rezultat:

Daljinska aktivacija Mikrotik skripti iz Telegrama

Radi naše udobnosti, odmah ćemo dodati naredbe za bot:

Pronalaženje računa s imenom @bototac
Zatim mu napišemo naredbu / setcommands

  • Pitat će koji bot

Pišemo:
@MikrotikROuter_bot

Dodajte naredbe:

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

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

Daljinska aktivacija Mikrotik skripti iz Telegrama

Sada prijeđimo na MikroTik.

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

Otvoreno 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 "» izbjeći znak «?' u URL-u.

Trebalo bi dobiti rezultat:

Daljinska aktivacija Mikrotik skripti iz Telegrama

Sada prijeđimo na skripte:

Pozdrav svijete

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}

radi

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 navesti točan mac i naziv sučelja, kao i bot-token i chat_id.

Sada ću malo objasniti što rade:

Skripta "helloworld" šalje poruku: "Hello, world!" na naš chat s botom.
Skripta "itsworking" šalje poruku: "Test OK, radi!" na naš chat s botom.
Ove skripte služe za demonstraciju.
Dodao sam skriptu "wolmypc" kao jednu od mogućih implementacija.
Nakon izvršenja skripte, bot će u chat napisati "wol OK".
Zapravo, možete pokrenuti apsolutno bilo koju skriptu.

Napravi 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

Čitljiv poglednije jasno zašto, ali iz radne skripte ne otkriva globalne podatke, dodana je skripta kada se sustav podigne.
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 analizirajte kako biste saznali update_id (broj poruke) i tekst (naši timovi) i chat_id . Prema zadanim postavkama getUpdates prikazuje od 1 do 100 poruka, radi praktičnosti, nakon čitanja naredbe brišemo poruku. Telegram api kaže da vam je za čitanje poruke potreban 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šiti 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

ažuriranje:

03:11:16

Poboljšane skripte:

Dodana provjera za chat_id
Provjeravam budalu, ako netko piše našem botu, on će mu odgovoriti: "Ne mogu razgovarati s tobom. “, slično će nam odgovoriti ako ne prepozna naredbu.
Nakon izvršenja naredbe, bot se odjavljuje na chat (pogledajte wolmypc skriptu)

DUP

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

UPD 08.12.2016

u Telegramu su, očito, malo promijenili "auspuh" getUpdatea. 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