Telegram-дан Mikrotik сценарийлерін қашықтан белсендіру

Мені осы іске асыруға Александр Корюкин итермеледі GeXoGeN оның басылымыменМикротик көмегімен компьютерді қашықтан тегін, SMSсіз және бұлтсыз қосу«.

ВК топтарының біріндегі Кирилл Казаковтың пікірі:

Иә, бұл мүлдем қауіпсіз емес. Менің тіркелгімнен белсендіру пәрмендерін ғана қабылдайтын телеграмма бот жазғанды ​​жөн көремін.

Мен осындай бот жазуды шештім.

Сонымен, ең алдымен телеграмда бот жасау керек.

  • Іздеуде @botfather атты аккаунтты табамыз
  • Экранның төменгі жағындағы «Бастау» түймесін басыңыз
  • Содан кейін біз оған команда / newbot жазамыз

Содан кейін біз екі қарапайым сұраққа жауап береміз:

  • Бірінші сұрақ - жасалатын боттың аты. MyMikrotikROuter
  • Екінші сұрақ - жасалып жатқан боттың лақап аты (ботпен аяқталуы керек) MikrotikROuter_bot

Жауап ретінде біз боттың белгісін аламыз, менің жағдайда бұл:

HTTP API интерфейсіне кіру үшін мына таңбалауышты пайдаланыңыз: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Telegram-дан Mikrotik сценарийлерін қашықтан белсендіру
Содан кейін іздеуде біздің ботты аты бойынша табу керек @MikrotikROuter_bot және Бастау түймесін басыңыз.

Осыдан кейін сіз браузерді ашып, келесі жолды енгізуіңіз керек:

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

Мұнда XXXXXXXXXXXXXXXXXX - сіздің роботыңыздың белгісі.

Келесіге ұқсас бет ашылады:

Telegram-дан Mikrotik сценарийлерін қашықтан белсендіру

Біз одан келесі мәтінді табамыз:

"chat":{"id":631290,

Сонымен, бізде Mikrotik үшін сценарий жазу үшін барлық қажетті ақпарат бар, атап айтқанда:

Бот белгісі: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Чат идентификаторы қайда жазуы керек: 631290

Тексеру үшін браузер арқылы өтуге болады:

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

Нәтиже алу керек:

Telegram-дан Mikrotik сценарийлерін қашықтан белсендіру

Ыңғайлы болу үшін біз бірден ботқа командаларды қосамыз:

Аты бар есептік жазбаны табу @botfather
Содан кейін біз оған команда жазамыз / setcommands

  • Ол қай роботты сұрайды

Біз жазамыз:
@MikrotikROuter_bot

Пәрмендерді қосу:

  • helloworld< — Чаттағы сынақ хабарламасы 1
  • оның жұмысы-чаттағы сынақ хабарламасы 2
  • wolmypc-менің компьютерімді ояту

Енді чатта «/» деп терсеңіз, мынаны алуыңыз керек:

Telegram-дан Mikrotik сценарийлерін қашықтан белсендіру

Енді MikroTik-ке көшейік.

RouterOS-те файлдарды ftp немесе http / https арқылы көшіруге арналған консольдік утилита бар, утилита fetch деп аталады, біз оны қолданамыз.

Біз ашамыз Терминал және енгізіңіз:

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

МикроТик қажет екенін ескеріңіз »» белгісінен құтылу үшін?' URL мекенжайында.

Нәтиже алу керек:

Telegram-дан Mikrotik сценарийлерін қашықтан белсендіру

Енді сценарийлерге көшейік:

Сәлем Әлем

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}

оның жұмыс істеуі

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"

Дұрыс Mac және интерфейс атауын, сондай-ақ bot-token және chat_id көрсетуді ұмытпаңыз.

Енді мен олардың не істейтінін аздап түсіндіремін:

«Helloworld» сценарийі «Сәлем, әлем!» хабарын жібереді. біздің ботпен сөйлесуімізге.
"Оның жұмыс істейтін" сценарийі хабарлама жібереді: "Тест Жарайды, ол жұмыс істейді!" біздің ботпен сөйлесуімізге.
Бұл сценарийлер демонстрациялық мақсаттарға арналған.
Мен ықтимал енгізулердің бірі ретінде «wolmypc» сценарийін қостым.
Сценарий орындалғаннан кейін бот чатқа «wol OK» деп жазады.
Шын мәнінде, сіз кез келген сценарийді іске қоса аласыз.

Тапсырма құру:

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

Оқуға болатын көрініснеге екені белгісіз, бірақ жұмыс сценарийінен ол жаһандық деректерді ашпайды, жүйе жүктелген кезде сценарий қосылды.
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; 
} 

Бұл қалай жұмыс істейді

Әр 30 секунд сайын «getUpdates» хабарларымызды жүктеп алыңыз, содан кейін білу үшін талдау жасаңыз update_id (хабарлама нөмірі) және мәтін (біздің командалар) және chat_id . Әдепкі бойынша getUpdates 1-ден 100-ге дейін хабарды көрсетеді, ыңғайлы болу үшін пәрменді оқығаннан кейін хабарды жоямыз. Telegram api хабарламаны оқу үшін сізге + 1 хабарлама нөмірі қажет дейді

/getUpdates?offset=update_id + 1

Барлығы Mikrotik rb915 RouterOS 6.37.1 жүйесінде сыналған
Егер сіз бірден көптеген командаларды жіберсеңіз, олардың барлығы 30 секунд аралықпен кезекпен орындалады.

PS Идея үшін Кирилл Казаковқа және сценарийге көмектескен досым Александрға үлкен рахмет.

сілтемелер

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: Сценарий жазу

жаңарту:

03:11:16

Жақсартылған сценарийлер:

chat_id үшін тексеру қосылды
Ақымақты тексеріп, егер біреу біздің ботқа жазса, ол оған жауап береді: «Мен сенімен сөйлесе алмаймын. «, егер ол пәрменді танымаса, бізге де жауап береді.
Пәрменді орындағаннан кейін бот чатқа жазылудан бас тартады (wolmypc сценарийін қараңыз)

UPD

-мен табылды 7 Каскадёр7 ~14 хабардан жоғары файлды табу пәрмені бұдан былай өңделмейді (Mikrotik шектеулері). Сондықтан, болашақта сценарийді lua деп өзгертемін, рахмет 7 Каскадёр7 бұл үшін мен Луа туралы білмедім.

UPD 08.12.2016/XNUMX/XNUMX

Telegram-да олар getUpdate «шығуын» аздап өзгерткен сияқты. енді негізгі сценарийде хабарламаның ығысуын 2-ден 1-ге дейін түзету керек

өзгерту

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

заменить на :

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

Ақпарат көзі: www.habr.com