Alexander Koryukin em va empènyer a aquesta implementació
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
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:
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:
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:
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:
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
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
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