Aleksander Koryukin sundis mind selle teostuse juurde
Ja Kirill Kazakovi kommentaar ühes VK grupis:
Jah, see pole üldse turvaline. Ma pigem kirjutaksin telegrammi roboti, mis võtab vastu ainult minu kontolt pärinevaid aktiveerimiskäske.
Otsustasin kirjutada sellise roboti.
Niisiis, esimene asi, mida teha, on luua telegrammis bot.
- Otsingust leiame konto nimega @botfather
- Klõpsake ekraani allosas nuppu Start
- Seejärel kirjutame talle käsu / newbot
Seejärel vastame kahele lihtsale küsimusele:
- Esimene küsimus on loodava roboti nimi. MyMikrotikROuter
- Teine küsimus on loodava roboti hüüdnimi (peaks lõppema botiga) MikrotikROuter_bot
Vastuseks saame oma roboti märgi, minu puhul on see:
Kasutage seda luba HTTP API-le juurdepääsuks: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Seejärel peate leidma nime järgi otsingust meie roboti @MikrotikROuter_bot ja vajutage nuppu Start.
Pärast seda peate avama brauseri ja sisestama järgmise rea:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Kus XXXXXXXXXXXXXXXXXXXXX on teie roboti tunnus.
Avaneb järgmisega sarnane leht:
Leiame sellelt järgmise teksti:
"chat":{"id":631290,
Niisiis, meil on kogu vajalik teave Mikrotiku skriptide kirjutamiseks, nimelt:
Boti tunnus: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Vestluse ID, kuhu ta peaks kirjutama: 631290
Kontrollimiseks saame brauserist läbi minna:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Tulemus peaks saama:
Mugavuse huvides lisame boti jaoks kohe käsud:
Nimega konto leidmine @botisa
Siis kirjutame talle käsu / setcommands
- Ta küsib, milline robot
Me kirjutame:
@MikrotikROuter_bot
Lisa käske:
- helloworld< — testsõnum vestluses 1
- itsworking-Test sõnum vestluses 2
- wolmypc-ärata mu arvuti
Nüüd, kui sisestate vestlusesse "/", peaksite saama:
Liigume nüüd MikroTiku juurde.
RouterOS-il on konsooliutiliit failide kopeerimiseks ftp või http / https kaudu, utiliiti nimetatakse tõmbamiseks, mida me kasutame.
Avatud terminal ja sisestage:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Pange tähele, et MikroTik vajab "» märgi eest põgeneda «?' URL-is.
Tulemus peaks saama:
Liigume nüüd skriptide juurde:
Tere, Maailm
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}
see töötab
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"
Ärge unustage määrata õiget Maci ja liidese nime, samuti bot-tokenit ja chat_id.
Nüüd selgitan veidi, mida nad teevad:
"Helloworldi" skript saadab sõnumi: "Tere, maailm!" meie vestlusesse robotiga.
Skript "itsworking" saadab teate: "Test OK, it's Working!" meie vestlusesse robotiga.
Need skriptid on mõeldud tutvustamiseks.
Lisasin ühe võimaliku teostusena skripti "wolmypc".
Skripti täitmisel kirjutab bot vestlusesse "wol OK".
Tegelikult saate käivitada absoluutselt mis tahes skripti.
Loo ülesanne:
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
Loetav vaadepole selge, miks, kuid töötavast skriptist see globaalseid andmeid ei avalda, lisas skripti süsteemi käivitumisel.
Telegrami käivitamine
: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") ;
Telegramm
: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;
}
Kuidas see töötab
Laadige iga 30 sekundi järel alla meie "getUpdatesi" sõnumid, seejärel sõeluge, et teada saada update_id (sõnumi number) ja tekst (meie meeskonnad) ja vestluse_id . Vaikimisi kuvab getUpdates 1 kuni 100 sõnumit, mugavuse huvides kustutame sõnumi pärast käsu lugemist. Telegrami api ütleb, et sõnumi lugemiseks on vaja sõnumi numbrit + 1
/getUpdates?offset=update_id + 1
Kõik testitud Mikrotik rb915 RouterOS 6.37.1 peal
Kui saadate korraga palju käske, täidetakse need kõik kordamööda 30-sekundilise intervalliga.
PS Suur tänu Kirill Kazakovile idee eest ja sõbrale Aleksandrile abi eest stsenaariumi tegemisel.
Viited
upd:
03:11:16
Täiustatud skriptid:
Lisatud chat_id kontroll
Lolli kontrollimisel, kui keegi meie robotile kirjutab, vastab ta talle: "Ma ei saa sinuga rääkida. “, vastab meile samamoodi, kui ta käsku ära ei tunne.
Pärast käsu täitmist katkestab bot vestluse tellimuse (vt wolmypc skripti)
DUP
Leitud koos
UPD 08.12.2016
Telegramis muutsid nad ilmselt veidi getUpdate'i "ammendumist". nüüd peate põhiskriptis parandama sõnumi nihke 2-lt 1-le
muutused
:local message [:pick $content ($startLoc + 2) $endLoc] ;
заменить на :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Allikas: www.habr.com