Attivazione remota degli script Mikrotik da Telegram

Questa implementazione è stata ispirata da Aleksandr Koryukin GeXoGeN con la sua pubblicazione «Attivazione remota del computer gratuitamente, senza SMS e senza cloud, utilizzando Mikrotik«.

E un commento in uno dei gruppi VK di Kirill Kazakov:

Sì, davvero non è sicuro. Preferirei scrivere un bot di Telegram che accetta comandi solo dal mio account per l'attivazione.

Ho deciso di scrivere un tale bot.

Quindi, la prima cosa da fare è creare un bot in Telegram.

  • Cerchiamo nell'elenco l'account con il nome @botfather
  • Clicchiamo sul pulsante Start nella parte inferiore dello schermo
  • Dopo di che scriviamo il comando /newbot

Poi rispondiamo a 2 semplici domande:

  • La prima domanda è il nome del bot che stiamo creando MyMikrotikROuter
  • La seconda domanda è il nickname del bot che stiamo creando (deve finire con bot) MikrotikROuter_bot

In risposta riceveremo il token del nostro bot, nel mio caso è:

Usa questo token per accedere all'API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Attivazione remota degli script Mikrotik da Telegram
Poi, dobbiamo trovare il nostro bot cercando per nome @MikrotikROuter_bot e cliccare sul pulsante Start.

Dopo di ciò, dobbiamo aprire il browser e inserire la seguente stringa:

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

Dove XXXXXXXXXXXXXXXXXX è il token del tuo bot.

Si aprirà una pagina di questo tipo:

Attivazione remota degli script Mikrotik da Telegram

Troviamo su di esso il seguente testo:

«chat»:{«id»:631290,

Quindi, abbiamo tutte le informazioni necessarie per scrivere gli script per Mikrotik, precisamente:

Token del bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID della chat a cui deve scrivere: 631290

Per verificarlo, possiamo accedere tramite browser:

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

Dovremmo ricevere un risultato:

Attivazione remota degli script Mikrotik da Telegram

Per comodità, aggiungiamo subito i comandi per il bot:

Troviamo l'account con il nome @botfather
Dopo di che scriviamo il comando /setcommands

  • Chiederà a quale bot

Scriviamo:
@MikrotikROuter_bot

Aggiungiamo i comandi:

  • helloworld< — Messaggio di test nella chat 1
  • itsworking — Messaggio di test nella chat 2
  • wolmypc — risveglia il mio PC

Ora, se scriviamo in chat «/», dovremmo ricevere:

Attivazione remota degli script Mikrotik da Telegram

Ora passiamo a MikroTik.

In RouterOS c'è un'utilità da console per copiare file tramite ftp o http/https, l'utilità si chiama fetch, e sarà quella che utilizzeremo.

Apriamo terminal e inseriamo:

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

Si noti che in MikroTik è necessario «» per eseguire l'escape del carattere «?» nell'URL.

Dovremmo ricevere un risultato:

Attivazione remota degli script Mikrotik da Telegram

Ora passiamo agli script:

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

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-result
    t=no"

Non dimentichiamo di specificare il corretto mac e il nome dell'interfaccia, così come il bot-token e il chat_id.

Ora spiegherò brevemente cosa fanno:

Lo script «helloworld» invia un messaggio: » Hello, world!» nella nostra chat con il bot.
Lo script «itsworking» invia un messaggio: » Test OK, it’s Working !» nella nostra chat con il bot.
Questi script sono per dimostrare il funzionamento.
Ho aggiunto lo script «wolmypc» come una delle possibili implementazioni.
Al termine dell'esecuzione dello script, il bot scriverà in chat «wol OK».
In sostanza, è possibile eseguire qualsiasi script.

Creiamo un'attività:

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

Vista leggibileè strano perché dallo script funzionante non viene restituito alcun dato globale, ho aggiunto lo script all'avvio del sistema.
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=Non posso parlare con te. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no; 
} 

Come funziona

Scarichiamo i nostri messaggi «getUpdates» ogni 30 secondi, poi li analizziamo per scoprire update_id (numero del messaggio) e text (i nostri comandi) e chat_id . Per impostazione predefinita, getUpdates restituisce da 1 a 100 messaggi; per comodità, dopo aver letto il comando, eliminiamo il messaggio. Nell'API di Telegram è specificato che per leggere un messaggio è necessario il numero del messaggio + 1

/getUpdates?offset=update_id + 1

Tutto testato su Mikrotik rb915 RouterOS 6.37.1
Se inviati molti comandi insieme, verranno eseguiti uno dopo l'altro con un intervallo di 30 secondi.

P.S. Un enorme grazie a Kirill Kazakov per l'idea e al mio amico Alexander per l'assistenza con gli script.

Link

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

aggiornamento:

03:11:16

Ho aggiornato gli script:

Ho aggiunto un controllo per chat_id
Controllo per gli utenti, se qualcuno scrive al nostro bot, lui risponderà: » Non posso parlare con te. «, risponderà allo stesso modo se non riconosce il comando.
Dopo l'esecuzione del comando, il bot invia un messaggio in chat (vedi Script wolmypc)

UPD

Trovato con 7Stuntman7 che il file con più di ~ 14 messaggi smette di essere elaborato dal comando find (limitazioni di Mikrotik). Pertanto, in futuro rimodificherò lo script in lua, grazie 7Stuntman7 per questo, non sapevo di lua.

UPD 08.12.2016

sembra che in Telegram abbiano leggermente modificato l'output di getUpdate. ora nel script principale è necessario correggere lo spostamento del messaggio da 2 a 1

cambiamenti

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

sostituire con :

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

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster