Aktivizimi i skripteve Mikrotik nga distanca përmes Telegram

Për këtë zbatim më nxiti Aleksandr Koryukin GeXoGeN me publikimin e tij «Aktivizimi i kompjuterit nga distanca falas, pa SMS dhe pa cloud, me ndihmën e Mikrotik«.

Dhe komenti në një nga grupet VK i Kirill Kazakov:

Po, kjo nuk është aspak e sigurt. Unë do të shkruaja më mirë një bot Telegram që pranon komanda për ndezje vetëm nga llogaria ime.

Vendosa të shkruaj një bot të tillë.

Pra, gjëja e parë që duhet bërë është të krijoni një bot në Telegram.

  • GjejmĂ« nĂ« kĂ«rkim llogarinĂ« me emrin @botfather
  • KlikojmĂ« butonin Start nĂ« pjesĂ«n e poshtme tĂ« ekranit
  • Pastaj i dĂ«rgojmĂ« komandĂ«n /newbot

Më pas u përgjigjemi 2 pyetjeve të thjeshta:

  • Pyetja e parĂ« – emri i botit qĂ« po krijohet MyMikrotikROuter
  • Pyetja e dytĂ« – nofka e botit qĂ« po krijohet (duhet tĂ« pĂ«rfundojĂ« me bot) MikrotikROuter_bot

Si përgjigje do të marrim token-in e botit tonë, në rastin tim është:

Use this token to access the HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Aktivizimi i skripteve Mikrotik nga distanca përmes Telegram
Më pas duhet të gjejmë botin tonë në kërkim sipas emrit @MikrotikROuter_bot dhe të klikojmë butonin Start.

Pas kësaj duhet të hapni shfletuesin dhe të vendosni rreshtin e mëposhtëm:

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

Ku XXXXXXXXXXXXXXXXXX është token-i i botit tuaj.

Do të hapet një faqe afërsisht e tillë:

Aktivizimi i skripteve Mikrotik nga distanca përmes Telegram

Gjejmë në të tekstin e mëposhtëm:

«chat»:{«id»:631290,

Pra, tani kemi gjithë informacionin e nevojshëm për të shkruar skriptet për MikroTik, konkretisht:

Token-i i botit: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID e chat-it ku ai duhet të shkruajë: 631290

Për ta kontrolluar, mund të hapim në shfletues:

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

Duhet të marrim rezultatin:

Aktivizimi i skripteve Mikrotik nga distanca përmes Telegram

Për lehtësinë tonë, le të shtojmë menjëherë komandat për botin:

Gjejmë llogarinë me emrin @botfather
Pastaj i dërgojmë komandën /setcommands

  • Ai do tĂ« pyesĂ« pĂ«r cilin bot

Shkruajmë:
@MikrotikROuter_bot

Shtojmë komandat:

  • helloworld< — Test message on chat 1
  • itsworking — Test Message on chat 2
  • wolmypc — zgjo kompjuterin tim

Tani, nëse shtypni në chat «/», duhet të merrni:

Aktivizimi i skripteve Mikrotik nga distanca përmes Telegram

Tani kalojmë te MikroTik.

Në RouterOS ka një mjet konsolë për kopjimin e skedarëve përmes ftp ose http/https, mjeti quhet fetch dhe pikërisht atë do të përdorim.

Hapim terminal dhe shkruajmë:

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

Kini parasysh se në MikroTik nevojitet «» për të escapuar shenjën «?» në URL.

Duhet të marrim rezultatin:

Aktivizimi i skripteve Mikrotik nga distanca përmes Telegram

Tani kalojmë te skriptet:

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-resul
    t=no"

Mos harroni të vendosni MAC-un e saktë dhe emrin e ndërfaqes, si edhe bot-token dhe chat_id.

Tani do të shpjegoj shkurt çfarë bëjnë:

Skripti «helloworld» dërgon mesazhin: » Hello,world!» në chat-in tonë me botin.
Skripti «itsworking» dĂ«rgon mesazhin: » Test OK, it’s Working !» nĂ« chat-in tonĂ« me botin.
Këto skripte janë për demonstrimin e funksionimit.
Skriptin «wolmypc» e shtova si një nga mënyrat e mundshme të zbatimit.
Pas ekzekutimit të skriptit, boti do të shkruajë në chat «wol OK».
Në thelb, mund të ekzekutoni pothuajse çdo skript.

Krijojmë detyrën:

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

Pamje e lexueshmeNuk është e qartë pse, por nga skripti funksional nuk shpallen të dhënat globale, ndaj shtova një skript gjatë nisjes së sistemit.
Telegram-startup

:delay 5
:global botID "botXXXXXXXXXXXXXXXXXX" ;   token i botit
: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; 
} 

Si funksionon kjo

Shkarkojmë mesazhet tona «getUpdates» çdo 30 sekonda, më pas i analizojmë për të kuptuar update_id (numri i mesazhit) dhe text (komandat tona) dhe chat_id . Si parazgjedhje, getUpdates shfaq nga 1 deri në 100 mesazhe; për lehtësi, pasi komanda lexohet, mesazhi fshihet. Në Telegram API thuhet se për të lexuar mesazhin nevojitet numri i mesazhit + 1

/getUpdates?offset=update_id + 1

Gjithçka është testuar në Mikrotik rb915 RouterOS 6.37.1
Nëse dërgoni shumë komanda menjëherë, ato do të ekzekutohen njëra pas tjetrës me interval prej 30 sekondash.

P.S. Falënderime të mëdha për Kirill Kazakov për idenë dhe mikut tim Aleksandër për ndihmën me skriptet.

Linket

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

Përditësim:

03:11:16

I përmirësova skriptet:

Shtova kontrollin për chat_id
Kontroll bazĂ« sigurie: nĂ«se dikush i shkruan bot-it tonĂ«, ai do t’i pĂ«rgjigjet: » I can’t talk with you. «; po ashtu do tĂ« na pĂ«rgjigjet edhe neve nĂ«se nuk e njeh komandĂ«n.
Pas ekzekutimit të komandës, boti dërgon një mesazh në chat (shih skriptin wolmypc)

UPD

Zbuluam me 7Stuntman7 se një skedar me më shumë se ~ 14 mesazhe nuk përpunohet më nga komanda find (kufizim i Mikrotik). Prandaj në të ardhmen do ta rishkruaj skriptin në lua, faleminderit 7Stuntman7 për këtë, nuk e dija për lua.

PËRDITËSIM 08.12.2016

Me sa duket, nĂ« Telegram kanĂ« ndryshuar pak “output”-in e getUpdate. Tani nĂ« skriptin kryesor duhet korrigjuar zhvendosja e mesazhit nga 2 nĂ« 1

ndryshime

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

zëvendësojeni me :

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

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster