Accensione remota degli script Mikrotik da Telegram

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

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

Accensione remota degli script Mikrotik da Telegram
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:

Accensione remota degli script Mikrotik da Telegram

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:

Accensione remota degli script Mikrotik da Telegram

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:

Accensione remota degli script Mikrotik da Telegram

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:

Accensione remota degli script Mikrotik da Telegram

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

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

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

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