Activación remota de scripts Mikrotik desde Telegram

Alexander Koryukin impulsoume a esta implementación GeXoGeN coa súa publicaciónAcendido remoto do ordenador de forma gratuíta, sen SMS e sen nubes, usando Mikrotik«.

E un comentario nun dos grupos VK de Kirill Kazakov:

Si, non é seguro para nada. Prefiro escribir un bot de telegram que só acepte comandos de activación da miña conta.

Decidín escribir un bot así.

Entón, o primeiro que hai que facer é crear un bot en Telegram.

  • Atopamos na busca unha conta chamada @botfather
  • Fai clic no botón Inicio na parte inferior da pantalla
  • Despois escribimoslle o comando / newbot

Despois respondemos a 2 preguntas sinxelas:

  • A primeira pregunta é o nome do bot que se vai crear. MyMikrotikROuter
  • A segunda pregunta é o alcume do bot que se está a crear (debe rematar con bot) MikrotikROuter_bot

Como resposta, recibiremos o token do noso bot, no meu caso é:

Use este token para acceder á API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Activación remota de scripts Mikrotik desde Telegram
Entón, debes atopar o noso bot na busca por nome @MikrotikROuter_bot e prema o botón Inicio.

Despois diso, cómpre abrir o navegador e introducir a seguinte liña:

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

Onde XXXXXXXXXXXXXXXXXX é o token do teu bot.

Abrirase unha páxina semellante á seguinte:

Activación remota de scripts Mikrotik desde Telegram

Atopamos nel o seguinte texto:

"chat":{"id":631290,

Polo tanto, temos toda a información necesaria para escribir guións para Mikrotik, a saber:

Token de bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID do chat onde debe escribir: 631290

Para comprobar, podemos pasar polo navegador:

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

Debería obter o resultado:

Activación remota de scripts Mikrotik desde Telegram

Para a nosa comodidade, engadiremos inmediatamente comandos para o bot:

Buscar unha conta cun nome @botfather
Despois escribimoslle un comando / setcommands

  • El preguntará que bot

Escribimos:
@MikrotikROuter_bot

Engadir comandos:

  • helloworld< — Proba a mensaxe no chat 1
  • itsworking-Test Mensaxe no chat 2
  • wolmypc: esperta o meu PC

Agora, se escribes "/" no chat, deberías obter:

Activación remota de scripts Mikrotik desde Telegram

Agora imos pasar a MikroTik.

RouterOS ten unha utilidade de consola para copiar arquivos vía ftp ou http/https, a utilidade chámase fetch, que é o que utilizaremos.

Aberto terminal e introduce:

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

Teña en conta que MikroTik necesita "» para escapar do sinal «?' no URL.

Debería obter o resultado:

Activación remota de scripts Mikrotik desde Telegram

Agora imos pasar aos guións:

ola mundo

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}

o seu funcionamento

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"

Non esquezas especificar o nome correcto do mac e da interface, así como o bot-token e o chat_id.

Agora vou explicar un pouco o que fan:

O script "helloworld" envía unha mensaxe: "Ola, mundo!" ao noso chat co bot.
O script "itsworking" envía unha mensaxe: "Proba OK, está funcionando!" ao noso chat co bot.
Estes guións son para fins de demostración.
Engadín o script "wolmypc" como unha das posibles implementacións.
Tras a execución do script, o bot escribirá "wol OK" no chat.
De feito, pode executar absolutamente calquera script.

Crea unha tarefa:

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 lexiblenon está claro por que, pero a partir do script de traballo non revela datos globais, engadiu o script cando se inicia o sistema.
Inicio de Telegram

: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") ;

Telegrama

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

Chat isto

Descarga as nosas mensaxes "getUpdates" cada 30 segundos e, a continuación, analiza para averiguar update_id (número da mensaxe) e texto (os nosos equipos) e chat_id . Por defecto, getUpdates mostra de 1 a 100 mensaxes, por comodidade, despois de ler o comando, borramos a mensaxe. A API de Telegram di que para ler unha mensaxe necesitas o número da mensaxe + 1

/getUpdates?offset=update_id + 1

Todo probado en Mikrotik rb915 RouterOS 6.37.1
Se envías moitos comandos á vez, executaranse todos á súa vez cun intervalo de 30 segundos.

PD Moitas grazas a Kirill Kazakov pola idea e ao meu amigo Alexander pola axuda cos guións.

referencias

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

actualizado:

03:11:16

Scripts mellorados:

Engadiuse a comprobación de chat_id
Comprobando que hai un parvo, se alguén escribe ao noso bot, responderá: "Non podo falar contigo. “, responderanos do mesmo xeito se non recoñece o comando.
Despois de executar o comando, o bot cancela a subscrición ao chat (ver script wolmypc)

DUP

Atopado con 7 Doublo 7 que un ficheiro con máis de ~14 mensaxes xa non se procesa polo comando find (limitacións de Mikrotik). Polo tanto, no futuro, cambiarei o guión a lua, grazas 7 Doublo 7 para iso, non sabía de lua.

Actualidade 08.12.2016

en Telegram, ao parecer, cambiaron lixeiramente o "esgotamento" de getUpdate. agora no script principal cómpre corrixir a compensación da mensaxe de 2 a 1

cambios

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

заменить на :

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

Fonte: www.habr.com