Alexander Koryukin me empurrou para esta implementação
E um comentário em um dos grupos VK de Kirill Kazakov:
Sim, não é nada seguro. Prefiro escrever um bot de telegrama que aceite apenas comandos de ativação da minha conta.
Eu decidi escrever tal bot.
Então, a primeira coisa a fazer é criar um bot no telegram.
- Encontramos na pesquisa uma conta chamada @botfather
- Clique no botão Iniciar na parte inferior da tela
- Então escrevemos para ele o comando / newbot
Então respondemos a 2 perguntas simples:
- A primeira pergunta é o nome do bot a ser criado. MeuMikrotikROuter
- A segunda pergunta é o apelido do bot que está sendo criado (deve terminar com bot) MikrotikROuter_bot
Como resposta receberemos o token do nosso bot, no meu caso é:
Use este token para acessar a API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Então, você precisa encontrar nosso bot na busca por nome @MikrotikROuter_bot e pressione o botão Iniciar.
Depois disso, você precisa abrir o navegador e inserir a seguinte linha:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Onde XXXXXXXXXXXXXXXXXX é o token do seu bot.
Uma página semelhante à seguinte será aberta:
Nele encontramos o seguinte texto:
"chat":{"id":631290,
Assim, temos todas as informações necessárias para escrever scripts para Mikrotik, a saber:
Símbolo do bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID do chat onde ele deve escrever: 631290
Para verificar, podemos ir através do navegador:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Deve obter o resultado:
Para nossa conveniência, adicionaremos imediatamente comandos para o bot:
Encontrar uma conta com um nome @botfather
Então nós escrevemos a ele um comando / setcommands
- Ele vai perguntar qual bot
Nós escrevemos:
@MikrotikROuter_bot
Adicionar comandos:
- helloworld< — Mensagem de teste no chat 1
- itsworking-Test Mensagem no chat 2
- wolmypc-acorde meu PC
Agora, se você digitar "/" no chat, deverá obter:
Agora vamos para o MikroTik.
O RouterOS possui um utilitário de console para copiar arquivos via ftp ou http / https, o utilitário se chama fetch, que é o que usaremos.
Abrir terminal e digite:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Observe que o MikroTik precisa de "» para escapar do sinal «?' na URL.
Deve obter o resultado:
Agora vamos aos scripts:
Olá 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}
está funcionando
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"
Não se esqueça de especificar o mac correto e o nome da interface, bem como bot-token e chat_id.
Agora vou explicar um pouco o que eles fazem:
O script "helloworld" envia uma mensagem: "Hello, world!" ao nosso bate-papo com o bot.
O script "itsworking" envia uma mensagem: "Test OK, it's Working!" ao nosso bate-papo com o bot.
Esses scripts são para fins de demonstração.
Adicionei o script "wolmypc" como uma das possíveis implementações.
Após a execução do script, o bot escreverá “wol OK” no chat.
Na verdade, você pode executar absolutamente qualquer script.
Crie uma 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
Visualização legívelnão está claro o porquê, mas a partir do script de trabalho ele não divulga dados globais, adicionado o script quando o sistema inicializa.
inicialização do telegrama
: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;
}
Как это работает
Baixe nossas mensagens "getUpdates" a cada 30 segundos e, em seguida, analise para descobrir atualização_id (número da mensagem) e texto (nossas equipes) e id_chat . Por padrão, getUpdates exibe de 1 a 100 mensagens, por conveniência, após a leitura do comando, excluímos a mensagem. A API do Telegram diz que para ler uma mensagem você precisa do número da mensagem + 1
/getUpdates?offset=update_id + 1
Todos testados no Mikrotik rb915 RouterOS 6.37.1
Se você enviar muitos comandos de uma só vez, eles serão executados por vez com um intervalo de 30 segundos.
PS Muito obrigado a Kirill Kazakov pela ideia e ao meu amigo Alexander pela ajuda com os scripts.
referências
atualiz:
03:11:16
Escritas melhoradas:
Verificação adicionada para chat_id
Verificando um tolo, se alguém escrever para o nosso bot, ele responderá: "Não posso falar com você. “, nos responderá da mesma forma se não reconhecer o comando.
Depois de executar o comando, o bot cancela a assinatura do chat (consulte o script wolmypc)
UPD
Encontrado com
UPD 08.12.2016
no Telegram, aparentemente, eles mudaram ligeiramente o "exaustão" do getUpdate. agora no script principal você precisa corrigir o deslocamento da mensagem de 2 para 1
mudanças
:local message [:pick $content ($startLoc + 2) $endLoc] ;
заменить на :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Fonte: habr.com