Nuotolinis „Mikrotik“ scenarijų aktyvinimas iš „Telegram“.

Aleksandras Koryukinas pastūmėjo mane prie šio įgyvendinimo GeXoGeN su savo publikacijaNuotolinis kompiuterio įjungimas nemokamai, be SMS ir be debesų, naudojant Mikrotik"

Ir Kirilo Kazakovo komentaras vienoje iš VK grupių:

Taip, tai visai nesaugu. Verčiau parašysiu telegramų robotą, kuris priima tik aktyvinimo komandas iš mano paskyros.

Nusprendžiau parašyti tokį botą.

Taigi, pirmas dalykas, kurį reikia padaryti, yra sukurti robotą telegramoje.

  • Paieškoje randame paskyrą pavadinimu @botfather
  • Spustelėkite mygtuką Pradėti ekrano apačioje
  • Tada parašome jam komandą / newbot

Tada atsakome į 2 paprastus klausimus:

  • Pirmasis klausimas yra kuriamo roboto pavadinimas. MyMikrotikROuter
  • Antrasis klausimas yra kuriamo roboto slapyvardis (turėtų baigtis bot) MikrotikROuter_bot

Atsakydami gausime savo roboto žetoną, mano atveju tai yra:

Naudokite šį prieigos raktą, kad pasiektumėte HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Nuotolinis „Mikrotik“ scenarijų aktyvinimas iš „Telegram“.
Tada paieškoje pagal pavadinimą turite rasti mūsų robotą @MikrotikROuter_bot ir paspauskite mygtuką Pradėti.

Po to turite atidaryti naršyklę ir įvesti šią eilutę:

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

Kur XXXXXXXXXXXXXXXXXXXXX yra jūsų roboto prieigos raktas.

Bus atidarytas puslapis, panašus į šį:

Nuotolinis „Mikrotik“ scenarijų aktyvinimas iš „Telegram“.

Ant jo randame tokį tekstą:

"chat":{"id":631290,

Taigi, turime visą reikalingą informaciją Mikrotik scenarijų rašymui, būtent:

Boto prieigos raktas: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Pokalbio ID, kur jis turėtų parašyti: 631290

Norėdami patikrinti, galime pereiti per naršyklę:

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

Turėtų gautis rezultatas:

Nuotolinis „Mikrotik“ scenarijų aktyvinimas iš „Telegram“.

Patogumui iš karto pridėsime komandas botui:

Rasti paskyrą su vardu @bottėvas
Tada parašome jam komandą / setcommands

  • Jis paklaus, kuris botas

Mes rašome:
@MikrotikROuter_bot

Pridėti komandas:

  • helloworld< – patikrinkite pranešimą pokalbyje 1
  • itsworking – bandomasis pranešimas pokalbyje 2
  • wolmypc-wake up my PC

Jei pokalbyje įvesite „/“, turėtumėte gauti:

Nuotolinis „Mikrotik“ scenarijų aktyvinimas iš „Telegram“.

Dabar pereikime prie MikroTik.

„RouterOS“ turi konsolės įrankį, skirtą failams kopijuoti per ftp arba http / https, ši programa vadinama „fetch“, kurią mes ir naudosime.

Atidaryti terminalas ir įveskite:

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

Atkreipkite dėmesį, kad MikroTik reikia ""Pabėgti nuo ženklo"?“ URL.

Turėtų gautis rezultatas:

Nuotolinis „Mikrotik“ scenarijų aktyvinimas iš „Telegram“.

Dabar pereikime prie scenarijų:

Labas pasauli

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}

Veikia

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"

Nepamirškite nurodyti teisingo „Mac“ ir sąsajos pavadinimo, taip pat „bot-token“ ir „chat_id“.

Dabar aš šiek tiek paaiškinsiu, ką jie daro:

Scenarijus „helloworld“ siunčia žinutę: „Sveikas, pasauli! į mūsų pokalbį su robotu.
Scenarijus "itsworking" siunčia pranešimą: "Test OK, it's Working!" į mūsų pokalbį su robotu.
Šie scenarijai yra demonstravimo tikslais.
„Wolmypc“ scenarijų pridėjau kaip vieną iš galimų įgyvendinimų.
Vykdydamas scenarijų, robotas pokalbyje parašys „wol OK“.
Tiesą sakant, galite paleisti absoliučiai bet kokį scenarijų.

Sukurkite užduotį:

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

Skaitomas vaizdasneaišku kodėl, bet iš darbo scenarijaus jis neatskleidžia visuotinių duomenų, pridėjo scenarijų, kai sistema paleidžiama.
Telegramos paleidimas

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

Kaip tai veikia

Atsisiųskite mūsų „getUpdates“ pranešimus kas 30 sekundžių, tada analizuokite, kad sužinotumėte update_id (pranešimo numeris) ir tekstas (mūsų komandos) ir pokalbio_id . Pagal numatytuosius nustatymus getUpdates rodo nuo 1 iki 100 pranešimų, patogumo dėlei perskaitę komandą žinutę ištriname. Telegram api sako, kad norint perskaityti pranešimą, reikia pranešimo numerio + 1

/getUpdates?offset=update_id + 1

Viskas išbandyta naudojant Mikrotik rb915 RouterOS 6.37.1
Jei vienu metu siunčiate daug komandų, jos visos bus vykdomos paeiliui su 30 sekundžių intervalu.

PS Labai ačiū Kirilui Kazakovui už idėją ir mano draugui Aleksandrui už pagalbą kuriant scenarijus.

Nuorodos

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

upd:

03:11:16

Patobulinti scenarijai:

Pridėtas chat_id patikrinimas
Tikrinant, ar nėra kvailio, jei kas nors parašys mūsų botui, jis jam atsakys: „Aš negaliu su tavimi kalbėtis. “, panašiai atsakys mums, jei neatpažins komandos.
Įvykdęs komandą, robotas atsisako pokalbio prenumeratos (žr. wolmypc scenarijų)

DUP

Rasta su 7 Kaskadininkas7 kad failas su virš ~14 pranešimų nebeapdorojamas komanda rasti (Mikrotik apribojimai). Todėl ateityje pakeisiu scenarijų į lua, ačiū 7 Kaskadininkas7 dėl to aš nežinojau apie lua.

UPD 08.12.2016-XNUMX-XNUMX

Telegramoje, matyt, jie šiek tiek pakeitė getUpdate „išnaudojimą“. dabar pagrindiniame scenarijuje reikia ištaisyti pranešimo poslinkį nuo 2 iki 1

pokyčiai

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

заменить на :

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

Šaltinis: www.habr.com