Alexander Koryukin mendorong saya ke implementasi ini
Dan komentar di salah satu grup VK oleh Kirill Kazakov:
Ya, itu tidak aman sama sekali. Saya lebih suka menulis bot telegram yang hanya menerima perintah aktivasi dari akun saya.
Saya memutuskan untuk menulis bot seperti itu.
Jadi, hal pertama yang harus dilakukan adalah membuat bot di telegram.
- Kami menemukan dalam pencarian akun bernama @botfather
- Klik tombol Mulai di bagian bawah layar
- Lalu kami menulisnya perintah / newbot
Kemudian kami menjawab 2 pertanyaan sederhana:
- Pertanyaan pertama adalah nama bot yang akan dibuat. MyMikrotikROuter
- Pertanyaan kedua adalah nama panggilan bot yang dibuat (harus diakhiri dengan bot) MikrotikROuter_bot
Sebagai tanggapan, kami akan menerima token bot kami, dalam kasus saya ini adalah:
Gunakan token ini untuk mengakses API HTTP: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Kemudian, Anda perlu menemukan bot kami dalam pencarian berdasarkan nama @MikrotikROuter_bot dan tekan tombol Mulai.
Setelah itu, Anda perlu membuka browser dan memasukkan baris berikut:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Di mana XXXXXXXXXXXXXXXXX adalah token bot Anda.
Halaman yang mirip dengan berikut ini akan terbuka:
Kami menemukan teks berikut di atasnya:
"obrolan":{"id":631290,
Jadi, kami memiliki semua informasi yang diperlukan untuk menulis skrip di Mikrotik, yaitu:
Token bot: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
ID Obrolan di mana dia harus menulis: 631290
Untuk mengeceknya, kita bisa melalui browser:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Harus mendapatkan hasil:
Demi kenyamanan kami, kami akan segera menambahkan perintah untuk bot:
Menemukan akun dengan nama @botfather
Lalu kami menulis perintah untuknya / setcommands
- Dia akan menanyakan bot yang mana
Kami menulis:
@MikrotikROuter_bot
Tambahkan perintah:
- helloworld< β Tes pesan pada obrolan 1
- itsworking-Test Message on chat 2
- wolmypc-bangunkan PC saya
Sekarang jika Anda mengetik "/" di obrolan, Anda akan mendapatkan:
Sekarang mari beralih ke MikroTik.
RouterOS memiliki utilitas konsol untuk menyalin file melalui ftp atau http / https, utilitas tersebut disebut mengambil, yang akan kita gunakan.
Buka terminal dan masukkan:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Harap dicatat bahwa MikroTik membutuhkan "Β» untuk menghindari tanda Β«?' di URL.
Harus mendapatkan hasil:
Sekarang mari beralih ke skrip:
Halo 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}
bekerja
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 antarmuka yang benar, serta bot-token dan chat_id.
Sekarang saya akan menjelaskan sedikit apa yang mereka lakukan:
Skrip "helloworld" mengirim pesan: "Halo, dunia!" ke obrolan kami dengan bot.
Skrip "berfungsi" mengirim pesan: "Uji Oke, Berhasil!" ke obrolan kami dengan bot.
Skrip ini untuk tujuan demonstrasi.
Saya menambahkan skrip "wolmypc" sebagai salah satu implementasi yang memungkinkan.
Setelah eksekusi skrip, bot akan menulis "wol OK" ke obrolan.
Faktanya, Anda benar-benar dapat menjalankan skrip apa pun.
Buat tugas:
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
Tampilan yang Dapat Dibacatidak jelas mengapa, tetapi dari skrip yang berfungsi tidak mengungkapkan data global, menambahkan skrip saat sistem melakukan booting.
Peluncuran 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;
}
Bagaimana itu bekerja
Unduh pesan "getUpdates" kami setiap 30 detik, lalu uraikan untuk mencari tahu pembaruan_id (nomor pesan) dan teks (tim kami) dan obrolan_id . Secara default, getUpdates menampilkan dari 1 hingga 100 pesan, untuk kenyamanan, setelah membaca perintah, kami menghapus pesan tersebut. Telegram api mengatakan untuk membaca pesan Anda memerlukan nomor pesan +1
/getUpdates?offset=update_id + 1
Semua diuji pada Mikrotik rb915 RouterOS 6.37.1
Jika Anda mengirim banyak perintah sekaligus, semuanya akan dieksekusi secara bergantian dengan selang waktu 30 detik.
PS Terima kasih banyak kepada Kirill Kazakov atas idenya dan teman saya Alexander atas bantuan skripnya.
referensi
pembaruan:
03:11:16
Skrip yang ditingkatkan:
Menambahkan cek untuk chat_id
Memeriksa orang bodoh, jika seseorang menulis ke bot kami, dia akan menjawabnya: "Saya tidak dapat berbicara dengan Anda. β, juga akan menjawab kami jika tidak mengenali perintah.
Setelah menjalankan perintah, bot berhenti berlangganan obrolan (lihat skrip wolmypc)
DUP
Ditemukan dengan
UPD 08.12.2016/XNUMX/XNUMX
di Telegram, rupanya, mereka sedikit mengubah "knalpot" dari getUpdate. sekarang di skrip utama Anda perlu mengoreksi offset pesan dari 2 menjadi 1
perubahan
:local message [:pick $content ($startLoc + 2) $endLoc] ;
Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π½Π° :
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Sumber: www.habr.com