Fjernaktivering af Mikrotik-scripts fra Telegram

Alexander Koryukin skubbede mig til denne implementering GeXoGeN med sin udgivelseFjerntænding for computeren gratis, uden SMS og uden skyer, ved hjælp af Mikrotik".

Og en kommentar i en af ​​VK-grupperne af Kirill Kazakov:

Ja, det er slet ikke sikkert. Jeg vil hellere skrive en telegram-bot, der kun accepterer aktiveringskommandoer fra min konto.

Jeg besluttede at skrive sådan en bot.

Så den første ting at gøre er at oprette en bot i telegram.

  • Vi finder i søgningen en konto ved navn @botfather
  • Klik på Start-knappen nederst på skærmen
  • Så skriver vi ham kommandoen / newbot

Så svarer vi på 2 simple spørgsmål:

  • Det første spørgsmål er navnet på den bot, der skal oprettes. MyMikrotikROuter
  • Det andet spørgsmål er kaldenavnet på den bot, der oprettes (skal ende med bot) MikrotikROuter_bot

Som svar vil vi modtage tokenet fra vores bot, i mit tilfælde er det:

Brug dette token til at få adgang til HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Fjernaktivering af Mikrotik-scripts fra Telegram
Derefter skal du finde vores bot i søgningen efter navn @MikrotikROuter_bot og tryk på Start-knappen.

Derefter skal du åbne browseren og indtaste følgende linje:

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

Hvor XXXXXXXXXXXXXXXXXX er din bots token.

En side, der ligner følgende, åbnes:

Fjernaktivering af Mikrotik-scripts fra Telegram

Vi finder følgende tekst på den:

"chat":{"id":631290,

Så vi har alle de nødvendige oplysninger til at skrive scripts til Mikrotik, nemlig:

Bot token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat-id, hvor han skal skrive: 631290

For at tjekke, kan vi gå gennem browseren:

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

Skal få resultatet:

Fjernaktivering af Mikrotik-scripts fra Telegram

For nemheds skyld tilføjer vi straks kommandoer til botten:

At finde en konto med et navn @botfar
Så skriver vi ham en kommando / sætkommandoer

  • Han vil spørge hvilken bot

Vi skriver:
@MikrotikROuter_bot

Tilføj kommandoer:

  • helloworld< — Testbesked på chat 1
  • itsworking-Test besked på chat 2
  • wolmypc-væk min pc

Hvis du nu skriver "/" i chatten, skulle du få:

Fjernaktivering af Mikrotik-scripts fra Telegram

Lad os nu gå videre til MikroTik.

RouterOS har et konsolværktøj til at kopiere filer via ftp eller http / https, værktøjet hedder fetch, hvilket er det vi vil bruge.

åbne terminal og indtast:

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

Bemærk venligst, at MikroTik har brug for "» for at undslippe skiltet «?' i URL'en.

Skal få resultatet:

Fjernaktivering af Mikrotik-scripts fra Telegram

Lad os nu gå videre til scripts:

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

Glem ikke at angive det korrekte mac- og grænsefladenavn, samt bot-token og chat_id.

Nu vil jeg forklare lidt, hvad de gør:

"helloworld"-scriptet sender en besked: "Hej, verden!" til vores chat med botten.
"itsworking" scriptet sender en besked: "Test OK, it's Working!" til vores chat med botten.
Disse scripts er til demonstrationsformål.
Jeg tilføjede "wolmypc" scriptet som en af ​​de mulige implementeringer.
Efter udførelse af scriptet vil botten skrive "wol OK" til chatten.
Faktisk kan du køre absolut ethvert script.

Opret en opgave:

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

Læsbar visningdet er ikke klart hvorfor, men fra arbejdsscriptet afslører det ikke globale data, tilføjede scriptet når systemet starter.
Telegram opstart

: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 denne her

Download vores "getUpdates"-meddelelser hvert 30. sekund, og parse derefter for at finde ud af det update_id (meddelelsesnummer) og tekst (vores hold) og chat_id . Som standard viser getUpdates fra 1 til 100 meddelelser, for nemheds skyld sletter vi meddelelsen efter at have læst kommandoen. Telegram api siger, at for at læse en besked skal du have beskednummeret + 1

/getUpdates?offset=update_id + 1

Alle testet på Mikrotik rb915 RouterOS 6.37.1
Hvis du sender mange kommandoer på én gang, vil de alle blive udført efter tur med et interval på 30 sekunder.

PS Mange tak til Kirill Kazakov for ideen og min ven Alexander for hjælpen med manuskripterne.

RЎSЃS <P "RєRё

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

Forbedrede scripts:

Tilføjet check for chat_id
Hvis nogen skriver til vores bot, vil han svare ham: "Jeg kan ikke tale med dig. “, vil på samme måde svare os, hvis den ikke genkender kommandoen.
Efter at have udført kommandoen, afmelder botten chatten (se wolmypc script)

DUP

Fundet med 7 Stuntmand7 at en fil med over ~14 beskeder ikke længere behandles af find-kommandoen (Mikrotik-begrænsninger). Derfor vil jeg i fremtiden ændre scriptet til lua, tak 7 Stuntmand7 for dette vidste jeg ikke om lua.

UPD 08.12.2016/XNUMX/XNUMX

i Telegram ændrede de tilsyneladende lidt "udstødningen" af getUpdate. nu i hovedscriptet skal du rette beskedforskydningen fra 2 til 1

ændringer

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

заменить на :

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

Kilde: www.habr.com