Activering op afstand van Mikrotik-scripts van Telegram

Alexander Koryukin duwde me naar deze implementatie GeXoGeN met zijn publicatieOp afstand de computer gratis aanzetten, zonder sms en zonder clouds, met behulp van Mikrotik".

En een opmerking in een van de VK-groepen door Kirill Kazakov:

Ja, het is helemaal niet veilig. Ik schrijf liever een telegrambot die alleen activeringsopdrachten van mijn account accepteert.

Ik besloot zo'n bot te schrijven.

Het eerste dat u dus moet doen, is een bot in telegram maken.

  • We vinden bij het zoeken een account met de naam @botfather
  • Klik op de Start-knop onderaan het scherm
  • Dan schrijven we hem het commando / newbot

Dan beantwoorden we 2 simpele vragen:

  • De eerste vraag is de naam van de aan te maken bot. MijnMikrotikRouter
  • De tweede vraag is de bijnaam van de bot die wordt gemaakt (zou moeten eindigen op bot) MikrotikROuter_bot

Als reactie ontvangen we het token van onze bot, in mijn geval is dat:

Gebruik dit token om toegang te krijgen tot de HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Activering op afstand van Mikrotik-scripts van Telegram
Vervolgens moet u onze bot vinden door op naam te zoeken @MikrotikROuter_bot en druk op de Start-toets.

Daarna moet u de browser openen en de volgende regel invoeren:

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

Waarbij XXXXXXXXXXXXXXXXXX het token van uw bot is.

Er wordt een pagina geopend die lijkt op de volgende:

Activering op afstand van Mikrotik-scripts van Telegram

We vinden er de volgende tekst op:

"chatten":{"id":631290,

We hebben dus alle benodigde informatie voor het schrijven van scripts voor Mikrotik, namelijk:

Bot-token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat-ID waar hij moet schrijven: 631290

Om dit te controleren, kunnen we via de browser gaan:

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

Zou het resultaat moeten krijgen:

Activering op afstand van Mikrotik-scripts van Telegram

Voor ons gemak zullen we meteen commando's voor de bot toevoegen:

Een account zoeken met een naam @botvader
Dan schrijven we hem een ​​bevel / setcommands

  • Hij zal vragen welke bot

We schrijven:
@MikrotikROuter_bot

Commando's toevoegen:

  • helloworld< — Testbericht op chat 1
  • itsworking-testbericht op chat 2
  • wolmypc-maak mijn pc wakker

Als je nu "/" typt in de chat, zou je het volgende moeten krijgen:

Activering op afstand van Mikrotik-scripts van Telegram

Laten we nu verder gaan met MikroTik.

RouterOS heeft een console-hulpprogramma voor het kopiëren van bestanden via ftp of http / https, het hulpprogramma heet fetch, dat is wat we zullen gebruiken.

Open terminal en voer in:

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

Houd er rekening mee dat MikroTik "» om aan het bord te ontsnappen «?' in de url.

Zou het resultaat moeten krijgen:

Activering op afstand van Mikrotik-scripts van Telegram

Laten we nu verder gaan met scripts:

Hallo Wereld

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}

het werkt

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"

Vergeet niet de juiste mac- en interfacenaam op te geven, evenals bot-token en chat_id.

Nu zal ik een beetje uitleggen wat ze doen:

Het "helloworld"-script stuurt een bericht: "Hello, world!" naar onze chat met de bot.
Het "itsworking"-script stuurt een bericht: "Test OK, het werkt!" naar onze chat met de bot.
Deze scripts zijn voor demonstratiedoeleinden.
Ik heb het "wolmypc"-script toegevoegd als een van de mogelijke implementaties.
Na uitvoering van het script zal de bot "wol OK" naar de chat schrijven.
In feite kunt u absoluut elk script uitvoeren.

Maak een taak:

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

Leesbare weergavehet is niet duidelijk waarom, maar uit het werkende script maakt het geen globale gegevens bekend, het script is toegevoegd wanneer het systeem opstart.
Telegram opstarten

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

Hoe werkt dit

Download onze "getUpdates"-berichten elke 30 seconden en ontleed ze vervolgens om erachter te komen update_id (berichtnummer) en tekst (onze teams) en chat_id . GetUpdates geeft standaard 1 tot 100 berichten weer, voor het gemak verwijderen we het bericht na het lezen van de opdracht. Telegram api zegt dat je voor het lezen van een bericht het berichtnummer + 1 nodig hebt

/getUpdates?offset=update_id + 1

Allemaal getest op Mikrotik rb915 RouterOS 6.37.1
Als u veel opdrachten tegelijk verzendt, worden ze allemaal om de beurt uitgevoerd met een interval van 30 seconden.

PS Veel dank aan Kirill Kazakov voor het idee en mijn vriend Alexander voor hulp bij de scripts.

referenties

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

omhoog:

03:11:16

Verbeterde scripts:

Controle voor chat_id toegevoegd
Voor een dwaas controleren, als iemand naar onze bot schrijft, zal hij hem antwoorden: "Ik kan niet met je praten. “, zal ons op dezelfde manier antwoorden als het de opdracht niet herkent.
Na het uitvoeren van de opdracht meldt de bot zich af voor de chat (zie wolmypc-script)

UPD

Gevonden met 7Stuntman7 dat een bestand met meer dan ~14 berichten niet langer wordt verwerkt door de opdracht find (Mikrotik-beperkingen). Daarom zal ik in de toekomst het script veranderen in lua, bedankt 7Stuntman7 hiervoor wist ik niets van lua.

UPD 08.12.2016/XNUMX/XNUMX

in Telegram hebben ze blijkbaar de "uitlaat" van getUpdate enigszins gewijzigd. nu moet je in het hoofdscript de berichtoffset corrigeren van 2 naar 1

veranderingen

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

заменить на :

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

Bron: www.habr.com