Questa implementazione è stata ispirata da Alexander Koryukin con la sua pubblicazione ««.
E un commento in uno dei gruppi VK di Kirill Kazakov:
Beh, non è per niente sicuro. Preferirei scrivere un bot telegram che accetta solo comandi dal mio account per accendere.
Ho deciso di scrivere un tale bot.
Quindi, la prima cosa da fare è creare un bot su telegram.
- Cerchiamo nell'elenco degli account con il nome @botfather
- Clicchiamo sul pulsante Inizia 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 (deve terminare con bot) MikrotikROuter_bot
Riceveremo in risposta il token del nostro bot, nel mio caso è:
Usa questo token per accedere all'API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Dopo, dobbiamo cercare il nostro bot per nome @MikrotikROuter_bot e cliccare sul pulsante Inizia.
Dopo ciò, dobbiamo aprire un browser e inserire la seguente stringa:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Dove XXXXXXXXXXXXXXXXXX è il token del tuo bot.
Si aprirà una pagina simile a quella seguente:

Cerchiamo su di essa il seguente testo:
«chat»:{«id»:631290,
Quindi, abbiamo tutte le informazioni necessarie per scrivere script per Mikrotik, ovvero:
Token del bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID della chat a cui deve scrivere: 631290
Possiamo controllare tramite il browser:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Dovremmo ottenere il risultato:

Per nostra comodità, aggiungiamo subito i comandi per il bot:
Troviamo l'account con il nome @botfather
Dopodiché gli scriviamo il comando /setcommands
- Ci 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 — Accendi il mio PC
Ora, se digitiamo nella chat "/", dovremmo ottenere:

Adesso passiamo a MikroTik.
In RouterOS c'è un'utilità da console per copiare file tramite ftp o http/https, l'utilità si chiama fetch, ed è proprio quella che useremo.
Apriamo terminal e digitiamo:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Nota che in MikroTik è necessario utilizzare «» per sfuggire al segno «?» nell'URL.
Dovremmo ottenere il risultato:

Adesso 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
script del sistema aggiungi nome="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"
Ricordati di inserire il MAC e il nome dell'interfaccia corretti, così come il bot-token e il chat_id.
Ora spiegherò brevemente cosa fanno:
Lo script «helloworld» invia un messaggio: » Hello, world!» nel nostro chat con il bot.
Lo script «itsworking» invia un messaggio: » Test OK, it’s Working !» nel nostro chat con il bot.
Questi script sono per dimostrare il funzionamento.
Ho aggiunto lo script «wolmypc» come una delle possibili implementazioni.
Al completamento dello script, il bot scriverà in chat «wol OK».
In sostanza, puoi eseguire qualsiasi script.
Creiamo un compito:
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
Visualizzazione leggibileNon è chiaro perché, ma lo script in esecuzione non espone i dati globali; 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 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 i comandi, 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 verificato su Mikrotik rb915 RouterOS 6.37.1
Se invii molte comandi in una volta, 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'aiuto con gli script.
Link
:Scripting
upd:
03:11:16
Ho migliorato gli script:
Ho aggiunto il controllo sul chat_id
Controllo per gli imbecilli, se qualcuno scrive al nostro bot, risponderà: » Non posso parlare con te. «, risponderà analogamente se non riconosce il comando.
Dopo l'esecuzione del comando, il bot risponde nella chat (vedi lo script wolmypc)
UPD
Trovato con che il file con più di ~14 messaggi smette di essere elaborato dal comando find (limiti di Mikrotik). Quindi in futuro riscriverò lo script in lua, grazie per questo, non sapevo di lua.
UPD 08.12.2016
in Telegram evidentemente hanno cambiato un po' il «output» di getUpdate. Ora nel script principale è necessario correggere lo spostamento del messaggio da 2 a 1
modifiche
:local message [:pick $content ($startLoc + 2) $endLoc] ;
sostituire con:
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Fonte: habr.com
