Telegram-dan Mikrotik skriptlərinin uzaqdan aktivləşdirilməsi

Alexander Koryukin məni bu həyata keçirməyə sövq etdi GeXoGeN nəşri iləMikrotikdən istifadə edərək, kompüteri pulsuz, SMS və bulud olmadan uzaqdan yandırmaq".

Kirill Kazakovun VK qruplarından birində şərhi:

Bəli, heç də təhlükəsiz deyil. Hesabımdan yalnız aktivləşdirmə əmrlərini qəbul edən teleqram botu yazmağı üstün tuturam.

Belə bir bot yazmağa qərar verdim.

Beləliklə, ediləcək ilk şey teleqramda bir bot yaratmaqdır.

  • Axtarışda @botfather adlı bir hesab tapırıq
  • Ekranın altındakı Başlat düyməsini basın
  • Sonra ona əmr / newbot yazırıq

Sonra 2 sadə suala cavab veririk:

  • İlk sual yaradılacaq botun adıdır. MyMikrotikROuter
  • İkinci sual yaradılan botun ləqəbidir (botla bitməlidir) MikrotikROuter_bot

Cavab olaraq, botumuzun nişanını alacağıq, mənim vəziyyətimdə bu:

HTTP API-yə daxil olmaq üçün bu nişanı istifadə edin: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Telegram-dan Mikrotik skriptlərinin uzaqdan aktivləşdirilməsi
Sonra axtarışda bizim botu adla tapmalısınız @MikrotikROuter_bot və Start düyməsini basın.

Bundan sonra brauzeri açmalı və aşağıdakı sətri daxil etməlisiniz:

 https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates

XXXXXXXXXXXXXXXXXX botunuzun işarəsidir.

Aşağıdakı kimi bir səhifə açılacaq:

Telegram-dan Mikrotik skriptlərinin uzaqdan aktivləşdirilməsi

Onun üzərində 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:

Bot nişanı: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Çat ID-si harada yazmalıdır: 631290

Yoxlamaq üçün brauzerdən keçə bilərik:

https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test

Nəticə əldə edilməlidir:

Telegram-dan Mikrotik skriptlərinin uzaqdan aktivləşdirilməsi

Rahatlığımız üçün dərhal bot üçün əmrlər əlavə edəcəyik:

Adı olan hesab tapılır @botfather
Sonra ona əmr yazırıq / setcommands

  • Hansı botu soruşacaq

Biz yazırıq:
@MikrotikROuter_bot

Əmrlər əlavə edin:

  • helloworld< — Söhbət 1-də sınaq mesajı
  • itsworking-Söhbətdə Test Mesajı 2
  • wolmypc-kompüterimi oyat

İndi söhbətə "/" yazsanız, əldə etməlisiniz:

Telegram-dan Mikrotik skriptlərinin uzaqdan aktivləşdirilməsi

İndi MikroTik-ə keçək.

RouterOS-da ftp və ya http / https vasitəsilə faylların surətini çıxarmaq üçün konsol yardım proqramı var, yardım proqramı fetch adlanır, biz istifadə edəcəyik.

Açın terminal və daxil edin:

/tool fetch url="https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test " keep-result=no

Nəzərə alın ki, MikroTik lazımdır "» işarəsindən qaçmaq üçün «?' URL-də.

Nəticə əldə edilməlidir:

Telegram-dan Mikrotik skriptlərinin uzaqdan aktivləşdirilməsi

İndi skriptlərə keçək:

helloorld

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}

işləyir

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"

Düzgün mac və interfeys adını, həmçinin bot-token və chat_id-i göstərməyi unutmayın.

İndi nə etdiklərini bir az izah edəcəyəm:

"Helloworld" skripti mesaj göndərir: "Salam, dünya!" botla söhbətimizə.
"İşləyir" skripti mesaj göndərir: "Test OK, işləyir!" botla söhbətimizə.
Bu skriptlər nümayiş məqsədi daşıyır.
Mən mümkün tətbiqlərdən biri kimi "wolmypc" skriptini əlavə etdim.
Skript icra edildikdən sonra bot söhbətə “wol OK” yazacaq.
Əslində, siz tamamilə hər hansı bir skripti işlədə bilərsiniz.

Tapşırıq yaradın:

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ə aydın deyil, lakin işləyən skriptdən qlobal məlumatları açıqlamır, sistem açıldıqda skripti əlavə etdi.
Telegramın işə salınması

: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") ;

Teleqram

: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ı endirin, sonra öyrənmək üçün təhlil edin update_id (mesaj nömrəsi) və mətn (komandalarımız) və chat_id . Varsayılan olaraq, getUpdates 1-dən 100-ə qədər mesaj göstərir, rahatlıq üçün əmri oxuduqdan sonra mesajı silirik. Telegram api deyir ki, mesajı oxumaq üçün mesaj nömrəsi + 1 lazımdır

/getUpdates?offset=update_id + 1

Hamısı Mikrotik rb915 RouterOS 6.37.1-də sınaqdan keçirilmişdir
Birdən çox əmr göndərsəniz, hamısı 30 saniyəlik fasilə ilə növbə ilə yerinə yetiriləcəkdir.

P.S. İdeyaya görə Kirill Kazakova və ssenarilərdə köməyə görə dostum Aleksandra çox təşəkkür edirəm.

References

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: Skript yazmaq

yeniləmə:

03:11:16

Təkmilləşdirilmiş skriptlər:

chat_id üçün yoxlama əlavə edildi
Bir axmağı yoxlayıram, kimsə bizim botumuza yazsa, ona cavab verəcək: “Mən sizinlə danışa bilmərəm. ", əmri tanımazsa, eyni şəkildə bizə cavab verəcəkdir.
Əmri yerinə yetirdikdən sonra bot söhbətə abunəni ləğv edir (wolmypc skriptinə baxın)

DUP

ilə tapıldı 7 Kaskadyor7 ~14 mesajdan yuxarı olan faylın tap əmri (Mikrotik məhdudiyyətləri) tərəfindən artıq işlənməməsi. Ona görə də gələcəkdə ssenarini lua ilə dəyişəcəm, təşəkkürlər 7 Kaskadyor7 Bunun üçün lua haqqında məlumatım yox idi.

UPD 08.12.2016/XNUMX/XNUMX

Telegram-da, görünür, getUpdate-in "işlənmiş" hissəsini bir az dəyişdirdilər. indi əsas skriptdə mesaj ofsetini 2-dən 1-ə qədər düzəltmək lazımdır

dəyişikliklər

:local message [:pick $content ($startLoc + 2) $endLoc] ;

заменить на :

:local message [:pick $content ($startLoc + 1) $endLoc] ;

Mənbə: www.habr.com