Mikrotik-skriptien etäaktivointi Telegramista

Alexander Koryukin työnsi minut tähän toteutukseen GeXoGeN julkaisunsa kanssaTietokoneen etäkäynnistys ilmaiseksi, ilman tekstiviestejä ja ilman pilviä Mikrotikilla".

Ja Kirill Kazakovin kommentti yhdessä VK-ryhmistä:

Joo, se ei ole ollenkaan turvallista. Kirjoitan mieluummin sähkebotin, joka hyväksyy vain aktivointikomennot tililtäni.

Päätin kirjoittaa tällaisen botin.

Joten ensimmäinen asia, joka on tehtävä, on luoda botti sähkeessä.

  • Löydämme hausta tilin nimeltä @botfather
  • Napsauta Käynnistä-painiketta näytön alareunassa
  • Sitten kirjoitamme hänelle komennon / newbot

Sitten vastaamme kahteen yksinkertaiseen kysymykseen:

  • Ensimmäinen kysymys on luotavan botin nimi. MyMikrotikROuter
  • Toinen kysymys on luotavan botin lempinimi (pitäisi päättyä bottiin) MikrotikROuter_bot

Vastauksena saamme bottimme tunnuksen, minun tapauksessani se on:

Käytä tätä tunnusta päästäksesi HTTP-sovellusliittymään: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Mikrotik-skriptien etäaktivointi Telegramista
Sitten sinun on löydettävä bottimme haulla nimellä @MikrotikROuter_bot ja paina Käynnistä-painiketta.

Tämän jälkeen sinun on avattava selain ja kirjoitettava seuraava rivi:

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

Missä XXXXXXXXXXXXXXXXXXXXX on bottisi tunnus.

Seuraavan kaltainen sivu avautuu:

Mikrotik-skriptien etäaktivointi Telegramista

Löydämme siitä seuraavan tekstin:

"chat":{"id":631290,

Joten meillä on kaikki tarvittavat tiedot Mikrotik-skriptien kirjoittamiseen, nimittäin:

Bottitunnus: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat-tunnus, johon hänen pitäisi kirjoittaa: 631290

Tarkistaaksemme voimme käydä selaimen kautta:

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

Tuloksen pitäisi saada:

Mikrotik-skriptien etäaktivointi Telegramista

Mukavuutemme vuoksi lisäämme välittömästi bottiin komennot:

Nimellisen tilin löytäminen @botisä
Sitten kirjoitamme hänelle käskyn / setcommands

  • Hän kysyy, mikä botti

Me kirjoitamme:
@MikrotikROuter_bot

Lisää komentoja:

  • helloworld< — Testiviesti chatissa 1
  • itsworking-Testiviesti chatissa 2
  • wolmypc-herätä tietokoneeni

Nyt jos kirjoitat "/" chattiin, sinun pitäisi saada:

Mikrotik-skriptien etäaktivointi Telegramista

Siirrytään nyt MikroTikiin.

RouterOS:ssä on konsoliapuohjelma tiedostojen kopioimiseen ftp:n tai http / https:n kautta, apuohjelmaa kutsutaan fetchiksi, jota käytämme.

Avata terminaali ja syötä:

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

Huomaa, että MikroTik tarvitsee "» paeta merkkiä «?' URL-osoitteessa.

Tuloksen pitäisi saada:

Mikrotik-skriptien etäaktivointi Telegramista

Siirrytään nyt skripteihin:

Hei maailma

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}

Se toimii

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"

Muista määrittää oikea mac- ja käyttöliittymänimi sekä bot-token ja chat_id.

Selitän nyt hieman, mitä he tekevät:

"Helloworld"-skripti lähettää viestin: "Hei, maailma!" chattiin botin kanssa.
"itsworking"-skripti lähettää viestin: "Test OK, it's Working!" chattiin botin kanssa.
Nämä skriptit ovat esittelytarkoituksiin.
Lisäsin "wolmypc"-skriptin yhdeksi mahdollisista toteutuksista.
Kun komentosarja on suoritettu, botti kirjoittaa keskusteluun "wol OK".
Itse asiassa voit ajaa mitä tahansa skriptiä.

Luo tehtävä:

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

Luettava näkymäei ole selvää miksi, mutta toimivasta skriptistä se ei paljasta globaaleja tietoja, lisäsi komentosarjan järjestelmän käynnistyessä.
Telegramin käynnistys

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

Kuinka tämä toimii

Lataa "getUpdates"-viestimme 30 sekunnin välein ja jäsennä sitten selvittääksesi update_id (viestin numero) ja teksti (joukkueemme) ja chat_id . Oletuksena getUpdates näyttää 1 - 100 viestiä, mukavuuden vuoksi poistamme viestin komennon lukemisen jälkeen. Telegram api sanoo, että viestin lukemiseen tarvitaan viestin numero + 1

/getUpdates?offset=update_id + 1

Kaikki testattu Mikrotik rb915 RouterOS 6.37.1:ssä
Jos lähetät useita komentoja kerralla, ne kaikki suoritetaan vuorotellen 30 sekunnin välein.

PS Suuri kiitos Kirill Kazakoville ideasta ja ystävälleni Alexanderille avusta käsikirjoituksissa.

viittaukset

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

päivitys:

03:11:16

Parannetut skriptit:

Lisätty chat_id-tarkistus
Hullun varalta, jos joku kirjoittaa botillemme, hän vastaa hänelle: "En voi puhua kanssasi. ", vastaa meille samalla tavalla, jos se ei tunnista komentoa.
Komennon suorittamisen jälkeen botti lopettaa keskustelun tilauksen (katso wolmypc-skripti)

UPD

Löytyi kanssa 7 Stuntman 7 että yli ~14 viestiä sisältävää tiedostoa ei enää käsitellä find-komennolla (Mikrotik-rajoitukset). Siksi vaihdan jatkossa käsikirjoituksen lua:ksi, kiitos 7 Stuntman 7 tätä varten en tiennyt luasta.

UPD 08.12.2016

Telegramissa he ilmeisesti muuttivat hieman getUpdaten "pakokaasua". nyt pääskriptissä sinun on korjattava viestin siirtymä 2: sta 1: een

muutokset

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

заменить на :

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

Lähde: will.com