Fjarvirkjun Mikrotik forskrifta frá Telegram

Alexander Koryukin ýtti mér að þessari útfærslu GeXoGeN með útgáfu hansFjarkveikt á tölvunni ókeypis, án SMS og án skýja, með því að nota Mikrotik".

Og athugasemd í einum af VK hópunum eftir Kirill Kazakov:

Já, það er alls ekki öruggt. Ég myndi frekar skrifa símskeyti sem tekur aðeins við virkjunarskipunum frá reikningnum mínum.

Ég ákvað að skrifa svona bot.

Svo það fyrsta sem þarf að gera er að búa til vélmenni í símskeyti.

  • Við finnum í leitinni reikning sem heitir @botfather
  • Smelltu á Start hnappinn neðst á skjánum
  • Síðan skrifum við honum skipunina / newbot

Síðan svörum við 2 einföldum spurningum:

  • Fyrsta spurningin er nafn vélmennisins sem á að búa til. MyMikrotikROuter
  • Önnur spurningin er gælunafn botnsins sem verið er að búa til (ætti að enda á láni) MikrotikROuter_bot

Til að bregðast við munum við fá táknið á botni okkar, í mínu tilfelli er það:

Notaðu þennan tákn til að fá aðgang að HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Fjarvirkjun Mikrotik forskrifta frá Telegram
Þá þarftu að finna vélmenni okkar í leitinni eftir nafni @MikrotikROuter_bot og ýttu á Start hnappinn.

Eftir það þarftu að opna vafrann og slá inn eftirfarandi línu:

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

Þar sem XXXXXXXXXXXXXXXXXX er auðkenni lánmanns þíns.

Síðan opnast svipað og eftirfarandi:

Fjarvirkjun Mikrotik forskrifta frá Telegram

Við finnum eftirfarandi texta á því:

"spjall":{"id":631290,

Þannig að við höfum allar nauðsynlegar upplýsingar til að skrifa handrit fyrir Mikrotik, þ.e.

Bot tákn: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Spjallauðkenni þar sem hann ætti að skrifa: 631290

Til að athuga getum við farið í gegnum vafrann:

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

Ætti að fá niðurstöðuna:

Fjarvirkjun Mikrotik forskrifta frá Telegram

Til hægðarauka munum við strax bæta við skipunum fyrir botmanninn:

Að finna reikning með nafni @botfaðir
Svo skrifum við honum skipun / setcommands

  • Hann mun spyrja hvaða bot

Við skrifum:
@MikrotikROuter_bot

Bæta við skipunum:

  • helloworld< — Próf skilaboð á spjalli 1
  • itsworking-Prufuskilaboð á spjalli 2
  • wolmypc-vakaðu tölvuna mína

Nú ef þú skrifar "/" í spjallinu ættirðu að fá:

Fjarvirkjun Mikrotik forskrifta frá Telegram

Nú skulum við halda áfram í MikroTik.

RouterOS er með console tól til að afrita skrár í gegnum ftp eða http / https, tólið heitir fetch, sem er það sem við munum nota.

Opið flugstöðinni og sláðu inn:

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

Vinsamlegast athugaðu að MikroTik þarf "» til að flýja skilti «?' í vefslóðinni.

Ætti að fá niðurstöðuna:

Fjarvirkjun Mikrotik forskrifta frá Telegram

Nú skulum við halda áfram að handritum:

Halló heimur

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}

þess að vinna

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"

Ekki gleyma að tilgreina rétt Mac og viðmótsheiti, svo og bot-token og chat_id.

Nú mun ég útskýra aðeins hvað þeir gera:

"helloworld" handritið sendir skilaboð: "Halló, heimur!" í spjallið okkar við botninn.
"Itsworking" forskriftin sendir skilaboð: "Prófið í lagi, það virkar!" í spjallið okkar við botninn.
Þessi handrit eru til sýnikennslu.
Ég bætti við "wolmypc" forskriftinni sem einni af mögulegum útfærslum.
Þegar handritið er keyrt mun vélmenni skrifa „wol OK“ í spjallið.
Reyndar geturðu keyrt nákvæmlega hvaða forskrift sem er.

Búðu til verkefni:

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

Lesanlegt útsýniþað er ekki ljóst hvers vegna, en frá vinnuhandritinu birtir það ekki alþjóðleg gögn, bætti handritinu við þegar kerfið ræsir.
Telegram gangsetning

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

Hvernig virkar þetta

Sæktu „getUpdates“ skilaboðin okkar á 30 sekúndna fresti og skiptu síðan til að komast að því update_id (skilaboðanúmer) og texta (lið okkar) og spjall_id . Sjálfgefið, getUpdates birtir frá 1 til 100 skilaboð, til þæginda, eftir að hafa lesið skipunina, eyðum við skilaboðunum. Telegram api segir að til að lesa skilaboð þarftu skilaboðanúmerið + 1

/getUpdates?offset=update_id + 1

Allt prófað á Mikrotik rb915 RouterOS 6.37.1
Ef þú sendir margar skipanir í einu verða þær allar framkvæmdar til skiptis með 30 sekúndna millibili.

PS Kærar þakkir til Kirill Kazakov fyrir hugmyndina og vinur minn Alexander fyrir aðstoð við handritin.

tilvísanir

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

uppfærsla:

03:11:16

Bætt handrit:

Bætti við ávísun fyrir chat_id
Til að athuga hvort einhver sé fífl, ef einhver skrifar til botnsins okkar, mun hann svara honum: „Ég get ekki talað við þig. “, mun á sama hátt svara okkur ef það þekkir ekki skipunina.
Eftir að skipunin hefur verið framkvæmt hættir botninn áskrift að spjallinu (sjá wolmypc forskrift)

DUP

Fannst með 7 áhættuleikari7 að skrá með yfir ~14 skilaboðum er ekki lengur unnin með find skipuninni (Mikrotik takmarkanir). Þess vegna mun ég í framtíðinni breyta handritinu í lua, takk 7 áhættuleikari7 fyrir þetta vissi eg ekki um lua.

UPD 08.12.2016/XNUMX/XNUMX

í Telegram, greinilega, breyttu þeir aðeins „útblástur“ á getUpdate. núna í aðalforritinu þarftu að leiðrétta færsluna frá 2 í 1

breytingar

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

заменить на :

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

Heimild: www.habr.com