Për këtë zbatim më nxiti Aleksandr Koryukin me publikimin e tij ««.
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

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ë:

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:

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:

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:

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