Attivazione remota di script Mikrotik da Telegram

Alexander Koryukin m'hà spintu à sta implementazione GeXoGeN cù a so publicazioneRemote accende l'urdinatore gratuitamente, senza SMS è senza nuvole, usendu Mikrotik".

È un cumentu in unu di i gruppi VK da Kirill Kazakov:

Iè, ùn hè micca sicuru in tuttu. Preferite scrive un bot di telegramma chì accetta solu cumandamenti di attivazione da u mo contu.

Aghju decisu di scrive un tali bot.

Allora, a prima cosa da fà hè di creà un bot in telegram.

  • Truvemu in a ricerca un contu chjamatu @botfather
  • Cliccate nant'à u buttone Start à u fondu di u screnu
  • Allora scrivemu u cumandamentu / newbot

Allora rispondemu à 2 dumande simplici:

  • A prima quistione hè u nome di u bot da esse creatu. MyMikrotikROuter
  • A seconda quistione hè u soprannomu di u bot chì hè creatu (duverebbe finisce cù bot) MikrotikROuter_bot

In risposta, riceveremu u token di u nostru bot, in u mo casu hè:

Aduprate stu token per accede à l'API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Attivazione remota di script Mikrotik da Telegram
Allora, avete bisognu di truvà u nostru bot in a ricerca per nome @MikrotikROuter_bot è appughjà u buttone Start.

Dopu quì, avete bisognu di apre u navigatore è entre in a seguente linea:

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

Induve XXXXXXXXXXXXXXXXXX hè u token di u vostru bot.

Una pagina simile à a seguente si apre:

Attivazione remota di script Mikrotik da Telegram

Truvemu u seguente testu nantu à questu:

"chat":{"id":631290,

Dunque, avemu tutte l'infurmazioni necessarii per scrive script per Mikrotik, vale à dì:

Token di bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID di chat induve deve scrive: 631290

Per verificà, pudemu passà per u navigatore:

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

Duverebbe ottene u risultatu:

Attivazione remota di script Mikrotik da Telegram

Per a nostra comodità, aghjunghje immediatamente cumandamenti per u bot:

Truvà un contu cù un nome @botfather
Allora scrivemu un cumandamentu / setcommands

  • Ellu dumandarà quale bot

Scrivemu:
@MikrotikROuter_bot

Aggiungi cumandamenti:

  • helloworld< — Teste u messagiu nantu à u chat 1
  • itsworking-Test Message in chat 2
  • wolmypc-svegliate u mo PC

Avà se scrive "/" in u chat, duvete ottene:

Attivazione remota di script Mikrotik da Telegram

Avà andemu à MikroTik.

RouterOS hà una utilità di cunsola per cupià i fugliali via ftp o http / https, l'utilità hè chjamata fetch, chì hè ciò chì useremu.

Apertu terminal è entre:

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

Per piacè nutate chì MikroTik hà bisognu "» per scappà u segnu «?' in l'URL.

Duverebbe ottene u risultatu:

Attivazione remota di script Mikrotik da Telegram

Avà andemu à i scripts:

ciao mondu

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}

u so travagliu

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"

Ùn vi scurdate di specificà u mac currettu è u nome di l'interfaccia, è ancu bot-token è chat_id.

Avà spiegheraghju un pocu ciò chì facenu:

U script "helloworld" manda un missaghju: "Hello, world!" à a nostra chat cù u bot.
U script "itsworking" manda un missaghju: "Test OK, it's Working!" à a nostra chat cù u bot.
Questi script sò per scopi di dimostrazione.
Aghju aghjustatu u script "wolmypc" cum'è una di e pussibuli implementazioni.
Dopu l'esecuzione di u script, u ​​bot scriverà "wol OK" à u chat.
In fatti, pudete eseguisce assolutamente qualsiasi script.

Crea un compitu:

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

Vista leggibileùn hè micca chjaru perchè, ma da u script di travagliu ùn divulga micca e dati glubale, aghjunghjenu u script quandu u sistema boots.
Startup di Telegram

: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") ;

n'ambasciata

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

Cumu serà ch'ella ùn stu travagliu

Scaricate i nostri missaghji "getUpdates" ogni 30 seconde, dopu analizà per sapè update_id (numeru di missaghju) è u testu (i nostri squadre) è chat_id . Per automaticamente, getUpdates mostra da 1 à 100 missaghji, per comodità, dopu avè lettu u cumandamentu, sguassate u messagiu. L'api di Telegram dice chì per leghje un missaghju avete bisognu di u numeru di messagiu + 1

/getUpdates?offset=update_id + 1

Tutti pruvati nantu à Mikrotik rb915 RouterOS 6.37.1
Se mandate parechji cumandamenti à una volta, tutti seranu eseguiti in turnu cù un intervalu di 30 seconde.

PS Molte grazie à Kirill Kazakov per l'idea è u mo amicu Alexander per aiutu cù i scripts.

referenze

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

aghjurnatu:

03:11:16

Scripts migliorati:

Cuntrolla aghjuntu per chat_id
Cuntrolla per un stupidu, se qualchissia scrive à u nostru bot, li risponderà: "Ùn possu micca parlà cun voi. ", ci risponderà in modu simile s'ellu ùn ricunnosce micca u cumandamentu.
Dopu avè eseguitu u cumandimu, u bot si disabbona à u chat (vede u script wolmypc)

DUP

Trovatu cun 7 Stuntman 7 chì un schedariu cù sopra ~ 14 missaghji ùn hè più trattatu da u cumandamentu di truvà (limitazioni Mikrotik). Dunque, in u futuru, cambiaraghju u script in lua, grazie 7 Stuntman 7 per questu, ùn sapia micca di lua.

UPD 08.12.2016/XNUMX/XNUMX

in Telegram, apparentemente, anu cambiatu un pocu u "exhaust" di getUpdate. Avà in u script principale avete bisognu di correggerà u missaghju offset da 2 à 1

cambià

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

заменить на :

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

Source: www.habr.com