Oddaljena aktivacija Mikrotik skript iz Telegrama

Alexander Koryukin me je spodbudil k tej izvedbi GeXoGeN s svojo objavoBrezplačen vklop računalnika na daljavo, brez SMS-ov in brez oblakov, z uporabo Mikrotika".

In komentar v eni od skupin VK Kirill Kazakov:

Ja, sploh ni varno. Raje bi napisal telegram bota, ki sprejema samo aktivacijske ukaze iz mojega računa.

Odločil sem se napisati takega bota.

Torej, prva stvar, ki jo morate storiti, je ustvariti bota v telegramu.

  • V iskanju najdemo račun z imenom @botfather
  • Kliknite gumb Start na dnu zaslona
  • Nato mu napišemo ukaz / newbot

Nato odgovorimo na 2 preprosti vprašanji:

  • Prvo vprašanje je ime bota, ki ga želite ustvariti. MyMikrotikROuter
  • Drugo vprašanje je vzdevek bota, ki se ustvarja (končati se mora z bot) MikrotikROuter_bot

Kot odgovor bomo prejeli žeton našega bota, v mojem primeru je to:

Za dostop do HTTP API uporabite ta žeton: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Oddaljena aktivacija Mikrotik skript iz Telegrama
Nato morate najti našega bota v iskanju po imenu @MikrotikROuter_bot in pritisnite gumb Start.

Po tem morate odpreti brskalnik in vnesti naslednjo vrstico:

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

Kjer je XXXXXXXXXXXXXXXXXX žeton vašega bota.

Odprla se bo podobna stran:

Oddaljena aktivacija Mikrotik skript iz Telegrama

Na njej najdemo naslednje besedilo:

"klepet":{"id":631290,

Imamo torej vse potrebne informacije za pisanje skript za Mikrotik, in sicer:

Botov žeton: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID klepeta, kamor naj napiše: 631290

Za preverjanje lahko gremo skozi brskalnik:

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

Moral bi dobiti rezultat:

Oddaljena aktivacija Mikrotik skript iz Telegrama

Za naše udobje bomo takoj dodali ukaze za bota:

Iskanje računa z imenom @botfather
Nato mu napišemo ukaz / setcommands

  • Vprašal bo, kateri bot

Pišemo:
@MikrotikROuter_bot

Dodajte ukaze:

  • helloworld< — Preskusno sporočilo v klepetu 1
  • njegovo delovanje-testno sporočilo na klepetu 2
  • wolmypc-zbudi moj računalnik

Zdaj, če v klepet vnesete "/", bi morali dobiti:

Oddaljena aktivacija Mikrotik skript iz Telegrama

Zdaj pa preidimo na MikroTik.

RouterOS ima konzolni pripomoček za kopiranje datotek prek ftp ali http / https, pripomoček se imenuje fetch, kar bomo uporabili.

Odpri terminal in vnesite:

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

Upoštevajte, da MikroTik potrebuje "» ubežati znaku «?' v URL-ju.

Moral bi dobiti rezultat:

Oddaljena aktivacija Mikrotik skript iz Telegrama

Zdaj pa preidimo na skripte:

Pozdravljen, svet

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}

deluje

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"

Ne pozabite navesti pravilnega imena mac in vmesnika ter žetona bota in chat_id.

Zdaj bom malo razložil, kaj počnejo:

Skript "helloworld" pošlje sporočilo: "Hello, world!" na naš klepet z botom.
Skript "itsworking" pošlje sporočilo: "Test OK, it's Working!" na naš klepet z botom.
Ti skripti so v predstavitvene namene.
Kot eno izmed možnih implementacij sem dodal skript "wolmypc".
Po izvedbi skripta bo bot v klepet napisal »wol OK«.
Pravzaprav lahko zaženete popolnoma kateri koli skript.

Ustvari nalogo:

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

Berljiv pogledni jasno zakaj, vendar iz delovnega skripta ne razkrije globalnih podatkov, skript je dodan ob zagonu sistema.
Zagon Telegrama

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

Kako to deluje

Prenesite naša sporočila »getUpdates« vsakih 30 sekund, nato jih razčlenite, da ugotovite update_id (številka sporočila) in besedilo (naše ekipe) in chat_id . GetUpdates privzeto prikaže od 1 do 100 sporočil, zaradi udobja po branju ukaza izbrišemo sporočilo. Telegram api pravi, da za branje sporočila potrebujete številko sporočila + 1

/getUpdates?offset=update_id + 1

Vse testirano na Mikrotik rb915 RouterOS 6.37.1
Če pošljete več ukazov hkrati, bodo vsi izvedeni po vrsti v intervalu 30 sekund.

PS Najlepša hvala Kirilu Kazakovu za idejo in mojemu prijatelju Aleksandru za pomoč pri scenarijih.

reference

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

posodobitev:

03:11:16

Izboljšani skripti:

Dodano preverjanje za chat_id
Preverjanje za bedaka, če nekdo piše našemu botu, mu bo odgovoril: "Ne morem govoriti s tabo. “, nam bo podobno odgovoril, če ukaza ne prepozna.
Po izvedbi ukaza se bot odjavi od klepeta (glejte skript wolmypc)

DUP

Najdeno z 7Kaskader7 da datoteka z več kot ~14 sporočili ni več obdelana z ukazom find (omejitve Mikrotika). Zato bom v prihodnosti spremenil skript v lua, hvala 7Kaskader7 za to pa nisem vedel za luo.

UPD 08.12.2016/XNUMX/XNUMX

v Telegramu so očitno nekoliko spremenili "izpuh" getUpdate. zdaj morate v glavnem skriptu popraviti odmik sporočila z 2 na 1

Spremembe

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

заменить на :

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

Vir: www.habr.com