Aktivizimi në distancë i skripteve Mikrotik nga Telegram

Alexander Koryukin më shtyu në këtë zbatim GeXoGeN me botimin e tijNdezja në distancë e kompjuterit falas, pa SMS dhe pa re, duke përdorur Mikrotik".

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

Po, nuk është aspak e sigurt. Më mirë do të shkruaj një bot telegram që pranon vetëm komandat e aktivizimit nga llogaria ime.

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

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

  • Ne gjejmë në kërkim një llogari të quajtur @botfather
  • Klikoni në butonin Start në fund të ekranit
  • Pastaj i shkruajmë komandën / newbot

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

  • Pyetja e parë është emri i robotit që do të krijohet. MyMikrotikROuter
  • Pyetja e dytë është pseudonimi i robotit që po krijohet (duhet të përfundojë me bot) MikrotikROuter_bot

Si përgjigje, ne do të marrim shenjën e botit tonë, në rastin tim është:

Përdorni këtë shenjë për të hyrë në API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Aktivizimi në distancë i skripteve Mikrotik nga Telegram
Pastaj, ju duhet të gjeni robotin tonë në kërkimin me emër @MikrotikROuter_bot dhe shtypni butonin Start.

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

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

Ku XXXXXXXXXXXXXXXXXX është shenja e botit tuaj.

Do të hapet një faqe e ngjashme me sa vijon:

Aktivizimi në distancë i skripteve Mikrotik nga Telegram

Në të gjejmë tekstin e mëposhtëm:

"chat":{"id":631290,

Pra, ne kemi të gjitha informacionet e nevojshme për të shkruar skripta për Mikrotik, përkatësisht:

Shenja bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID-ja e bisedës ku duhet të shkruajë: 631290

Për të kontrolluar, ne mund të kalojmë përmes shfletuesit:

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

Duhet të marrë rezultatin:

Aktivizimi në distancë i skripteve Mikrotik nga Telegram

Për lehtësinë tonë, ne do të shtojmë menjëherë komanda për bot:

Gjetja e një llogarie me një emër @botfather
Pastaj i shkruajmë një urdhër / setcommands

  • Ai do të pyesë se cili bot

Ne shkruajmë:
@MikrotikROuter_bot

Shtoni komanda:

  • helloworld< — Test mesazh në chat 1
  • Mesazhi i tij funksionon-Test në chat 2
  • wolmypc- zgjo kompjuterin tim

Tani nëse shkruani "/" në chat, duhet të merrni:

Aktivizimi në distancë i skripteve Mikrotik nga Telegram

Tani le të kalojmë te MikroTik.

RouterOS ka një mjet konsol për kopjimin e skedarëve përmes ftp ose http / https, mjeti quhet fetch, që është ajo që ne do të përdorim.

Hapni terminal dhe shkruani:

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

Ju lutemi vini re se MikroTik ka nevojë për ""për t'i shpëtuar shenjës"?' në URL.

Duhet të marrë rezultatin:

Aktivizimi në distancë i skripteve Mikrotik nga Telegram

Tani le të kalojmë te skriptet:

Përshendetje Botë

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}

po punon

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ë specifikoni emrin e saktë të mac dhe ndërfaqes, si dhe bot-token dhe chat_id.

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

Skenari "helloworld" dërgon një mesazh: "Përshëndetje, botë!" në bisedën tonë me botin.
Skripti "itsworking" dërgon një mesazh: "Testoni OK, është duke punuar!" në bisedën tonë me botin.
Këto skripta janë për qëllime demonstrimi.
Shtova skriptin "wolmypc" si një nga implementimet e mundshme.
Pas ekzekutimit të skenarit, roboti do të shkruajë "wol OK" në bisedë.
Në fakt, ju mund të ekzekutoni absolutisht çdo skenar.

Krijo 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

Pamje e lexueshmenuk është e qartë pse, por nga skripti i punës nuk zbulon të dhëna globale, shtoi skriptin kur sistemi niset.
Fillimi i telegramit

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

Si punon kjo

Shkarkoni mesazhet tona "getUpdates" çdo 30 sekonda, më pas analizoni për ta zbuluar përditësim_id (numri i mesazhit) dhe tekst (skuadrat tona) dhe chat_id . Si parazgjedhje, getUpdates shfaq nga 1 deri në 100 mesazhe, për lehtësi, pasi lexojmë komandën, fshijmë mesazhin. Telegram api thotë për të lexuar një mesazh ju duhet numri i mesazhit + 1

/getUpdates?offset=update_id + 1

Të gjitha të testuara në Mikrotik rb915 RouterOS 6.37.1
Nëse dërgoni shumë komanda në të njëjtën kohë, të gjitha ato do të ekzekutohen me radhë me një interval prej 30 sekondash.

PS Shumë faleminderit Kirill Kazakov për idenë dhe mikun tim Alexander për ndihmën me skenarët.

Referencat

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

Skriptet e përmirësuara:

Kontrolli i shtuar për chat_id
Duke kontrolluar për një budalla, nëse dikush i shkruan botit tonë, ai do t'i përgjigjet: "Nuk mund të flas me ty. “, në mënyrë të ngjashme do të na përgjigjet nëse nuk e njeh komandën.
Pas ekzekutimit të komandës, roboti çabonohet në bisedë (shih skriptin wolmypc)

DUP

Gjetur me 7 Stuntman7 se një skedar me mbi ~ 14 mesazhe nuk përpunohet më nga komanda find (kufizimet e Mikrotik). Prandaj, në të ardhmen do ta ndryshoj skenarin në lua, faleminderit 7 Stuntman7 per kete nuk dija per lua.

UPD 08.12.2016/XNUMX/XNUMX

në Telegram, me sa duket, ata ndryshuan pak "shter" të getUpdate. tani në skenarin kryesor ju duhet të korrigjoni zhvendosjen e mesazhit nga 2 në 1

Ndryshimet

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

заменить на :

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

Burimi: www.habr.com