Alexander Koryukin me je spodbudil k tej izvedbi
In komentar v eni od skupin VK Kirill Kazakov:
Ja, sploh ni varno. Raje bi napisal telegram bota, ki sprejema samo aktivacijske ukaze iz mojega računa.
Odločil sem se napisati takega bota.
Torej, prva stvar, ki jo morate storiti, je ustvariti bota v telegramu.
- V iskanju najdemo račun z imenom @botfather
- Kliknite gumb Start na dnu zaslona
- Nato mu napišemo ukaz / newbot
Nato odgovorimo na 2 preprosti vprašanji:
- Prvo vprašanje je ime bota, ki ga želite ustvariti. MyMikrotikROuter
- Drugo vprašanje je vzdevek bota, ki se ustvarja (končati se mora z bot) MikrotikROuter_bot
Kot odgovor bomo prejeli žeton našega bota, v mojem primeru je to:
Za dostop do HTTP API uporabite ta žeton: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Nato morate najti našega bota v iskanju po imenu @MikrotikROuter_bot in pritisnite gumb Start.
Po tem morate odpreti brskalnik in vnesti naslednjo vrstico:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Kjer je XXXXXXXXXXXXXXXXXX žeton vašega bota.
Odprla se bo podobna stran:
Na njej najdemo naslednje besedilo:
"klepet":{"id":631290,
Imamo torej vse potrebne informacije za pisanje skript za Mikrotik, in sicer:
Botov žeton: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID klepeta, kamor naj napiše: 631290
Za preverjanje lahko gremo skozi brskalnik:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Moral bi dobiti rezultat:
Za naše udobje bomo takoj dodali ukaze za bota:
Iskanje računa z imenom @botfather
Nato mu napišemo ukaz / setcommands
- Vprašal bo, kateri bot
Pišemo:
@MikrotikROuter_bot
Dodajte ukaze:
- helloworld< — Preskusno sporočilo v klepetu 1
- njegovo delovanje-testno sporočilo na klepetu 2
- wolmypc-zbudi moj računalnik
Zdaj, če v klepet vnesete "/", bi morali dobiti:
Zdaj pa preidimo na MikroTik.
RouterOS ima konzolni pripomoček za kopiranje datotek prek ftp ali http / https, pripomoček se imenuje fetch, kar bomo uporabili.
Odpri terminal in vnesite:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Upoštevajte, da MikroTik potrebuje "» ubežati znaku «?' v URL-ju.
Moral bi dobiti rezultat:
Zdaj pa preidimo na skripte:
Pozdravljen, svet
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}
deluje
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"
Ne pozabite navesti pravilnega imena mac in vmesnika ter žetona bota in chat_id.
Zdaj bom malo razložil, kaj počnejo:
Skript "helloworld" pošlje sporočilo: "Hello, world!" na naš klepet z botom.
Skript "itsworking" pošlje sporočilo: "Test OK, it's Working!" na naš klepet z botom.
Ti skripti so v predstavitvene namene.
Kot eno izmed možnih implementacij sem dodal skript "wolmypc".
Po izvedbi skripta bo bot v klepet napisal »wol OK«.
Pravzaprav lahko zaženete popolnoma kateri koli skript.
Ustvari nalogo:
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
Berljiv pogledni jasno zakaj, vendar iz delovnega skripta ne razkrije globalnih podatkov, skript je dodan ob zagonu sistema.
Zagon Telegrama
: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;
}
Kako to deluje
Prenesite naša sporočila »getUpdates« vsakih 30 sekund, nato jih razčlenite, da ugotovite update_id (številka sporočila) in besedilo (naše ekipe) in chat_id . GetUpdates privzeto prikaže od 1 do 100 sporočil, zaradi udobja po branju ukaza izbrišemo sporočilo. Telegram api pravi, da za branje sporočila potrebujete številko sporočila + 1
/getUpdates?offset=update_id + 1
Vse testirano na Mikrotik rb915 RouterOS 6.37.1
Če pošljete več ukazov hkrati, bodo vsi izvedeni po vrsti v intervalu 30 sekund.
PS Najlepša hvala Kirilu Kazakovu za idejo in mojemu prijatelju Aleksandru za pomoč pri scenarijih.
reference
posodobitev:
03:11:16
Izboljšani skripti:
Dodano preverjanje za chat_id
Preverjanje za bedaka, če nekdo piše našemu botu, mu bo odgovoril: "Ne morem govoriti s tabo. “, nam bo podobno odgovoril, če ukaza ne prepozna.
Po izvedbi ukaza se bot odjavi od klepeta (glejte skript wolmypc)
DUP
Najdeno z
UPD 08.12.2016/XNUMX/XNUMX
v Telegramu so očitno nekoliko spremenili "izpuh" getUpdate. zdaj morate v glavnem skriptu popraviti odmik sporočila z 2 na 1
Spremembe
:local message [:pick $content ($startLoc + 2) $endLoc] ;
заменить на :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Vir: www.habr.com