Telegramдан Mikrotik скрипттерин алыстан активдештирүү

Мени бул ишке Александр Корюкин түрттү GeXoGeN анын басмасы мененМикротикти колдонуу менен компьютерди алыстан, SMSсиз жана булутсуз күйгүзүү".

Кирилл Казаковдун ВК топторунун бириндеги комментарийи:

Ооба, бул такыр коопсуз эмес. Менин аккаунтумдан активдештирүү буйруктарын гана кабыл алган телеграмма ботун жазгым келет.

Мен ушундай бот жазууну чечтим.

Ошентип, биринчи нерсе - телеграммада бот түзүү.

  • Издөөдө @botfather аттуу аккаунтту табабыз
  • Экрандын ылдый жагындагы Start баскычын басыңыз
  • Андан кийин биз ага буйрук / newbot жазабыз

Анда биз 2 жөнөкөй суроого жооп беребиз:

  • Биринчи суроо түзүлө турган боттун аты. MyMikrotikROuter
  • Экинчи суроо - түзүлүп жаткан боттун лакап аты (бот менен аякташы керек) MikrotikROuter_bot

Жооп катары биз ботубуздун белгисин алабыз, менин учурда бул:

HTTP API кирүү үчүн бул белгини колдонуңуз: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Telegramдан Mikrotik скрипттерин алыстан активдештирүү
Андан кийин, сиз аты боюнча издөөдө биздин ботту табышыңыз керек @MikrotikROuter_bot жана Start баскычын басыңыз.

Андан кийин, сиз браузерди ачып, төмөнкү сапты киргизишиңиз керек:

 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 скрипттерин алыстан активдештирүү

Эми МикроТикке өтөбүз.

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

телеграмма

: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; 
} 

Бул кандай иштейт

Биздин "getUpdates" билдирүүлөрүбүздү 30 секунд сайын жүктөп алып, андан соң талдап көрүңүз 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:Scripting

жаңыртуу:

03:11:16

Жакшыртылган скрипттер:

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

DUP

менен табылган 7Какадёр7 ~14төн жогору билдирүүсү бар файл мындан ары табуу буйругу менен иштетилбей турганын (Mikrotik чектөөлөрү). Ошондуктан, келечекте сценарийди lua деп өзгөртөм, рахмат 7Какадёр7 бул үчүн, мен Луа жөнүндө билген эмес.

UPD 08.12.2016/XNUMX/XNUMX

Телеграмда, сыягы, алар getUpdate'тин "чыгышын" бир аз өзгөртүштү. азыр негизги скриптте сиз 2ден 1ге чейин билдирүүнү тууралашыңыз керек

өзгөрүүлөр

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

заменить на :

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

Source: www.habr.com