Remote activation ng Mikrotik script mula sa Telegram

Itinulak ako ni Alexander Koryukin sa pagpapatupad na ito GeXoGeN kasama ang kanyang publikasyonMalayuang pag-on sa computer nang libre, walang SMS at walang ulap, gamit ang Mikrotik".

At isang komento sa isa sa mga pangkat ng VK ni Kirill Kazakov:

Oo, hindi ito ligtas. Mas gugustuhin kong magsulat ng telegram bot na tumatanggap lamang ng mga utos sa pag-activate mula sa aking account.

Nagpasya akong magsulat ng ganoong bot.

Kaya, ang unang bagay na dapat gawin ay lumikha ng isang bot sa telegrama.

  • Nakita namin sa paghahanap ang isang account na pinangalanang @botfather
  • Mag-click sa Start button sa ibaba ng screen
  • Pagkatapos ay isusulat namin sa kanya ang utos / newbot

Pagkatapos ay sasagutin namin ang 2 simpleng tanong:

  • Ang unang tanong ay ang pangalan ng bot na gagawin. MyMikrotikROuter
  • Ang pangalawang tanong ay ang palayaw ng bot na nilikha (dapat magtapos sa bot) MikrotikROuter_bot

Bilang tugon, matatanggap namin ang token ng aming bot, sa aking kaso ito ay:

Gamitin ang token na ito para ma-access ang HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Remote activation ng Mikrotik script mula sa Telegram
Pagkatapos, kailangan mong hanapin ang aming bot sa paghahanap ayon sa pangalan @MikrotikROuter_bot at pindutin ang Start button.

Pagkatapos nito, kailangan mong buksan ang browser at ipasok ang sumusunod na linya:

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

Kung saan ang XXXXXXXXXXXXXXXXXX ay token ng iyong bot.

Magbubukas ang isang pahinang katulad ng sumusunod:

Remote activation ng Mikrotik script mula sa Telegram

Nakita namin ang sumusunod na teksto dito:

"chat":{"id":631290,

Kaya, mayroon kaming lahat ng kinakailangang impormasyon para sa pagsulat ng mga script para sa Mikrotik, lalo na:

Bot token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat ID kung saan siya dapat sumulat: 631290

Upang suriin, maaari tayong dumaan sa browser:

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

Dapat makuha ang resulta:

Remote activation ng Mikrotik script mula sa Telegram

Para sa aming kaginhawaan, agad kaming magdaragdag ng mga utos para sa bot:

Paghahanap ng account na may pangalan @botfather
Pagkatapos ay sumulat kami sa kanya ng isang utos / setcommands

  • Tatanungin niya kung aling bot

Sumulat kami:
@MikrotikROuter_bot

Magdagdag ng mga utos:

  • helloworld< β€” Test message sa chat 1
  • gumagana nito-Test Message sa chat 2
  • wolmypc-wake up my PC

Ngayon kung nag-type ka ng "/" sa chat, dapat mong makuha ang:

Remote activation ng Mikrotik script mula sa Telegram

Ngayon ay lumipat tayo sa MikroTik.

Ang RouterOS ay may console utility para sa pagkopya ng mga file sa pamamagitan ng ftp o http / https, ang utility ay tinatawag na fetch, na kung ano ang gagamitin namin.

Buksan pandulo at ipasok ang:

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

Pakitandaan na kailangan ng MikroTik ""para makatakas sa tanda"?' sa URL.

Dapat makuha ang resulta:

Remote activation ng Mikrotik script mula sa Telegram

Ngayon ay lumipat tayo sa mga script:

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}

gumagana nito

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"

Huwag kalimutang tukuyin ang tamang mac at pangalan ng interface, pati na rin ang bot-token at chat_id.

Ngayon ay ipapaliwanag ko nang kaunti kung ano ang ginagawa nila:

Ang script na "helloworld" ay nagpapadala ng mensahe: "Hello, world!" sa aming pakikipag-chat sa bot.
Ang "itsworking" script ay nagpapadala ng mensahe: "Test OK, it's Working!" sa aming pakikipag-chat sa bot.
Ang mga script na ito ay para sa mga layunin ng pagpapakita.
Idinagdag ko ang script na "wolmypc" bilang isa sa mga posibleng pagpapatupad.
Sa pagpapatupad ng script, isusulat ng bot ang "wol OK" sa chat.
Sa katunayan, maaari kang magpatakbo ng ganap na anumang script.

Lumikha ng isang gawain:

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

Nababasang Viewhindi malinaw kung bakit, ngunit mula sa gumaganang script ay hindi ito nagbubunyag ng pandaigdigang data, idinagdag ang script kapag nag-boot ang system.
Pagsisimula ng 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") ;

Telegrama

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

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

I-download ang aming "getUpdates" na mga mensahe tuwing 30 segundo, pagkatapos ay i-parse para malaman update_id (numero ng mensahe) at teksto (ang aming mga koponan) at chat_id . Bilang default, ang getUpdates ay nagpapakita mula 1 hanggang 100 na mensahe, para sa kaginhawahan, pagkatapos basahin ang command, tatanggalin namin ang mensahe. Sinasabi ng Telegram api na magbasa ng isang mensahe kailangan mo ang numero ng mensahe + 1

/getUpdates?offset=update_id + 1

Lahat ay nasubok sa Mikrotik rb915 RouterOS 6.37.1
Kung magpadala ka ng maraming utos nang sabay-sabay, lahat ng mga ito ay isasagawa nang magkakasunod na may pagitan na 30 segundo.

PS Maraming salamat kay Kirill Kazakov para sa ideya at sa aking kaibigang si Alexander para sa tulong sa mga script.

sanggunian

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

upd:

03:11:16

Mga pinahusay na script:

Nagdagdag ng tseke para sa chat_id
Sinusuri kung may tanga, kung may sumulat sa aming bot, sasagutin niya siya: "Hindi kita makausap. β€œ, ay katulad din ang sasagot sa amin kung hindi nito nakikilala ang utos.
Pagkatapos isagawa ang utos, mag-unsubscribe ang bot sa chat (tingnan ang script ng wolmypc)

DUP

Natagpuan na may 7Stuntman7 na ang isang file na may higit sa ~14 na mensahe ay hindi na pinoproseso ng find command (mga limitasyon ng Microtik). Samakatuwid, sa hinaharap, babaguhin ko ang script sa lua, salamat 7Stuntman7 para dito, hindi ko alam ang tungkol kay lua.

UPD 08.12.2016/XNUMX/XNUMX

sa Telegram, tila, bahagyang binago nila ang "tambutso" ng getUpdate. ngayon sa pangunahing script kailangan mong iwasto ang offset ng mensahe mula 2 hanggang 1

pagbabago

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

Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° :

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

Pinagmulan: www.habr.com