Denna implementering inspirerades av Alexander Koryukin med sin publikation "«.
Och kommentaren i en av VK-grupperna av Kirill Kazakov:
Ja, verkligen inte sÀkert. Jag skulle hellre skriva en Telegram-bot som tar emot kommandon frÄn mitt konto för att starta.
Jag bestÀmde mig för att skriva en sÄdan bot.
SÄ det första vi mÄste göra Àr att skapa en bot i Telegram.
- Sök efter kontot med namnet @botfather
- Tryck pÄ knappen Start lÀngst ner pÄ skÀrmen
- Efter det skriver vi kommandot /newbot
Vi svarar sedan pÄ 2 enkla frÄgor:
- Den första frÄgan Àr namnet pÄ den bot vi ska skapa MyMikrotikROuter
- Den andra frÄgan Àr anvÀndarnamnet för den bot som ska skapas (mÄste sluta med bot) MikrotikROuter_bot
Som svar fÄr vi token för vÄr bot, i mitt fall Àr det:
AnvÀnd detta token för att fÄ tillgÄng till HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Sedan behöver vi hitta vÄr bot i sökningen efter namnet @MikrotikROuter_botoch tryck pÄ knappen Start.
DÀrefter öppnar vi webblÀsaren och skriver in följande rad:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
DÀr XXXXXXXXXXXXXXXXXX Àr token för din bot.
En sida som ser ungefÀr ut enligt följande öppnas:

Sök pÄ den efter följande text:
"chat":{"id":631290,
SÄ vi har all nödvÀndig information för att skriva skripten för Mikrotik, nÀmligen:
Bot-token: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Chat-ID som den ska skriva till: 631290
För att kontrollera kan vi gÄ in via webblÀsaren:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Bör vi fÄ resultat:

För vÄr bekvÀmhet lÀgger vi direkt till kommandon för boten:
Sök efter kontot med namnet @botfather
Efter det skriver vi honom kommandot /setcommands
- Han kommer att frÄga vilken bot
Skriv:
@MikrotikROuter_bot
LĂ€gg till kommandon:
- helloworld< â Testmeddelande i chatt 1
- itsworking â Testmeddelande i chatt 2
- wolmypc â vĂ€ck min PC
Nu, om vi skriver "\/" i chatten, bör vi fÄ:

Nu gÄr vi vidare till MikroTik.
I RouterOS finns det ett kommandoradsverktyg för att kopiera filer via ftp eller http/https, verktyget heter fetch, och det Àr det vi kommer att anvÀnda.
Ăppna terminalen och skriv in:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Observera att i MikroTik krÀvs "" för att skÀrma av tecknet "?" i URL:en.
Bör vi fÄ resultat:

Nu gÄr vi vidare till skripten:
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"
Kom ihÄg att ange rÀtt mac och namn pÄ grÀnssnittet, samt bot-token och chat_id.
Nu ska jag förklara vad de gör:
Scriptet "helloworld" skickar ett meddelande: "Hello, world!" till vÄr chatt med botten.
Scriptet "itsworking" skickar ett meddelande: "Test OK, itâs Working!" till vĂ„r chatt med botten.
Dessa skript Àr för att demonstrera funktionaliteten.
Scriptet "wolmypc" har jag lagt till som en av möjliga implementationer.
NÀr skriptet körs kommer botten att skriva i chatten "wol OK."
I princip kan man köra vilken skript som helst.
Vi skapar en uppgift:
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
LÀsligt lÀgeDet Àr oklart varför, men det fungerande skriptet Äterger inte globala data, jag la till skriptet vid systemstart.
Telegram-startup
: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=Jag kan inte prata med dig.") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no;
}
Hur det fungerar
Vi laddar ner vÄra meddelanden "getUpdates" var 30:e sekund, och parserar sedan för att ta reda pÄ update_id (meddelande nummer) och text (vÄra kommandon) och chat_id . Som standard ger getUpdates 1 till 100 meddelanden, för bekvÀmlighet tar vi bort meddelandet efter att vi har lÀst kommandot. I Telegram API stÄr det att för att lÀsa ett meddelande behöver man meddelande nummer + 1
/getUpdates?offset=update_id + 1
Allt Àr testat pÄ Mikrotik rb915 RouterOS 6.37.1
Om man skickar mÄnga kommandon pÄ en gÄng, kommer de att utföras en och en med ett intervall pÄ 30 sekunder.
P.S. Stort tack till Kirill Kazakov för idén och min vÀn Alexander för hjÀlpen med skripten.
LĂ€nkar
:Scripting
upd:
03:11:16
Jag har förbÀttrat skripten:
Jag har lagt till en kontroll för chat_id
En sÀkerhetskontroll sÄ att om nÄgon skriver till vÄr bot svarar den: » Jag kan inte prata med dig. «, och den kommer att svara oss pÄ samma sÀtt om den inte kÀnner igen kommandot.
NĂ€r kommandot har exekverats, informerar botten i chatten (se skriptet wolmypc)
UPD
Vi hittade med att filen med mer Àn ~ 14 meddelanden slutar bearbetas av kommandot find (begrÀnsningar i Mikrotik). DÀrför kommer jag i framtiden att omarbeta skriptet till lua, tack för detta, jag visste inte om lua.
UPD 08.12.2016
i Telegram har de tydligen lite förĂ€ndrat âutdataâ frĂ„n getUpdate. Nu i huvudskriptet behöver man justera meddelandets förskjutning frĂ„n 2 till 1
för
:local message [:pick $content ($startLoc + 2) $endLoc] ;
byta till:
:local message [:pick $content ($startLoc + 1) $endLoc] ;
KĂ€lla: habr.com
