Məni bu həyata keçirməyə Alexander Koryukin sövq etdi öz nəşrində ««.
Və Kirill Kazakovun VK qrupundakı bir şərh:
Bəli, bu heç də təhlükəsiz deyil. Mən daha yaxşı bir Telegram botu yazardım, yalnız öz hesabımdan yandırma əmrlərini qəbul edən.
Mən belə bir bot yazmağa qərar verdim.
Beləliklə, ilk addım – Telegramda bot yaratmaqdır.
- Axtarışda @botfather adını tapırıq
- Ekranın alt tərəfindəki Start düyməsinə basırıq
- Sonra ona /newbot komandası yazırıq
Sonra iki sadə suala cavab veririk:
- Birinci sual – yaradılacaq botun adı MyMikrotikROuter
- İkinci sual – yaradılacaq botun təxəllüsü (bot ilə bitməlidir) MikrotikROuter_bot
Bunun cavabında botumuzun tokenini alacağıq, mənim halımda bu:
HTTP API-yə daxil olmaq üçün bu tokeni istifadə edin: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Sonra botumuzu adla axtarmalıyıq @MikrotikROuter_botvə Start düyməsinə basmalıyıq.
Bundan sonra brauzeri açıb aşağıdakı xətti daxil edirik:
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Burada XXXXXXXXXXXXXXXXXX – sizin botunuzun tokenidir.
Təxminən aşağıdakı kimi bir səhifə açılacaq:

Orada aşağıdakı mətni tapırıq:
«chat»: {«id»:631290,
Beləliklə, Mikrotik üçün skript yazmaq üçün bütün lazımi məlumatlara sahibik, yəni:
Botun tokeni: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Ona yazmalı olduğu chatın ID-si: 631290
Yoxlamaq üçün brauzer vasitəsilə girə bilərik:
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Nəticə almalıyıq:

Rahatlığımız üçün, bot üçün dərhal komandaları əlavə edək:
@MikrotikROuter_bot adını da tapaq @botfather
Sonra ona komanda yazırıq /setcommands
- O, hansı bot olduğunu soruşacaq
Yazırıq:
@MikrotikROuter_bot
Komandaları əlavə edirik:
- helloworld< — Chat 1 üçün test mesajı
- itsworking — Chat 2 üçün test mesajı
- wolmypc — Kompüterimi yandır
İndi əgər chatda «/» yazsaq, almalıyıq:

İndi MikroTik-ə keçiririk.
RouterOS-da ftp və ya http/https vasitəsilə faylları kopyalamaq üçün bir konsol aləti var, alətin adı fetch-dir, məhz ondan istifadə edəcəyik.
Açırıq terminal və daxil edirik:
/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no
Mikrotikdə «» işarəsinin «?»-nin URL-də ekranda saxlanması üçün lazımdır.
Nəticə almalıyıq:

İndi skriptlərə keçiririk:
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
/tool fetch url="https://api.telegram.org/boXXXXXXXXXXXXXXXXXXX?chat_id=631290&text=wol OK" keep-result=no"
Düzgün mac və interfeys adını, eləcə də bot-token və chat_id-ni göstərməyi unutmayaq.
İndi onlar nə etdiklərini azca izah edəcəyəm:
«helloworld» skripti bizə chatda "Hello, world!" mesajını göndərir.
«itsworking» skripti bizə chatda "Test OK, it's Working!" mesajını göndərir.
Bu skriptlər işin nümayişi üçündir.
«wolmypc» skriptini bir mümkün həyata keçirmə olaraq əlavə etdim.
Skripti icra etdikdə bot chatda "wol OK" mesajını göndərəcək.
Əslində istənilən skripti işə salmaq mümkündür.
Tapşırıq yaradırıq:
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
Oxunabilir görünüşNiyə bilmədim, amma işləmiş skriptdən qlobal məlumatları açıqlamır, sistemi yüklədikdə skripti əlavə etdim.
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=I can't talk with you. ") keep-result=no} ;
:tool fetch url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId") keep-result=no;
}
Bu necə işləyir
Hər 30 saniyədən bir "getUpdates" mesajlarımızı yükləyirik, sonra onu ayrıştırırıq ki, bilək update_id (mesaj nömrəsi) və text (bizim komandalar) və chat_id . Standart olaraq, getUpdates 1-dən 100-ə qədər mesajı çıxarır, rahatlıq üçün komandalar oxunduqdan sonra mesajı silirik. Telegram apisində yazıldığına görə, mesajı oxumaq üçün mesaj nömrəsi + 1 olmalıdır.
/getUpdates?offset=update_id + 1
Hamısı Mikrotik rb915 RouterOS 6.37.1-də sınanıb
Əgər çoxlu komandaları eyni anda göndərsəniz, hamısı 30 saniyəlik interval ilə sırayla icra ediləcək.
P.S. Fikri üçün Kirill Kazakov'a və skriptlərdəki köməyi üçün dostum Aleksandra çox sağ olun.
Bağlantılar
:Scripting
upd:
03:11:16
Skripti təkamül etdirdim:
chat_id üçün yoxlama əlavə etdim
Əgər kimsə bizim botumuza yazsa, o ona cavab verəcək: "I can’t talk with you." Eyni zamanda, tanımadığı komanda olsa, bizə də eyni cavabı verəcək.
Komanda yerinə yetiriləndə, bot çata cavab verir (bax: Wolmypc skripti)
UPD
Təxmin etdik ki, yuxarıda olan ~ 14 mesajlı fayl, find komandasını işlətməkdən dayanar (Mikrotik-in məhdudiyyətləri). Ona görə, gələcəkdə skripti lua ilə yenidən yazacağam, bunun üçün təşəkkür edirəm. lua haqqında bilmirdim.
UPD 08.12.2016
Telegram-da görünür ki, "getUpdate"-in çıxışı bir az dəyişib. İndi əsas skriptdə mesajın yerini 2-dən 1-ə düzəltmək lazımdır.
dəyişikliklər
:local message [:pick $content ($startLoc + 2) $endLoc] ;
bunu ilə əvəz edin:
:local message [:pick $content ($startLoc + 1) $endLoc] ;
Mənbə: habr.com
