Telegram vasitəsilə Mikrotik skriptlərinin uzaqdan işə salınması

Məni bu həyata keçirməyə Alexander Koryukin sövq etdi GeXoGeN öz nəşrində «Mikrotik vasitəsilə pulsuz, SMS və bulud olmadan komputeri uzaqdan yandırma«.

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

Telegram vasitəsilə Mikrotik skriptlərinin uzaqdan işə salınması
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:

Telegram vasitəsilə Mikrotik skriptlərinin uzaqdan işə salınması

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:

Telegram vasitəsilə Mikrotik skriptlərinin uzaqdan işə salınması

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:

Telegram vasitəsilə Mikrotik skriptlərinin uzaqdan işə salınması

İ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:

Telegram vasitəsilə Mikrotik skriptlərinin uzaqdan işə salınması

İ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

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: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 7Stuntman7 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. 7Stuntman7 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

DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər 🔥 DDoS qoruması olan saytlara etibarlı hosting satın alın, VPS VDS serverlər | ProHoster