Activarea de la distanță a scripturilor Mikrotik din Telegram

Alexander Koryukin m-a împins la această implementare GeXoGeN cu publicarea saPornirea computerului de la distanță gratuit, fără SMS și fără nori, folosind Mikrotik“.

Și un comentariu într-unul dintre grupurile VK de Kirill Kazakov:

Da, nu este deloc sigur. Prefer să scriu un bot telegram care acceptă doar comenzi de activare din contul meu.

Am decis să scriu un astfel de bot.

Deci, primul lucru de făcut este să creați un bot în telegram.

  • Găsim în căutare un cont numit @botfather
  • Faceți clic pe butonul Start din partea de jos a ecranului
  • Apoi îi scriem comanda / newbot

Apoi răspundem la 2 întrebări simple:

  • Prima întrebare este numele botului care urmează să fie creat. MyMikrotikROuter
  • A doua întrebare este porecla botului creat (ar trebui să se termine cu bot) MikrotikROuter_bot

Ca răspuns, vom primi jetonul botului nostru, în cazul meu este:

Utilizați acest token pentru a accesa API-ul HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Activarea de la distanță a scripturilor Mikrotik din Telegram
Apoi, trebuie să găsiți botul nostru în căutarea după nume @MikrotikROuter_bot și apăsați butonul Start.

După aceea, trebuie să deschideți browserul și să introduceți următoarea linie:

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

Unde XXXXXXXXXXXXXXXXXX este simbolul botului tău.

Se va deschide o pagină similară cu următoarea:

Activarea de la distanță a scripturilor Mikrotik din Telegram

Pe el găsim următorul text:

"chat":{"id":631290,

Deci, avem toate informațiile necesare pentru a scrie scripturi pentru Mikrotik, și anume:

Token bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID de chat unde ar trebui să scrie: 631290

Pentru a verifica, putem trece prin browser:

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

Ar trebui să obțină rezultatul:

Activarea de la distanță a scripturilor Mikrotik din Telegram

Pentru confortul nostru, vom adăuga imediat comenzi pentru bot:

Găsirea unui cont cu nume @botfather
Apoi îi scriem o comandă / setcommands

  • Va întreba care bot

Noi scriem:
@MikrotikROuter_bot

Adăugați comenzi:

  • helloworld< — Testează mesajul pe chat 1
  • itsworking-Test mesaj pe chat 2
  • wolmypc-trezi computerul meu

Acum, dacă tastați „/” în chat, ar trebui să obțineți:

Activarea de la distanță a scripturilor Mikrotik din Telegram

Acum să trecem la MikroTik.

RouterOS are un utilitar de consolă pentru copierea fișierelor prin ftp sau http/https, utilitarul se numește fetch, ceea ce vom folosi.

Deschidem terminal si introduceti:

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

Vă rugăm să rețineți că MikroTik are nevoie de „» pentru a scăpa de semn «?' în adresa URL.

Ar trebui să obțină rezultatul:

Activarea de la distanță a scripturilor Mikrotik din Telegram

Acum să trecem la scripturi:

Salut Lume

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}

functioneaza

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"

Nu uitați să specificați numele corect pentru Mac și interfață, precum și bot-token și chat_id.

Acum voi explica puțin ce fac ei:

Scriptul „helloworld” trimite un mesaj: „Hello, world!” la chat-ul nostru cu botul.
Scriptul „itsworking” trimite un mesaj: „Test OK, it’s Working!” la chat-ul nostru cu botul.
Aceste scripturi au scop demonstrativ.
Am adăugat scriptul „wolmypc” ca una dintre posibilele implementări.
La executarea scriptului, botul va scrie „wol OK” pe chat.
De fapt, puteți rula absolut orice script.

Creați o sarcină:

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

Vizualizare care poate fi cititănu este clar de ce, dar din scriptul de lucru nu dezvăluie date globale, a adăugat scriptul când sistemul pornește.
Pornire 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") ;

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

Cum funcționează

Descărcați mesajele noastre „getUpdates” la fiecare 30 de secunde, apoi analizați pentru a afla update_id (numărul mesajului) și a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match. (echipele noastre) și chat_id . În mod implicit, getUpdates afișează de la 1 la 100 de mesaje, pentru comoditate, după citirea comenzii, ștergem mesajul. API-ul Telegram spune că pentru a citi un mesaj aveți nevoie de numărul mesajului + 1

/getUpdates?offset=update_id + 1

Toate au fost testate pe Mikrotik rb915 RouterOS 6.37.1
Dacă trimiteți mai multe comenzi deodată, toate vor fi executate pe rând cu un interval de 30 de secunde.

PS Mulțumesc mult lui Kirill Kazakov pentru idee și prietenului meu Alexander pentru ajutor cu scenariile.

referințe

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

upd:

03:11:16

Scripturi îmbunătățite:

S-a adăugat verificarea pentru chat_id
Verificând un prost, dacă cineva îi scrie botului nostru, acesta îi va răspunde: „Nu pot vorbi cu tine. „, ne va răspunde în mod similar dacă nu recunoaște comanda.
După executarea comenzii, botul se dezabonează la chat (vezi scriptul wolmypc)

DUP

Găsit cu 7 cascador7 că un fișier cu peste ~14 mesaje nu mai este procesat de comanda find (limitări Mikrotik). Prin urmare, în viitor, voi schimba scriptul în lua, mulțumesc 7 cascador7 pentru asta, nu stiam de lua.

UPD 08.12.2016/XNUMX/XNUMX

în Telegram, se pare, au schimbat ușor „eșapamentul” getUpdate. acum, în scriptul principal, trebuie să corectați decalajul mesajului de la 2 la 1

modificări

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

заменить на :

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

Sursa: www.habr.com