Ekstern aktivering av Mikrotik-skript fra Telegram

Alexander Koryukin presset meg til denne implementeringen GeXoGeN med utgivelsen hansEkstern slå på datamaskinen gratis, uten SMS og uten skyer, ved hjelp av Mikrotik".

Og en kommentar i en av VK-gruppene av Kirill Kazakov:

Ja, det er ikke sikkert i det hele tatt. Jeg vil heller skrive en telegram-bot som bare godtar aktiveringskommandoer fra kontoen min.

Jeg bestemte meg for å skrive en slik bot.

Så det første du må gjøre er å lage en bot i telegram.

  • Vi finner i søket en konto som heter @botfather
  • Klikk på Start-knappen nederst på skjermen
  • Så skriver vi ham kommandoen / newbot

Da svarer vi på 2 enkle spørsmål:

  • Det første spørsmålet er navnet på roboten som skal opprettes. MyMikrotikROuter
  • Det andre spørsmålet er kallenavnet til boten som opprettes (skal slutte med bot) MikrotikROuter_bot

Som svar vil vi motta tokenet til boten vår, i mitt tilfelle er det:

Bruk dette tokenet for å få tilgang til HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Ekstern aktivering av Mikrotik-skript fra Telegram
Deretter må du finne vår bot i søket etter navn @MikrotikROuter_bot og trykk på Start-knappen.

Etter det må du åpne nettleseren og skrive inn følgende linje:

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

Hvor XXXXXXXXXXXXXXXXXX er botens token.

En side som ligner på følgende åpnes:

Ekstern aktivering av Mikrotik-skript fra Telegram

Vi finner følgende tekst på den:

"chat":{"id":631290,

Så vi har all nødvendig informasjon for å skrive skript for Mikrotik, nemlig:

Bot-token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat-ID hvor han skal skrive: 631290

For å sjekke, kan vi gå gjennom nettleseren:

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

Bør få resultatet:

Ekstern aktivering av Mikrotik-skript fra Telegram

For enkelhets skyld vil vi umiddelbart legge til kommandoer for boten:

Finne en konto med et navn @botfar
Så skriver vi ham en kommando / setcommands

  • Han vil spørre hvilken bot

Vi skriver:
@MikrotikROuter_bot

Legg til kommandoer:

  • helloworld< — Testmelding på chat 1
  • itsworking-Testmelding på chat 2
  • wolmypc-vekke opp PC-en min

Nå hvis du skriver "/" i chatten, bør du få:

Ekstern aktivering av Mikrotik-skript fra Telegram

La oss nå gå videre til MikroTik.

RouterOS har et konsollverktøy for å kopiere filer via ftp eller http / https, verktøyet heter fetch, som er det vi skal bruke.

åpne terminal og skriv inn:

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

Vær oppmerksom på at MikroTik trenger "» for å unnslippe skiltet «?' i URL-en.

Bør få resultatet:

Ekstern aktivering av Mikrotik-skript fra Telegram

La oss nå gå videre til skript:

Hei Verden

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}

det virker

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"

Ikke glem å spesifisere riktig mac- og grensesnittnavn, samt bot-token og chat_id.

Nå skal jeg forklare litt hva de gjør:

"helloworld"-skriptet sender en melding: "Hello, world!" til vår chat med boten.
"itsworking"-skriptet sender en melding: "Test OK, it's Working!" til vår chat med boten.
Disse skriptene er for demonstrasjonsformål.
Jeg la til "wolmypc"-skriptet som en av de mulige implementeringene.
Ved utførelse av skriptet vil boten skrive "wol OK" til chatten.
Faktisk kan du kjøre absolutt hvilket som helst skript.

Lag en oppgave:

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

Lesbar visningdet er ikke klart hvorfor, men fra arbeidsskriptet avslører det ikke globale data, la skriptet til når systemet starter opp.
Telegram oppstart

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

Hvordan fungerer det

Last ned «getUpdates»-meldingene våre hvert 30. sekund, og analyser deretter for å finne ut update_id (meldingsnummer) og tekst (våre lag) og chat_id . Som standard viser getUpdates fra 1 til 100 meldinger, for enkelhets skyld sletter vi meldingen etter å ha lest kommandoen. Telegram api sier at for å lese en melding trenger du meldingsnummeret + 1

/getUpdates?offset=update_id + 1

Alle testet på Mikrotik rb915 RouterOS 6.37.1
Hvis du sender mange kommandoer på en gang, vil de alle bli utført etter tur med et intervall på 30 sekunder.

PS Tusen takk til Kirill Kazakov for ideen og min venn Alexander for hjelp med manus.

referanser

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

oppdatering:

03:11:16

Forbedrede skript:

La til sjekk for chat_id
Hvis noen skriver til roboten vår, vil han svare ham: "Jeg kan ikke snakke med deg. ", vil på samme måte svare oss hvis den ikke gjenkjenner kommandoen.
Etter å ha utført kommandoen, avslutter boten abonnementet på chatten (se wolmypc-skriptet)

UPD

Funnet med 7 Stuntmann7 at en fil med over ~14 meldinger ikke lenger behandles av find-kommandoen (Mikrotik-begrensninger). Derfor vil jeg i fremtiden endre manuset til lua, takk 7 Stuntmann7 for dette visste jeg ikke om lua.

OPP 08.12.2016

i Telegram, tilsynelatende, endret de litt "eksosen" til getUpdate. nå i hovedskriptet må du korrigere meldingsforskyvningen fra 2 til 1

endringer

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

заменить на :

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

Kilde: www.habr.com