Activació remota dels scripts de Mikrotik des de Telegram

Alexander Koryukin em va empènyer a aquesta implementació GeXoGeN amb la seva publicació"Enceneu l'ordinador de forma remota de forma gratuïta, sense SMS i sense núvols, amb Mikrotik".

I un comentari en un dels grups VK de Kirill Kazakov:

Sí, no és gens segur. Preferiria escriure un bot de telegram que només accepti ordres d'activació del meu compte.

Vaig decidir escriure un bot així.

Per tant, el primer que heu de fer és crear un bot a Telegram.

  • Trobem a la cerca un compte amb el nom @botfather
  • Feu clic al botó Inici a la part inferior de la pantalla
  • Després li escrivim l'ordre /newbot

Després responem a 2 preguntes senzilles:

  • La primera pregunta és el nom del bot que s'està creant MyMikrotikROuter
  • La segona pregunta és el sobrenom del bot que s'està creant (ha d'acabar en bot) MikrotikROuter_bot

En resposta, rebrem el testimoni del nostre bot, en el meu cas és:

Utilitzeu aquest testimoni per accedir a l'API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Activació remota dels scripts de Mikrotik des de Telegram
Aleshores, heu de trobar el nostre bot a la cerca per nom @MikrotikROuter_bot i feu clic al botó Inici.

Després d'això, heu d'obrir el vostre navegador i introduir la línia següent:

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

On XXXXXXXXXXXXXXXXXX és el testimoni del teu bot.

S'obrirà una pàgina semblant a la següent:

Activació remota dels scripts de Mikrotik des de Telegram

Hi trobem el text següent:

"xat":{"id":631290,

Per tant, tenim tota la informació necessària per escriure scripts per a Mikrotik, és a dir:

Token de bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID de xat on hauria d'escriure: 631290

Per comprovar-ho, podem passar pel navegador:

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

Hauríeu d'obtenir el resultat:

Activació remota dels scripts de Mikrotik des de Telegram

Per a la nostra comoditat, afegim immediatament ordres per al bot:

Trobar un compte amb el nom @botfather
Després li escrivim una ordre / setcommands

  • Li preguntarà quin bot

Nosaltres escrivim:
@MikrotikROuter_bot

Afegint ordres:

  • helloworld< — Missatge de prova al xat 1
  • itsworking — Missatge de prova al xat 2
  • wolmypc - desperta el meu ordinador

Ara, si escriviu "/" al xat, hauríeu d'obtenir:

Activació remota dels scripts de Mikrotik des de Telegram

Ara passem a MikroTik.

RouterOS té una utilitat de consola per copiar fitxers via ftp o http/https, la utilitat s'anomena fetch, que és la que farem servir.

Obert terminal i introduïu:

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

Tingueu en compte que MikroTik requereix ""escapar del senyal"?" a l'URL.

Hauríeu d'obtenir el resultat:

Activació remota dels scripts de Mikrotik des de Telegram

Ara passem als scripts:

Hola món

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}

està funcionant

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"

No us oblideu d'especificar el nom correcte del mac i de la interfície, així com el bot-token i el chat_id.

Ara us explicaré una mica què fan:

L'script "helloworld" envia el missatge: "Hola, món!" al nostre xat amb el bot.
L'script "itsworking" envia el missatge: "Prova bé, funciona!" al nostre xat amb el bot.
Aquests guions serveixen per demostrar el treball.
He afegit l'script "wolmypc" com una de les possibles implementacions.
Quan s'hagi completat l'script, el bot escriurà "wol OK" al xat.
De fet, podeu executar qualsevol script.

Crea una tasca:

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 llegibleNo està clar per què, però no anuncia dades globals de l'script de treball, l'script es va afegir quan el sistema arrenca.
Telegram-engegada

: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=I can't talk with you. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no; 
} 

Com funciona això

Baixem els nostres missatges "getUpdates" cada 30 segons i, a continuació, els analitzem per esbrinar-los update_id (número del missatge) i text (els nostres equips) i xat_id . Per defecte, getUpdates mostra d'1 a 100 missatges; per comoditat, després de llegir l'ordre, el missatge s'elimina. l'API de Telegram diu que per llegir un missatge cal el número de missatge + 1

/getUpdates?offset=update_id + 1

Tot provat a Mikrotik rb915 RouterOS 6.37.1
Si envieu moltes ordres alhora, totes s'executaran una per una amb un interval de 30 segons.

PD Moltes gràcies a Kirill Kazakov per la idea i al meu amic Alexander per la seva ajuda amb els guions.

Referències

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

actualitzat:

03:11:16

Scripts millorats:

S'ha afegit la comprovació de chat_id
Si algú escriu al nostre bot, aquest li respondrà: "No puc parlar amb tu". ", ens respondrà de la mateixa manera si no reconeix l'ordre.
En executar l'ordre, el bot es cancel·la la subscripció al xat (vegeu l'script wolmypc)

UPD

Trobat amb 7 Doble 7 que un fitxer amb més de ~14 missatges ja no es processa per l'ordre find (limitacions de Mikrotik). Per tant, en el futur tornaré a refer el guió a lua, gràcies 7 Doble 7 per això, no sabia de lua.

UPD 08.12.2016/XNUMX/XNUMX

Aparentment, Telegram va canviar una mica l'"escapament" de getUpdate. Ara, a l'script principal, heu de corregir el desplaçament del missatge de 2 a 1

canvis

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

заменить на :

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

Font: www.habr.com