Selle teostuse juurde tÔukes mind Aleksandr Koryukin oma postitusega ««.
Ja kommentaar ĂŒhes VK grupis Kirill Kazakovi poolt:
Jah, see pole ĂŒldse turvaline. Ma pigem kirjutaksin telegraafiboti, mis vĂ”tab ainult minu kontolt kĂ€sklusi sisse lĂŒlitamiseks.
Otsustasin sellise boti kirjutada.
Nii et esimene asi, mida teha â luua bot telegrammis.
- Otsime otsingust vÀlja konto nimega @botfather
- KlÔpsame ekraani alumises osas Start nuppu
- PÀrast seda kirjutame talle kÀsu /newbot
Siis vastame kahe lihtsa kĂŒsimusele:
- Esimene kĂŒsimus â loodava boti nimi MyMikrotikROuter
- Teine kĂŒsimus â loodava boti hĂŒĂŒdnimi (peab lĂ”ppema bot'iga) MikrotikROuter_bot
Saame vastuseks meie boti tokeni, minu puhul on see:
Kasutage seda tokenit HTTP API-le juurdepÀÀsuks: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

SeejÀrel peame leidma meie boti nime jÀrgi otsides @MikrotikROuter_bot ja vajutama Start nuppu.
PÀrast seda avame brauseri ja sisestame jÀrgmise rea:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Kus XXXXXXXXXXXXXXXXXX â teie boti token.
Avaneb leht, mis nÀeb vÀlja ligikaudu selline:

Otsime sealt jÀrgmise teksti:
«chat»:{«id»:631290,
Nii et meil on kÔik vajalikud andmed Mikrotik'i skriptide kirjutamiseks, nimelt:
Boti token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Chati ID, kuhu ta peab kirjutama: 631290
Kontrollimiseks vÔime minna 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Àsud:
Otsime vÀlja konto nimega @botfather
PÀrast seda kirjutame talle kÀsu /setcommands
- Ta kĂŒsib, kummale botile
Kirjutame:
@MikrotikROuter_bot
Lisame kÀsud:
- helloworld< â Test sĂ”num chatis 1
- itsworking â Test sĂ”num chatis 2
- wolmypc â kĂ€ita minu PC
NĂŒĂŒd, kui kirjutada chatis «/», peaksime saama:

NĂŒĂŒd liigume MikroTiki juurde.
RouterOS-is on olemas konsoolivahend failide kopeerimiseks ftp vÔi http/https kaudu, vahend nimega fetch, mida me kasutame.
Avame terminali ja sisestame:
/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 ekraanida.
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 skript lisa nimi="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-resul
t=no"
Ărge unustage mĂ€rkida Ă”iget mac-aadressi ja liidese nime, samuti bot-tokenit ja chat_id-d.
Praegu selgitame natuke, mida need 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 mÔeldud demonstreerimiseks.
Skript «wolmypc» on lisatud ĂŒhe vĂ”imaliku rakendusena.
Skripti lÀbiviimisel kirjutab bot vestlusesse «wol OK».
Tegelikult saab kÀivitada absoluutselt igasuguseid skripte.
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
Loetav vormei ole selge, miks, kuid töös olev skript ei avalda globaalseid andmeid, lisasin skripti sĂŒsteemi laadimise ajal.
Telegram-startup
: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=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 töötab
Laadime alla meie sĂ”numid «getUpdates» iga 30 sekundi tagant, seejĂ€rel parsime need vĂ€lja, et teada saada update_id (sĂ”numi number) ja ntext (meie kĂ€sud) ja chat_id . Vaikimisi vĂ€ljundab getUpdates 1 kuni 100 sĂ”numit, mugavuse huvides, pĂ€rast kĂ€skude lugemist, kustutame sĂ”numi. Telegram api ĂŒtleb, et sĂ”numi lugemiseks on vajalik sĂ”numi number + 1.
/getUpdates?offset=update_id + 1
KÔik on kontrollitud Mikrotik rb915 RouterOS 6.37.1 peal.
Kui saata korraga mitu kÀsku, tÀidetakse need kÔik jÀrjestikku 30 sekundi vahedega.
P.S. Suure tÀnu Kirill Kazakovile idee eest ja minu sÔbrale Aleksandrile abi eest skriptidega.
Viidatud lingid
:Scripting
upd:
03:11:16
Uuendatud skriptid:
Lisatud kontroll chat_id ĂŒle
Tarkuse kontroll, kui keegi kirjutab meie botile, vastab ta: » Ma ei saa sinuga rÀÀkida.«, vastab sarnaselt, kui ei tunnista kÀsku.
KÀsku tÀites saadab bot teate vestlusesse (vt skripti wolmypc)
UPD
Leidsime, et fail ĂŒle ~ 14 sĂ”numitega lakib kĂ€sku find (Mikrotiki piirangud). SeetĂ”ttu muudan tulevikus skripti luasse, tĂ€nan selle eest, et ma ei teadnud luast.
UPD 08.12.2016
Telegramis on ilmselt veidi muudetud getUpdate âvĂ€ljavĂ”tetâ. NĂŒĂŒd on peamises skriptis vaja muuta sĂ”numi nihke vÀÀrtust 2-lt 1-le
muudatused
:local message [:pick $content ($startLoc + 2) $endLoc] ;
asenda:
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Allikas: habr.com
