Activare la distanță a scripturilor Mikrotik din Telegram

Această implementare a fost inspirată de Alexandr Koryukin GeXoGeN în publicația sa „Activarea la distanță a computerului, gratuit, fără SMS și fără cloud-uri, folosind Mikrotik«.

Și un comentariu într-unul dintre grupurile VK ale lui Kiril Kazakov:

Da, cumva nu este foarte sigur. Mai bine aș scrie un bot pentru Telegram care primește comenzi de activare doar din contul meu.

Am decis să scriu un astfel de bot.

Așadar, primul lucru pe care trebuie să-l facem este să creăm un bot în Telegram.

  • Căutăm în căutare contul cu numele @botfather
  • Apăsăm butonul Start din partea de jos a ecranului
  • După care scriem comanda /newbot

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

  • Prima întrebare – numele botului pe care îl creăm MyMikrotikROuter
  • A doua întrebare – nickname-ul botului creat (trebuie să se termine cu bot) MikrotikROuter_bot

Răspunsul va conține tokenul botului nostru, în cazul meu este:

Folosește acest token pentru a accesa API-ul HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Activare la distanță a scripturilor Mikrotik din Telegram
Apoi, trebuie să ne căutăm botul după nume @MikrotikROuter_bot și să apăsăm butonul Start.

După aceasta, trebuie să deschidem browserul și să introducem următoarea linie:

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

Unde XXXXXXXXXXXXXXXXXX – tokenul botului tău.

Se va deschide o pagină de cam așa:

Activare la distanță a scripturilor Mikrotik din Telegram

Căutăm pe ea următorul text:

„chat”:{„id”:631290,

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

Tokenul botului: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID-ul chatului în care trebuie să scrie: 631290

Pentru verificare putem accesa prin browser:

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

Ar trebui să obținem rezultatul:

Activare la distanță a scripturilor Mikrotik din Telegram

Pentru confortul nostru, să adăugăm imediat comenzi pentru bot:

Căutăm contul cu numele @botfather
După care scriem comanda /setcommands

  • Va întreba pentru care bot

Scriem:
@MikrotikROuter_bot

Adăugăm comenzi:

  • helloworld< — Mesaj test pe chat 1
  • itsworking — Mesaj test pe chat 2
  • wolmypc — activează PC-ul meu

Acum, dacă tastăm în chat „/”, ar trebui să obținem:

Activare la distanță a scripturilor Mikrotik din Telegram

Acum trecem la MikroTik.

În RouterOS există un utilitar de consolă pentru copierea fișierelor prin ftp sau http/https, utilitarul se numește fetch, exact cu el vom lucra.

Deschidem terminal și introducem:

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

Atenție, în MikroTik este necesar „” pentru a escapa caracterul „?” în URL.

Ar trebui să obținem rezultatul:

Activare la distanță a scripturilor Mikrotik din Telegram

Acum trecem la scripturi:

helloworld

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}

itsworking

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

scriptul sistemului adaugă nume="wolmypc" politică=read sursă="/tool wol mac=XX:XX:XX:XX:XX:XX interfață=ifnamer
    /tool fetch url="https://api.telegram.org/boXXXXXXXXXXXXXXXXXXX?chat_id=631290&text=wol OK" păstrează-rezultatul=no"

Nu uitați să specificați corect mac-ul și numele interfeței, precum și bot-token și chat_id.

Acum o să explic puțin ce fac:

Scriptul „helloworld” trimite un mesaj: „Hello, world!” în chat-ul nostru cu botul.
Scriptul „itsworking” trimite un mesaj: „Test OK, it’s Working !” în chat-ul nostru cu botul.
Aceste scripturi sunt pentru a demonstra funcția.
Scriptul „wolmypc” l-am adăugat ca una dintre implementările posibile.
După executarea scriptului, botul va scrie în chat „wol OK”.
În esență, poți rula orice script.

Creăm 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

Formă lizibilănu înțeleg de ce, dar scriptul de lucru nu dezvăluie date globale, am adăugat scriptul la încărcarea sistemului.
Telegram-startup

: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=Nu pot discuta cu tine. ") păstrează-rezultatul=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") păstrează-rezultatul=no; 
} 

Cum funcționează

Descărcăm mesajele noastre „getUpdates” la fiecare 30 de secunde, apoi le analizăm pentru a afla update_id (numărul mesajului) și text (comenzile noastre) și chat_id . În mod implicit, getUpdates trimite de la 1 la 100 de mesaje, pentru comoditate, după citirea comenzii, mesajul este șters. În API-ul Telegram se menționează că pentru a citi un mesaj este necesar numărul mesajului + 1.

/getUpdates?offset=update_id + 1

Totul a fost verificat pe Mikrotik rb915 RouterOS 6.37.1.
Dacă trimiți imediat multe comenzi, acestea vor fi executate una câte una cu un interval de 30 de secunde.

P.S. Un mare mulțumesc lui Kiril Kazakov pentru idee și prietenului meu Alexander pentru ajutorul cu scripturile.

Linkuri

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

Am terminat scripturile:

Am adăugat o verificare pentru chat_id
Verificare de bază, dacă cineva scrie botului nostru, acesta îi va răspunde: » Nu pot vorbi cu tine. «, va răspunde, de asemenea, dacă nu recunoaște comanda.
După executarea comenzii, botul trimite un mesaj în chat (vezi scriptul wolmypc)

UPD

Am găsit cu 7Stuntman7 că fișierul cu mai mult de ~ 14 mesaje încetează să fie procesat de comanda find (restricții Mikrotik). Așadar, în viitor am de gând să rescriu scriptul în lua, mulțumesc 7Stuntman7 pentru asta, nu știam despre lua.

UPD 08.12.2016

în Telegram aparent au schimbat un pic «ieșirea» getUpdate. Acum, în scriptul principal, trebuie să corectez decalajul mesajului de la 2 la 1

modificări

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

schimbați cu :

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

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster