FjÀrraktivering av Mikrotik-skript frÄn Telegram

Denna implementering inspirerades av Alexander Koryukin GeXoGeN med sin publikation "FjÀrraktivering av datorer gratis, utan SMS och utan molntjÀnster, med hjÀlp av Mikrotik«.

Och kommentaren i en av VK-grupperna av Kirill Kazakov:

Ja, verkligen inte sÀkert. Jag skulle hellre skriva en Telegram-bot som tar emot kommandon frÄn mitt konto för att starta.

Jag bestÀmde mig för att skriva en sÄdan bot.

SÄ det första vi mÄste göra Àr att skapa en bot i Telegram.

  • Sök efter kontot med namnet @botfather
  • Tryck pĂ„ knappen Start lĂ€ngst ner pĂ„ skĂ€rmen
  • Efter det skriver vi kommandot /newbot

Vi svarar sedan pÄ 2 enkla frÄgor:

  • Den första frĂ„gan Ă€r namnet pĂ„ den bot vi ska skapa MyMikrotikROuter
  • Den andra frĂ„gan Ă€r anvĂ€ndarnamnet för den bot som ska skapas (mĂ„ste sluta med bot) MikrotikROuter_bot

Som svar fÄr vi token för vÄr bot, i mitt fall Àr det:

AnvÀnd detta token för att fÄ tillgÄng till HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

FjÀrraktivering av Mikrotik-skript frÄn Telegram
Sedan behöver vi hitta vÄr bot i sökningen efter namnet @MikrotikROuter_botoch tryck pÄ knappen Start.

DÀrefter öppnar vi webblÀsaren och skriver in följande rad:

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

DÀr XXXXXXXXXXXXXXXXXX Àr token för din bot.

En sida som ser ungefÀr ut enligt följande öppnas:

FjÀrraktivering av Mikrotik-skript frÄn Telegram

Sök pÄ den efter följande text:

"chat":{"id":631290,

SÄ vi har all nödvÀndig information för att skriva skripten för Mikrotik, nÀmligen:

Bot-token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat-ID som den ska skriva till: 631290

För att kontrollera kan vi gÄ in via webblÀsaren:

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

Bör vi fÄ resultat:

FjÀrraktivering av Mikrotik-skript frÄn Telegram

För vÄr bekvÀmhet lÀgger vi direkt till kommandon för boten:

Sök efter kontot med namnet @botfather
Efter det skriver vi honom kommandot /setcommands

  • Han kommer att frĂ„ga vilken bot

Skriv:
@MikrotikROuter_bot

LĂ€gg till kommandon:

  • helloworld< — Testmeddelande i chatt 1
  • itsworking — Testmeddelande i chatt 2
  • wolmypc — vĂ€ck min PC

Nu, om vi skriver "\/" i chatten, bör vi fÄ:

FjÀrraktivering av Mikrotik-skript frÄn Telegram

Nu gÄr vi vidare till MikroTik.

I RouterOS finns det ett kommandoradsverktyg för att kopiera filer via ftp eller http/https, verktyget heter fetch, och det Àr det vi kommer att anvÀnda.

Öppna terminalen och skriv in:

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

Observera att i MikroTik krÀvs "" för att skÀrma av tecknet "?" i URL:en.

Bör vi fÄ resultat:

FjÀrraktivering av Mikrotik-skript frÄn Telegram

Nu gÄr vi vidare till skripten:

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

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-result=no"

Kom ihÄg att ange rÀtt mac och namn pÄ grÀnssnittet, samt bot-token och chat_id.

Nu ska jag förklara vad de gör:

Scriptet "helloworld" skickar ett meddelande: "Hello, world!" till vÄr chatt med botten.
Scriptet "itsworking" skickar ett meddelande: "Test OK, it’s Working!" till vĂ„r chatt med botten.
Dessa skript Àr för att demonstrera funktionaliteten.
Scriptet "wolmypc" har jag lagt till som en av möjliga implementationer.
NÀr skriptet körs kommer botten att skriva i chatten "wol OK."
I princip kan man köra vilken skript som helst.

Vi skapar en uppgift:

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Àsligt lÀgeDet Àr oklart varför, men det fungerande skriptet Äterger inte globala data, jag la till skriptet vid systemstart.
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=Jag kan inte prata med dig.") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no; 
} 

Hur det fungerar

Vi laddar ner vÄra meddelanden "getUpdates" var 30:e sekund, och parserar sedan för att ta reda pÄ update_id (meddelande nummer) och text (vÄra kommandon) och chat_id . Som standard ger getUpdates 1 till 100 meddelanden, för bekvÀmlighet tar vi bort meddelandet efter att vi har lÀst kommandot. I Telegram API stÄr det att för att lÀsa ett meddelande behöver man meddelande nummer + 1

/getUpdates?offset=update_id + 1

Allt Àr testat pÄ Mikrotik rb915 RouterOS 6.37.1
Om man skickar mÄnga kommandon pÄ en gÄng, kommer de att utföras en och en med ett intervall pÄ 30 sekunder.

P.S. Stort tack till Kirill Kazakov för idén och min vÀn Alexander för hjÀlpen med skripten.

LĂ€nkar

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

Jag har förbÀttrat skripten:

Jag har lagt till en kontroll för chat_id
En sÀkerhetskontroll sÄ att om nÄgon skriver till vÄr bot svarar den: » Jag kan inte prata med dig. «, och den kommer att svara oss pÄ samma sÀtt om den inte kÀnner igen kommandot.
NĂ€r kommandot har exekverats, informerar botten i chatten (se skriptet wolmypc)

UPD

Vi hittade med 7Stuntman7 att filen med mer Àn ~ 14 meddelanden slutar bearbetas av kommandot find (begrÀnsningar i Mikrotik). DÀrför kommer jag i framtiden att omarbeta skriptet till lua, tack 7Stuntman7 för detta, jag visste inte om lua.

UPD 08.12.2016

i Telegram har de tydligen lite förĂ€ndrat ‘utdata’ frĂ„n getUpdate. Nu i huvudskriptet behöver man justera meddelandets förskjutning frĂ„n 2 till 1

för

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

byta till:

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

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster