Vzdialená aktivácia skriptov Mikrotik z Telegramu

Alexander Koryukin ma dotlačil k tejto implementácii GeXoGeN s jeho publikáciouZapnutie počítača na diaľku zadarmo, bez SMS a bez cloudov, pomocou Mikrotiku".

A komentár v jednej zo skupín VK od Kirilla Kazakova:

Áno, nie je to vôbec bezpečné. Radšej by som napísal telegramového robota, ktorý z môjho účtu prijíma iba aktivačné príkazy.

Rozhodol som sa napísať takého bota.

Takže prvá vec, ktorú musíte urobiť, je vytvoriť robota v telegrame.

  • Vo vyhľadávaní nájdeme účet s názvom @botfather
  • Kliknite na tlačidlo Štart v spodnej časti obrazovky
  • Potom mu napíšeme príkaz / newbot

Potom odpovieme na 2 jednoduché otázky:

  • Prvou otázkou je názov robota, ktorý sa má vytvoriť. MyMikrotikROuter
  • Druhá otázka je prezývka vytvoreného robota (mala by končiť botom) MikrotikROuter_bot

Ako odpoveď dostaneme token nášho robota, v mojom prípade je to:

Použite tento token na prístup k HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Vzdialená aktivácia skriptov Mikrotik z Telegramu
Potom musíte nájsť nášho robota vo vyhľadávaní podľa mena @MikrotikROuter_bota stlačte tlačidlo Štart.

Potom musíte otvoriť prehliadač a zadať nasledujúci riadok:

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

Kde XXXXXXXXXXXXXXXXXX je token vášho robota.

Otvorí sa stránka podobná nasledujúcej:

Vzdialená aktivácia skriptov Mikrotik z Telegramu

Nájdeme na ňom nasledujúci text:

"chat":{"id":631290,

Máme teda všetky potrebné informácie na písanie skriptov pre Mikrotik, konkrétne:

Token robota: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID chatu, kam má napísať: 631290

Ak chcete skontrolovať, môžeme prejsť cez prehliadač:

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

Mal by dostať výsledok:

Vzdialená aktivácia skriptov Mikrotik z Telegramu

Pre naše pohodlie okamžite pridáme príkazy pre robota:

Nájdenie účtu s názvom @bototec
Potom mu napíšeme príkaz / setcommands

  • Spýta sa, ktorý robot

Píšeme:
@MikrotikROuter_bot

Pridať príkazy:

  • helloworld< — Testovacia správa na chate 1
  • jeho fungujúca-Testovacia správa na chate 2
  • wolmypc-zobuď môj PC

Ak teraz v chate napíšete „/“, mali by ste dostať:

Vzdialená aktivácia skriptov Mikrotik z Telegramu

Teraz prejdime na MikroTik.

RouterOS má konzolovú utilitu na kopírovanie súborov cez ftp alebo http / https, utilita sa nazýva fetch, čo je to, čo budeme používať.

Otvoriť terminál a zadajte:

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

Upozorňujeme, že MikroTik potrebuje "» uniknúť znameniu «?“ v adrese URL.

Mal by dostať výsledok:

Vzdialená aktivácia skriptov Mikrotik z Telegramu

Teraz prejdime k skriptom:

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}

funguje to

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"

Nezabudnite zadať správny mac a názov rozhrania, ako aj bot-token a chat_id.

Teraz trochu vysvetlím, čo robia:

Skript "helloworld" posiela správu: "Ahoj, svet!" do nášho rozhovoru s robotom.
Skript "itsworking" odošle správu: "Test OK, funguje!" do nášho rozhovoru s robotom.
Tieto skripty slúžia na demonštračné účely.
Ako jednu z možných implementácií som pridal skript "wolmypc".
Po vykonaní skriptu bot napíše do chatu „wol OK“.
V skutočnosti môžete spustiť úplne akýkoľvek skript.

Vytvorte úlohu:

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

Čitateľné zobrazenienie je jasné prečo, ale z pracovného skriptu nezverejňuje globálne údaje, dodal skript pri štarte systému.
Spustenie telegramu

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

Ako to funguje

Stiahnite si naše správy „getUpdates“ každých 30 sekúnd a potom ich analyzujte, aby ste to zistili update_id (číslo správy) a text (naše tímy) a chat_id . V predvolenom nastavení getUpdates zobrazuje 1 až 100 správ, po prečítaní príkazu správu vymažeme. Telegram api hovorí, že na prečítanie správy potrebujete číslo správy + 1

/getUpdates?offset=update_id + 1

Všetko testované na Mikrotik rb915 RouterOS 6.37.1
Ak odošlete veľa príkazov naraz, všetky sa vykonajú postupne v intervale 30 sekúnd.

PS Veľká vďaka Kirillovi Kazakovovi za nápad a môjmu priateľovi Alexandrovi za pomoc so scenármi.

referencie

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

upd:

03:11:16

Vylepšené skripty:

Bola pridaná kontrola pre chat_id
Ak niekto napíše nášmu robotovi, skontroluje, či nie je hlupák, odpovie mu: „Nemôžem s tebou hovoriť. “, podobne nám odpovie, ak príkaz nepozná.
Po vykonaní príkazu sa robot odhlási z chatu (pozri skript wolmypc)

DUP

Nájdené s 7 Kaskadér7 že súbor s viac ako 14 správami už nie je spracovaný príkazom find (obmedzenia Mikrotiku). Preto v budúcnosti zmením scenár na lua, vďaka 7 Kaskadér7 pre toto som nevedel o lua.

UPD 08.12.2016. XNUMX. XNUMX

v telegrame zrejme mierne zmenili „výfuk“ getUpdate. teraz v hlavnom skripte musíte opraviť posun správy z 2 na 1

zmeny

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

заменить на :

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

Zdroj: hab.com