Mikrotiki skriptide kaugjuhtimine Telegramist

Selle teostuse juurde tÔukes mind Aleksandr Koryukin GeXoGeN oma postitusega «KaugkÀivitamine tasuta, ilma SMS-i ja pilvedeta, kasutades Mikrotiki«.

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

Mikrotiki skriptide kaugjuhtimine Telegramist
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:

Mikrotiki skriptide kaugjuhtimine Telegramist

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:

Mikrotiki skriptide kaugjuhtimine Telegramist

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:

Mikrotiki skriptide kaugjuhtimine Telegramist

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:

Mikrotiki skriptide kaugjuhtimine Telegramist

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

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: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 7Stuntman7 fail ĂŒle ~ 14 sĂ”numitega lakib kĂ€sku find (Mikrotiki piirangud). SeetĂ”ttu muudan tulevikus skripti luasse, tĂ€nan 7Stuntman7 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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster