Aktivizimi i skenarëve Mikrotik nga Telegram në distancë

Kjo implementim u realizua falë Aleksandrit Koryukin GeXoGeN në publikimin e tij "Aktivizimi i largët i kompjuterit falas, pa SMS dhe pa shkarkime, me ndihmën e Mikrotik«.

Dhe një koment në një nga grupet VK të Kirill Kazakov:

Po, me të vërtetë nuk është sigurt. Do të ishte më mirë të shkruaja një bot Telegram, e cila pranon komanda për aktivizim vetëm nga llogaria ime.

Kam vendosur të shkruaj një të tillë.

Pra, e para që duhet të bësh është të krijosh një bot në telegram.

  • Gjej nĂ« kĂ«rkim llogarinĂ« me emrin @botfather
  • Kliko nĂ« butonin Start nĂ« fund tĂ« ekranit
  • Pastaj shkruajmĂ« komandĂ«n /newbot

Më pas, përgjigjemi në 2 pyetje të thjeshta:

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

Në përgjigje do të marrim tokenin e botit tonë, në rastin tim është:

Përdor këtë token për të aksesuar HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Aktivizimi i skenarëve Mikrotik nga Telegram në distancë
Pastaj, duhet të gjejmë botin tonë në kërkim sipas emrit @MikrotikROuter_bot dhe të klikojmë në butonin Start.

Pas kësaj, duhet të hapim shfletuesin dhe të tregojmë rreshtin e mëposhtëm:

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

Ku XXXXXXXXXXXXXXXXXX është tokeni i botit tuaj.

Do të hapet një faqe që duket më pak si:

Aktivizimi i skenarëve Mikrotik nga Telegram në distancë

Gjejmë aty tekstin e mëposhtëm:

"chat":{"id":631290,

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

Tokeni i botit: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID e bisedës, ku duhet të shkruajë: 631290

Për verifikim mund të hyjmë përmes shfletuesit:

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

Duhet të marrim rezultatin:

Aktivizimi i skenarëve Mikrotik nga Telegram në distancë

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

Gjejmë llogarinë me emrin @botfather
Më pas shkruajmë komandën /setcommands

  • Do tĂ« pyesĂ« se pĂ«r cilin bot

Shkruani:
@MikrotikROuter_bot

Shtojmë komandat:

  • helloworld< — Mesazh provĂ« nĂ« bisedĂ«n 1
  • itsworking — Mesazh provĂ« nĂ« bisedĂ«n 2
  • wolmypc — aktivizo PC-nĂ« time

Tani, nëse shkruajmë në bisedë "/", duhet të marrim:

Aktivizimi i skenarëve Mikrotik nga Telegram në distancë

Tani kalojmë te MikroTik.

Në RouterOS ka një utilitar konsolë për kopjimin e skedarëve përmes ftp ose http/https, utilitarin e quajtur fetch, pikërisht me të do të punojmë.

Hapim terminalin dhe shkruajmë:

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

Kujdes, në MikroTik është e nevojshme "" për të ekranduar simbolin "?" në URL.

Duhet të marrim rezultatin:

Aktivizimi i skenarëve Mikrotik nga Telegram në distancë

Tani kalojmë te skenarët:

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-result=no"

Mos harro të specifikosh mac dhe emrin e ndërfaqes, si dhe bot-token dhe chat_id.

Tani do të shpjegoj pak se çfarë bëjnë:

Skenari "helloworld" dërgon mesazhin: "Hello,world!" në bisedën tonë me botin.
Skenari "itsworking" dĂ«rgon mesazhin: "Test OK, it’s Working!" nĂ« bisedĂ«n tonĂ« me botin.
Këta skenarë janë për demonstruar funksionimin.
Skenari "wolmypc" e kam shtuar si një nga mundësitë.
Pas ekzekutimit të skenarit, boti do të shkruajë në bisedë "wol OK".
Në thelb, mund të ekzekutosh çdo skenar.

Krijojmë një detyrë:

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

Pamja e lexueshmenuk di pse, por skenari nga puna nuk shpall të dhënat globale, kam shtuar skenarin gjatë ngarkimit të 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

Shkarkojmë mesazhet tona "getUpdates" çdo 30 sekonda, pastaj i analizojmë për të kuptuar update_id (numri i mesazhit) dhe text (komandat tona) dhe chat_id . Në mënyrë të paracaktuar getUpdates jep nga 1 në 100 mesazhe, për lehtësi, pas leximit të komandës, mesazhin e fshijmë. Në API-në e Telegram tha se për të lexuar një mesazh nevojitet numri i mesazhit + 1

/getUpdates?offset=update_id + 1

Të gjitha janë provuar në Mikrotik rb915 RouterOS 6.37.1
Nëse dërgoni menjëherë shumë komanda, ato do të ekzekutohen njëra pas tjetrës me interval prej 30 sekondash.

P.S. Një falënderim të madh Kirill Kazakov për idenë dhe mikut tim Aleksandër për ndihmën me skenarët.

Linke

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

upd:

03:11:16

Përmirësova skenarët:

Shtova verifikimin për chat_id
Verifikim i logjikës, nëse dikush i shkruan botit tonë, ai do t'i përgjigjet: » Nuk mund të flas me ty. «, e njëjta përgjigje do të na jepet nëse nuk njeh komandën.
Pasi ekzekutohet komanda, boti raporton në chat (shih Skripti wolmypc)

UPD

Kemi gjetur me 7Stuntman7 se skedari nga ~ 14 mesazhet më sipër, pushon së u përpunuari nga komanda find (kufizimet Mikrotik). Prandaj, në të ardhmen, do ta rishkruaj skriptin në lua, faleminderit 7Stuntman7 për këtë, nuk dija për lua.

UPD 08.12.2016

në Telegram duket se kanë bërë disa ndryshime në "daljen" getUpdate. tani në skriptin kryesor duhet të rregullojmë zhvendosjen e mesazhit nga 2 në 1

në

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

zëvendësohet me:

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

Burimi: habr.com

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