Selle realiseerimise idee tuli Aleksandr Koryukini poolest oma avaldusega ««.
Ja kommentaar ühes VK grupis Kirill Kazakovi poolt:
Jah, see pole üldse turvaline. Ma pigem kirjutaksin Telegrami boti, mis võtab sisse lülitamise käske ainult minu kontolt.
Otsustasin sellise boti kirjutada.
Nii et esimene samm on luua bot Telegramis.
- Otsime otsingus kontot nimega @botfather
- Klõpsame ekraani allservas nuppu Start
- Seejärel kirjutame talle käsu /newbot
Siis vastame kahele lihtsale küsimusele:
- Esimene küsimus – loodava boti nimi MyMikrotikROuter
- Teine küsimus – loodava boti nik (peab lõppema botiga) MikrotikROuter_bot
Saame vastuseks meie boti pileti, minu juhul on see:
Kasutage seda tokenit HTTP API-le juurdepääsuks: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Seejärel tuleb meie boti otsida nime järgi @MikrotikROuter_bot ja vajutada nuppu Start.
Pärast seda tuleb avada brauser ja sisestada järgmine rida:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Kus XXXXXXXXXXXXXXXXXX – on teie boti token.
Avatakse leht, mille välimus on umbkaudu järgmine:

Otsime sealt järgmise teksti:
«chat»:{«id»:631290,
Nüüd on meil kogu vajalik teave Mikrotik'ile skriptide kirjutamiseks, nimelt:
Boti token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Chati ID, kuhu see peab kirjutama: 631290
Kontrollimiseks saame sisse logida läbi brauseri:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Peame saama tulemuse:

Meie mugavuse huvides lisame kohe botile käsklused:
Otsime üles konto nimega @botfather
Pärast seda kirjutame talle käsu /setcommands
- Küsimiseks, millisele botile
Kirjutame:
@MikrotikROuter_bot
Lisame käsklused:
- helloworld< — Testteade vestluses 1
- itsworking — Testteade vestluses 2
- wolmypc — ärata mu arvuti
Nüüd, kui sisestate vestlusesse „/”, peaksime saama:

Nüüd liigume MikroTiki juurde.
RouterOS'is on olemas konsooli utiliit failide kopeerimiseks ftp või http/https kaudu, mille nimi on fetch, just seda me kasutame.
Avame terminali ja kirjutame:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Pange tähele, et MikroTik'is on vajalik „” märgi „?” URL-is ekraanile panek.
Peame saama tulemuse:

Nüüd liigume skriptide juurde:
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
süsteemi skripti lisamine nimega="wolmypc" poliitika=lugemine allikas="/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-result=no"
Ärge unustage, et märkida õige MAC-aadress ja liidese nimi, samuti bot-token ja chat_id.
Praegu selgitan natuke, mida nad teevad:
Skript «helloworld» saadab sõnumi: » Tere, maailm!» meie botiga vestluses.
Skript «itsworking» saadab sõnumi: » Test OK, see töötab !» meie botiga vestluses.
Need skriptid on demonstratsiooni eesmärgil.
Skript «wolmypc» lisasin ühe võimaliku rakendusena.
Skripti täitmisel kirjutab bot vestlusesse «wol OK».
Põhimõtteliselt võib käivitada absoluutse igasuguse skripti.
Loome ülesande:
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
LugemisväliEbatavaline, miks, kuid töötav skript ei avalda globaalseid andmeid, lisasin skripti süsteemi käivitamisel.
Telegram-startup
:delay 5
:global botID "botXXXXXXXXXXXXXXXXXX" ; bot token
: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=Ma ei saa sinuga rääkida. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no;
}
Kuidas see toimib
Laadime alla meie sõnumid «getUpdates» iga 30 sekundi järel ning seejärel parseerida, et teada saada update_id (sõnumi number) ja text (meie käsklused) ja chat_id . Vaikimisi väljastab getUpdates 1 kuni 100 sõnumit, mugavuse huvides kustutame sõnumi pärast käskluse lugemist. Telegram API kohaselt peab sõnumi lugemiseks olema sõnumi number + 1
/getUpdates?offset=update_id + 1
Kõik on kontrollitud Mikrotik rb915 RouterOS 6.37.1 peal
Kui saata korraga palju käske, täidetakse need kõik järjestikku 30 sekundi intervalliga.
P.S. Suur tänu Kirill Kazakovile idee eest ja minu sõbrale Aleksandrile skriptide abistamise eest.
Lingid
:Scripting
upd:
03:11:16
Töötasin skriptid välja:
Lisatud kontrolle chat_id üle
Kontroll lolluse vastu: kui keegi kirjutab meie botile, vastab ta talle: » I can’t talk with you. «, sarnase vastuse annab ka siis, kui ta käsku ei tunne.
Käsku täidetud, bot kirjutab vestlusesse (vt skripti wolmypc)
UPD
Leidsime, et kui failidest rohkem kui ~14 sõnumit, lõpetab find käsk töötamise (Mikrotiku piirangud). Seetõttu teen skripti tulevikus ümber lua, aitäh selle eest, ma ei teadnud lua-st.
UPD 08.12.2016
Telegramis on ilmselt veidi muudetud getUpdate'i „väljastust“. Nüüd tuleb põhiskriptis sõnumi nihke 2 asemel 1 peale parandada.
muudatused
:local message [:pick $content ($startLoc + 2) $endLoc] ;
asendada:
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Allikas: habr.com
