Alexander Koryukin mendorong saya kepada pelaksanaan ini
Dan komen dalam salah satu kumpulan VK oleh Kirill Kazakov:
Ya, ia tidak selamat sama sekali. Saya lebih suka menulis bot telegram yang hanya menerima arahan pengaktifan daripada akaun saya.
Saya memutuskan untuk menulis bot sedemikian.
Jadi, perkara pertama yang perlu dilakukan ialah mencipta bot dalam telegram.
- Kami dapati dalam carian akaun bernama @botfather
- Klik pada butang Mula di bahagian bawah skrin
- Kemudian kami menulis arahan / newbot kepadanya
Kemudian kami menjawab 2 soalan mudah:
- Soalan pertama ialah nama bot yang akan dibuat. MyMikrotikROuter
- Soalan kedua ialah nama panggilan bot yang sedang dibuat (harus berakhir dengan bot) MikrotikROuter_bot
Sebagai tindak balas, kami akan menerima token bot kami, dalam kes saya ialah:
Gunakan token ini untuk mengakses API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Kemudian, anda perlu mencari bot kami dalam carian mengikut nama @MikrotikROuter_bot dan tekan butang Mula.
Selepas itu, anda perlu membuka penyemak imbas dan masukkan baris berikut:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Di mana XXXXXXXXXXXXXXXXXX ialah token bot anda.
Halaman yang serupa dengan yang berikut akan dibuka:
Kami dapati teks berikut di atasnya:
"sembang":{"id":631290,
Jadi, kami mempunyai semua maklumat yang diperlukan untuk menulis skrip untuk Mikrotik, iaitu:
Token bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID sembang di mana dia harus menulis: 631290
Untuk menyemak, kita boleh pergi melalui penyemak imbas:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Harus mendapat keputusan:
Untuk kemudahan kami, kami akan segera menambah arahan untuk bot:
Mencari akaun dengan nama @botfather
Kemudian kami menulis arahan kepadanya / set perintah
- Dia akan bertanya bot yang mana
Kami menulis:
@MikrotikROuter_bot
Tambah arahan:
- helloworld< β Uji mesej pada sembang 1
- itsworking-Test Mesej pada sembang 2
- wolmypc-bangun PC saya
Sekarang jika anda menaip "/" dalam sembang, anda sepatutnya mendapat:
Sekarang mari kita beralih kepada MikroTik.
RouterOS mempunyai utiliti konsol untuk menyalin fail melalui ftp atau http / https, utiliti itu dipanggil fetch, yang akan kami gunakan.
Buka terminal dan masukkan:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Sila ambil perhatian bahawa MikroTik memerlukan "Β»untuk melarikan diri dari tanda itu Β«?' dalam URL.
Harus mendapat keputusan:
Sekarang mari kita beralih kepada skrip:
Hai dunia
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}
ianya berkesan
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"
Jangan lupa untuk menentukan nama mac dan antara muka yang betul, serta bot-token dan chat_id.
Sekarang saya akan menerangkan sedikit apa yang mereka lakukan:
Skrip "helloworld" menghantar mesej: "Hello, world!" ke sembang kami dengan bot.
Skrip "berfungsi" menghantar mesej: "Uji OK, ia Berfungsi!" ke sembang kami dengan bot.
Skrip ini adalah untuk tujuan demonstrasi.
Saya menambah skrip "wolmypc" sebagai salah satu pelaksanaan yang mungkin.
Setelah melaksanakan skrip, bot akan menulis "wol OK" pada sembang.
Malah, anda boleh menjalankan apa-apa skrip sama sekali.
Buat tugasan:
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
Pandangan Boleh Dibacaia tidak jelas mengapa, tetapi daripada skrip yang berfungsi ia tidak mendedahkan data global, menambah skrip apabila sistem but.
Permulaan telegram
: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;
}
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Muat turun mesej "getUpdates" kami setiap 30 saat, kemudian hurai untuk mengetahuinya kemas kini_id (nombor mesej) dan teks (pasukan kami) dan chat_id . Secara lalai, getUpdates memaparkan dari 1 hingga 100 mesej, untuk kemudahan, selepas membaca arahan, kami memadamkan mesej itu. Telegram api mengatakan untuk membaca mesej anda memerlukan nombor mesej + 1
/getUpdates?offset=update_id + 1
Semua diuji pada Mikrotik rb915 RouterOS 6.37.1
Jika anda menghantar banyak arahan serentak, semuanya akan dilaksanakan secara bergilir-gilir dengan selang 30 saat.
PS Terima kasih banyak kepada Kirill Kazakov untuk idea dan rakan saya Alexander untuk bantuan dengan skrip.
rujukan
kemas kini:
03:11:16
Skrip yang dipertingkatkan:
Ditambah cek untuk chat_id
Memeriksa orang bodoh, jika seseorang menulis kepada bot kami, dia akan menjawabnya: "Saya tidak boleh bercakap dengan anda. β, akan sama menjawab kami jika ia tidak mengenali arahan itu.
Selepas melaksanakan arahan, bot berhenti melanggan sembang (lihat skrip wolmypc)
DUP
Ditemui dengan
UPD 08.12.2016/XNUMX/XNUMX
dalam Telegram, nampaknya, mereka mengubah sedikit "ekzos" getUpdate. kini dalam skrip utama anda perlu membetulkan offset mesej dari 2 kepada 1
perubahan
:local message [:pick $content ($startLoc + 2) $endLoc] ;
Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Sumber: www.habr.com