Vzdálená aktivace skriptů Mikrotik z Telegramu

Alexander Koryukin mě dotlačil k této implementaci GeXoGeN s jeho publikacíZapnutí počítače na dálku zdarma, bez SMS a bez cloudů, pomocí Mikrotiku".

A komentář v jedné ze skupin VK od Kirilla Kazakova:

Jo, není to vůbec bezpečné. Raději bych napsal telegramového robota, který přijímá pouze aktivační příkazy z mého účtu.

Rozhodl jsem se napsat takového bota.

Takže první věc, kterou musíte udělat, je vytvořit robota v telegramu.

  • Ve vyhledávání najdeme účet s názvem @botfather
  • Klepněte na tlačítko Start ve spodní části obrazovky
  • Poté mu napíšeme příkaz / newbot

Pak odpovíme na 2 jednoduché otázky:

  • První otázkou je název robota, který má být vytvořen. MyMikrotikROuter
  • Druhá otázka je přezdívka vytvářeného bota (měla by končit botem) MikrotikROuter_bot

Jako odpověď obdržíme token našeho robota, v mém případě je to:

Pro přístup k HTTP API použijte tento token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Vzdálená aktivace skriptů Mikrotik z Telegramu
Pak musíte najít našeho robota ve vyhledávání podle jména @MikrotikROuter_bota stiskněte tlačítko Start.

Poté musíte otevřít prohlížeč a zadat následující řádek:

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

Kde XXXXXXXXXXXXXXXXXX je token vašeho robota.

Otevře se stránka podobná následující:

Vzdálená aktivace skriptů Mikrotik z Telegramu

Najdeme na něm následující text:

"chat":{"id":631290,

Máme tedy všechny potřebné informace pro psaní skriptů pro Mikrotik, konkrétně:

Token robota: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID chatu, kam má napsat: 631290

Pro kontrolu můžeme projít prohlížeč:

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

Měl by dostat výsledek:

Vzdálená aktivace skriptů Mikrotik z Telegramu

Pro naše pohodlí okamžitě přidáme příkazy pro robota:

Nalezení účtu se jménem @bototec
Pak mu napíšeme příkaz / setcommands

  • Zeptá se, který robot

Píšeme:
@MikrotikROuter_bot

Přidat příkazy:

  • helloworld< — Testovací zpráva na chatu 1
  • itsworking-Test Message na chatu 2
  • wolmypc-probuď můj PC

Pokud nyní v chatu napíšete „/“, měli byste získat:

Vzdálená aktivace skriptů Mikrotik z Telegramu

Nyní přejděme k MikroTiku.

RouterOS má konzolovou utilitu pro kopírování souborů přes ftp nebo http / https, utilita se nazývá fetch, což je to, co budeme používat.

Otevřít terminál a zadejte:

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

Upozorňujeme, že MikroTik potřebuje "» uniknout znamení «?“ v adrese URL.

Měl by dostat výsledek:

Vzdálená aktivace skriptů Mikrotik z Telegramu

Nyní přejdeme ke skriptům:

Ahoj světe

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"

Nezapomeňte zadat správný mac a název rozhraní, stejně jako bot-token a chat_id.

Nyní trochu vysvětlím, co dělají:

Skript "helloworld" posílá zprávu: "Ahoj, světe!" do našeho chatu s robotem.
Skript "itsworking" odešle zprávu: "Test OK, funguje!" do našeho chatu s robotem.
Tyto skripty jsou pro demonstrační účely.
Jako jednu z možných implementací jsem přidal skript "wolmypc".
Po spuštění skriptu bot napíše do chatu „wol OK“.
Ve skutečnosti můžete spustit naprosto jakýkoli skript.

Vytvořte úkol:

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

Čitelný pohlednení jasné proč, ale z pracovního skriptu nezveřejňuje globální data, dodal skript při startu systému.
Spuštění 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; 
} 

Jak to funguje

Stáhněte si naše zprávy „getUpdates“ každých 30 sekund a poté je analyzujte, abyste to zjistili update_id (číslo zprávy) a (souhrnně „Stránka (Stránky)“), a naše postupy pro shromažďování, využívání, uchovávání, ochranu a zpřístupnění takových informací. Tyto zásady platí pro informace, které shromažďujeme na těchto stránkách nebo v e-mailu, textových a jiných elektronických zprávách mezi vámi a těmito stránkami. Rovněž popisují vaše možnosti týkající se využívání vašich osobních údajů, přístupu k nim a jejich opravě. (naše týmy) a chat_id . Ve výchozím nastavení getUpdates zobrazuje 1 až 100 zpráv, pro usnadnění po přečtení příkazu zprávu smažeme. Telegram api říká, že ke čtení zprávy potřebujete číslo zprávy + 1

/getUpdates?offset=update_id + 1

Vše testováno na Mikrotik rb915 RouterOS 6.37.1
Pokud odešlete mnoho příkazů najednou, všechny budou provedeny postupně v intervalu 30 sekund.

PS Mnohokrát děkuji Kirillu Kazakovovi za nápad a mému příteli Alexandrovi za pomoc se scénáři.

reference

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

upd:

03:11:16

Vylepšené skripty:

Přidána kontrola pro chat_id
Když někdo napíše našemu robotovi, zkontroluje, zda není hlupák, odpoví mu: „Nemůžu s tebou mluvit. “, podobně nám odpoví, pokud příkaz nerozpozná.
Po provedení příkazu se robot odhlásí z chatu (viz skript wolmypc)

UPD

Nalezeno s 7 Kaskadér7 že soubor s více než ~14 zprávami již není zpracován příkazem find (omezení Mikrotiku). Proto v budoucnu změním scénář na lua, díky 7 Kaskadér7 proto jsem o lua nevěděl.

UPD 08.12.2016. XNUMX. XNUMX

v Telegramu zřejmě mírně změnili „výfuk“ getUpdate. nyní v hlavním skriptu musíte opravit posun zprávy z 2 na 1

změny

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

заменить на :

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

Zdroj: www.habr.com