Questa implementazione è stata ispirata da Aleksandr Koryukin con la sua pubblicazione ««.
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

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:

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:

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:

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:

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