Această implementare a fost inspirată de Alexandr Koryukin în publicația sa „«.
Ș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

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:

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:

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:

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:

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
: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 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 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
