Mikrotiki skriptide kaugkäivitamine Telegramist

Selle realiseerimise idee tuli Aleksandr Koryukini poolest GeXoGeN oma avaldusega «Arvuti kaugkäivitamine tasuta, ilma SMS-i ja pilvedeta, kasutades Mikrotik'i«.

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

Mikrotiki skriptide kaugkäivitamine Telegramist
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:

Mikrotiki skriptide kaugkäivitamine Telegramist

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:

Mikrotiki skriptide kaugkäivitamine Telegramist

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:

Mikrotiki skriptide kaugkäivitamine Telegramist

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:

Mikrotiki skriptide kaugkäivitamine 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 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

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

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 7Stuntman7 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 7Stuntman7 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

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster