Mikrotik script távoli aktiválása Telegramból

Ez a megvalósítás Alexander Koryukin inspirációja nyomán történt. GeXoGeN a „Számítógép távoli bekapcsolása ingyenesen, SMS és felhők nélkül, Mikrotik segítségével.«.

És egy hozzászólás Kirill Kazakova egyik VK csoportjában:

Hát igen, nem túl biztonságos. Inkább írtam volna egy Telegram botot, ami csak az én fiókomból fogadja az indítási parancsokat.

Egy ilyen botot szerettem volna írni.

Tehát az első lépés, hogy létrehozzunk egy botot a Telegramon.

  • Keresünk a keresőben a @botfather nevű fiókot.
  • Megnyomjuk a Start gombot a képernyő alsó részén.
  • Ezután írunk neki egy parancsot: /newbot

Majd válaszolunk két egyszerű kérdésre:

  • Az első kérdés – a létrehozandó bot neve. MyMikrotikROuter
  • A második kérdés – a létrehozandó bot nickje (botra kell végződnie). MikrotikROuter_bot

Válaszként megkapjuk a botunk tokenjét, az én esetemben ez:

Használja ezt a tokent a HTTP API eléréséhez: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Mikrotik script távoli aktiválása Telegramból
Ezután meg kell találnunk a botunkat név alapján. @MikrotikROuter_bot és megnyomni a Start gombot.

Ezután megnyitjuk a böngészőt, és beírjuk a következő sort:

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

Ahol XXXXXXXXXXXXXXXXXX – a botod tokene.

Egy körülbelül a következő formátumú oldal nyílik meg:

Mikrotik script távoli aktiválása Telegramból

Keressük meg rajta a következő szöveget:

„chat”:{„id”:631290,

Tehát megvan minden szükséges információnk a Mikrotik szkriptek megírásához, nevezetesen:

A bot tokene: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

A chat ID, ahová írnia kell: 631290

Ellenőrzés céljából a böngészőn keresztül is beléphetünk:

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

A következőt kell hogy kapjuk:

Mikrotik script távoli aktiválása Telegramból

A kényelmünk érdekében azonnal adjunk parancsokat a botnak:

Keresünk egy fiókot a következő névvel: @botfather
Ezután írunk neki egy parancsot: /setcommands

  • Megkérdezi, melyik botnak:

mivel 16 alkalommal kell átkonvertálni 2 byte-ot a LED-vezérlő kimenetei számának megfelelően, így valahogy így:
@MikrotikROuter_bot

Hozzáadjuk a parancsokat:

  • helloworld< — Teszt üzenet az 1. chaten.
  • itsworking — Teszt üzenet a 2. chaten.
  • wolmypc — Ébreszd fel a számítógépem.

Most, ha beírjuk a chatbe a „/” jelet, akkor a következőt kell kapnunk:

Mikrotik script távoli aktiválása Telegramból

Most áttérünk a MikroTik-re.

A RouterOS-ban van egy parancssori segédprogram fájlok ftp vagy http/https átvitelére, a segédprogram neve fetch, ezt fogjuk használni.

Megnyitjuk a terminált és beírjuk:

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

Kérjük, vegye figyelembe, hogy a MikroTikben szükséges a „” a „?” jel elkerülésére az URL-ben.

A következőt kell hogy kapjuk:

Mikrotik script távoli aktiválása Telegramból

Most áttérünk a szkriptekhez:

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

rendszer 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"

Ne felejtsük el megadni a helyes mac-et és az interfész nevét, valamint a bot-token-t és chat_id-t.

Most egy kicsit magyarázok, hogy mit csinálnak:

A „helloworld” script üzenetet küld: „Hello, world!” a botunkkal való chatbe.
Az „itsworking” script üzenetet küld: „Teszt OK, működik!” a botunkkal való chatbe.
Ezek a script példák a működés bemutatására.
A „wolmypc” scriptet hozzáadtam, mint egy lehetséges megvalósítást.
A script végrehajtásakor a bot a chatbe írja: „wol OK”.
Valójában bármilyen scriptet el lehet indítani.

Feladat létrehozása:

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

Olvasható formátumNem tudni miért, de a működő script nem osztja meg a globális adatokat, a scriptet a rendszer indulásakor hozzáadtam.
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=Nem tudok beszélni veled.") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no; 
} 

Hogyan működik ez

Minden 30 másodpercben letöltjük az üzeneteinket „getUpdates” néven, majd feldolgozzuk, hogy megtudjuk update_id (üzenet száma) és szöveg (parancsaink) és chat_id . Alapértelmezés szerint a getUpdates 1 és 100 üzenetet ad vissza, a parancsok elolvasása után az üzenetet töröljük. A Telegram API szerint az üzenet elolvasásához az üzenet számát + 1-ett kell megadni

/getUpdates?offset=update_id + 1

Minden tesztelve a Mikrotik rb915 RouterOS 6.37.1-en
Ha egyszerre sok parancsot küldünk, azokat 30 másodperces intervallummal fogjuk végrehajtani.

P.S. Nagy köszönet Kirill Kazakov-nak az ötletért, és barátomnak Alexandr-nak a skriptekhez nyújtott segítségért.

Hivatkozások

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

Frissítettem a szkripteket:

Hozzáadtam a chat_id ellenőrzését
Buta ellenőrzés, ha valaki ír a botunknak, válaszolni fog: » I can’t talk with you. «, hasonlóan válaszol nekünk, ha nem ismeri fel a parancsot.
A parancs végrehajtása után a bot visszajelzést ad a chatben (lásd a wolmypc szkriptet)

UPD

Találtunk 7Stuntman7 hogy a fájl a 14 üzenet után leáll a find parancs feldolgozásával (Mikrotik korlátozások). Ezért a jövőben átdolgozom a szkriptet lua-ra, köszönöm. 7Stuntman7 a segítségért, nem tudtam a lua-ról.

UPD 08.12.2016

a Telegramban láthatóan kissé megváltozott a getUpdate "kiadás". Most a fő szkriptben javítani kell az üzenet eltolását 2-ről 1-re.

változások

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

cserélje le erre:

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

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster