Alexander Koryukin impulsoume a esta implementación
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
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:
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:
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:
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:
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
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
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