Mikrotiku skriptide kaugaktiveerimine Telegramist

Aleksander Koryukin sundis mind selle teostuse juurde GeXoGeN tema väljaandegaArvuti kauglülitamine tasuta, ilma SMS-ita ja ilma pilveta, kasutades Mikrotikut"

Ja Kirill Kazakovi kommentaar ühes VK grupis:

Jah, see pole üldse turvaline. Ma pigem kirjutaksin telegrammi roboti, mis võtab vastu ainult minu kontolt pärinevaid aktiveerimiskäske.

Otsustasin kirjutada sellise roboti.

Niisiis, esimene asi, mida teha, on luua telegrammis bot.

  • Otsingust leiame konto nimega @botfather
  • Klõpsake ekraani allosas nuppu Start
  • Seejärel kirjutame talle käsu / newbot

Seejärel vastame kahele lihtsale küsimusele:

  • Esimene küsimus on loodava roboti nimi. MyMikrotikROuter
  • Teine küsimus on loodava roboti hüüdnimi (peaks lõppema botiga) MikrotikROuter_bot

Vastuseks saame oma roboti märgi, minu puhul on see:

Kasutage seda luba HTTP API-le juurdepääsuks: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Mikrotiku skriptide kaugaktiveerimine Telegramist
Seejärel peate leidma nime järgi otsingust meie roboti @MikrotikROuter_bot ja vajutage nuppu Start.

Pärast seda peate avama brauseri ja sisestama järgmise rea:

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

Kus XXXXXXXXXXXXXXXXXXXXX on teie roboti tunnus.

Avaneb järgmisega sarnane leht:

Mikrotiku skriptide kaugaktiveerimine Telegramist

Leiame sellelt järgmise teksti:

"chat":{"id":631290,

Niisiis, meil on kogu vajalik teave Mikrotiku skriptide kirjutamiseks, nimelt:

Boti tunnus: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Vestluse ID, kuhu ta peaks kirjutama: 631290

Kontrollimiseks saame brauserist läbi minna:

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

Tulemus peaks saama:

Mikrotiku skriptide kaugaktiveerimine Telegramist

Mugavuse huvides lisame boti jaoks kohe käsud:

Nimega konto leidmine @botisa
Siis kirjutame talle käsu / setcommands

  • Ta küsib, milline robot

Me kirjutame:
@MikrotikROuter_bot

Lisa käske:

  • helloworld< — testsõnum vestluses 1
  • itsworking-Test sõnum vestluses 2
  • wolmypc-ärata mu arvuti

Nüüd, kui sisestate vestlusesse "/", peaksite saama:

Mikrotiku skriptide kaugaktiveerimine Telegramist

Liigume nüüd MikroTiku juurde.

RouterOS-il on konsooliutiliit failide kopeerimiseks ftp või http / https kaudu, utiliiti nimetatakse tõmbamiseks, mida me kasutame.

Avatud terminal ja sisestage:

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

Pange tähele, et MikroTik vajab "» märgi eest põgeneda «?' URL-is.

Tulemus peaks saama:

Mikrotiku skriptide kaugaktiveerimine Telegramist

Liigume nüüd skriptide juurde:

Tere, Maailm

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}

see töötab

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"

Ärge unustage määrata õiget Maci ja liidese nime, samuti bot-tokenit ja chat_id.

Nüüd selgitan veidi, mida nad teevad:

"Helloworldi" skript saadab sõnumi: "Tere, maailm!" meie vestlusesse robotiga.
Skript "itsworking" saadab teate: "Test OK, it's Working!" meie vestlusesse robotiga.
Need skriptid on mõeldud tutvustamiseks.
Lisasin ühe võimaliku teostusena skripti "wolmypc".
Skripti täitmisel kirjutab bot vestlusesse "wol OK".
Tegelikult saate käivitada absoluutselt mis tahes skripti.

Loo ülesanne:

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

Loetav vaadepole selge, miks, kuid töötavast skriptist see globaalseid andmeid ei avalda, lisas skripti süsteemi käivitumisel.
Telegrami käivitamine

: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") ;

Telegramm

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

Kuidas see töötab

Laadige iga 30 sekundi järel alla meie "getUpdatesi" sõnumid, seejärel sõeluge, et teada saada update_id (sõnumi number) ja tekst (meie meeskonnad) ja vestluse_id . Vaikimisi kuvab getUpdates 1 kuni 100 sõnumit, mugavuse huvides kustutame sõnumi pärast käsu lugemist. Telegrami api ütleb, et sõnumi lugemiseks on vaja sõnumi numbrit + 1

/getUpdates?offset=update_id + 1

Kõik testitud Mikrotik rb915 RouterOS 6.37.1 peal
Kui saadate korraga palju käske, täidetakse need kõik kordamööda 30-sekundilise intervalliga.

PS Suur tänu Kirill Kazakovile idee eest ja sõbrale Aleksandrile abi eest stsenaariumi tegemisel.

Viited

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

upd:

03:11:16

Täiustatud skriptid:

Lisatud chat_id kontroll
Lolli kontrollimisel, kui keegi meie robotile kirjutab, vastab ta talle: "Ma ei saa sinuga rääkida. “, vastab meile samamoodi, kui ta käsku ära ei tunne.
Pärast käsu täitmist katkestab bot vestluse tellimuse (vt wolmypc skripti)

DUP

Leitud koos 7 Kaskadöör7 et rohkem kui 14 sõnumiga faili ei töödelda enam otsingukäsuga (Mikrotiku piirangud). Seetõttu muudan tulevikus skripti lua vastu, aitäh 7 Kaskadöör7 selle jaoks ma lua kohta ei teadnud.

UPD 08.12.2016

Telegramis muutsid nad ilmselt veidi getUpdate'i "ammendumist". nüüd peate põhiskriptis parandama sõnumi nihke 2-lt 1-le

muutused

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

заменить на :

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

Allikas: www.habr.com