Aleksandras Koryukinas pastūmėjo mane prie šio įgyvendinimo
Ir Kirilo Kazakovo komentaras vienoje iš VK grupių:
Taip, tai visai nesaugu. Verčiau parašysiu telegramų robotą, kuris priima tik aktyvinimo komandas iš mano paskyros.
Nusprendžiau parašyti tokį botą.
Taigi, pirmas dalykas, kurį reikia padaryti, yra sukurti robotą telegramoje.
- Paieškoje randame paskyrą pavadinimu @botfather
- Spustelėkite mygtuką Pradėti ekrano apačioje
- Tada parašome jam komandą / newbot
Tada atsakome į 2 paprastus klausimus:
- Pirmasis klausimas yra kuriamo roboto pavadinimas. MyMikrotikROuter
- Antrasis klausimas yra kuriamo roboto slapyvardis (turėtų baigtis bot) MikrotikROuter_bot
Atsakydami gausime savo roboto žetoną, mano atveju tai yra:
Naudokite šį prieigos raktą, kad pasiektumėte HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Tada paieškoje pagal pavadinimą turite rasti mūsų robotą @MikrotikROuter_bot ir paspauskite mygtuką Pradėti.
Po to turite atidaryti naršyklę ir įvesti šią eilutę:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Kur XXXXXXXXXXXXXXXXXXXXX yra jūsų roboto prieigos raktas.
Bus atidarytas puslapis, panašus į šį:
Ant jo randame tokį tekstą:
"chat":{"id":631290,
Taigi, turime visą reikalingą informaciją Mikrotik scenarijų rašymui, būtent:
Boto prieigos raktas: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Pokalbio ID, kur jis turėtų parašyti: 631290
Norėdami patikrinti, galime pereiti per naršyklę:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Turėtų gautis rezultatas:
Patogumui iš karto pridėsime komandas botui:
Rasti paskyrą su vardu @bottėvas
Tada parašome jam komandą / setcommands
- Jis paklaus, kuris botas
Mes rašome:
@MikrotikROuter_bot
Pridėti komandas:
- helloworld< – patikrinkite pranešimą pokalbyje 1
- itsworking – bandomasis pranešimas pokalbyje 2
- wolmypc-wake up my PC
Jei pokalbyje įvesite „/“, turėtumėte gauti:
Dabar pereikime prie MikroTik.
„RouterOS“ turi konsolės įrankį, skirtą failams kopijuoti per ftp arba http / https, ši programa vadinama „fetch“, kurią mes ir naudosime.
Atidaryti terminalas ir įveskite:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Atkreipkite dėmesį, kad MikroTik reikia ""Pabėgti nuo ženklo"?“ URL.
Turėtų gautis rezultatas:
Dabar pereikime prie scenarijų:
Labas pasauli
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}
Veikia
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"
Nepamirškite nurodyti teisingo „Mac“ ir sąsajos pavadinimo, taip pat „bot-token“ ir „chat_id“.
Dabar aš šiek tiek paaiškinsiu, ką jie daro:
Scenarijus „helloworld“ siunčia žinutę: „Sveikas, pasauli! į mūsų pokalbį su robotu.
Scenarijus "itsworking" siunčia pranešimą: "Test OK, it's Working!" į mūsų pokalbį su robotu.
Šie scenarijai yra demonstravimo tikslais.
„Wolmypc“ scenarijų pridėjau kaip vieną iš galimų įgyvendinimų.
Vykdydamas scenarijų, robotas pokalbyje parašys „wol OK“.
Tiesą sakant, galite paleisti absoliučiai bet kokį scenarijų.
Sukurkite užduotį:
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
Skaitomas vaizdasneaišku kodėl, bet iš darbo scenarijaus jis neatskleidžia visuotinių duomenų, pridėjo scenarijų, kai sistema paleidžiama.
Telegramos paleidimas
: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;
}
Kaip tai veikia
Atsisiųskite mūsų „getUpdates“ pranešimus kas 30 sekundžių, tada analizuokite, kad sužinotumėte update_id (pranešimo numeris) ir tekstas (mūsų komandos) ir pokalbio_id . Pagal numatytuosius nustatymus getUpdates rodo nuo 1 iki 100 pranešimų, patogumo dėlei perskaitę komandą žinutę ištriname. Telegram api sako, kad norint perskaityti pranešimą, reikia pranešimo numerio + 1
/getUpdates?offset=update_id + 1
Viskas išbandyta naudojant Mikrotik rb915 RouterOS 6.37.1
Jei vienu metu siunčiate daug komandų, jos visos bus vykdomos paeiliui su 30 sekundžių intervalu.
PS Labai ačiū Kirilui Kazakovui už idėją ir mano draugui Aleksandrui už pagalbą kuriant scenarijus.
Nuorodos
upd:
03:11:16
Patobulinti scenarijai:
Pridėtas chat_id patikrinimas
Tikrinant, ar nėra kvailio, jei kas nors parašys mūsų botui, jis jam atsakys: „Aš negaliu su tavimi kalbėtis. “, panašiai atsakys mums, jei neatpažins komandos.
Įvykdęs komandą, robotas atsisako pokalbio prenumeratos (žr. wolmypc scenarijų)
DUP
Rasta su
UPD 08.12.2016-XNUMX-XNUMX
Telegramoje, matyt, jie šiek tiek pakeitė getUpdate „išnaudojimą“. dabar pagrindiniame scenarijuje reikia ištaisyti pranešimo poslinkį nuo 2 iki 1
pokyčiai
:local message [:pick $content ($startLoc + 2) $endLoc] ;
заменить на :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Šaltinis: www.habr.com