Mikrotik սկրիպտների հեռակառավարման ակտիվացում Telegram-ից

Ալեքսանդր Կորյուկինն ինձ մղեց այս իրականացմանը GeXoGeN իր հրապարակմամբՀամակարգչի հեռահար միացումն անվճար, առանց SMS-ի և առանց ամպերի, Mikrotik-ի միջոցով»:

Եվ Կիրիլ Կազակովի մեկնաբանություն VK խմբերից մեկում.

Այո, դա բոլորովին ապահով չէ: Ես կգերադասեի գրել հեռագրային բոտ, որը ընդունում է միայն իմ հաշվից ակտիվացման հրամանները։

Որոշեցի այսպիսի բոտ գրել։

Այսպիսով, առաջին բանը, որ պետք է անել, Telegram-ում բոտ ստեղծելն է:

  • Որոնման մեջ մենք գտնում ենք @botfather անունով հաշիվ
  • Կտտացրեք «Սկսել» կոճակը էկրանի ներքևում
  • Այնուհետև մենք նրան գրում ենք հրամանը / newbot

Այնուհետև մենք պատասխանում ենք 2 պարզ հարցի.

  • Առաջին հարցը ստեղծվելիք բոտի անունն է։ MyMikrotikROuter
  • Երկրորդ հարցը ստեղծվող բոտի մականունն է (պետք է ավարտվի բոտով) MikrotikROuter_bot

Ի պատասխան՝ մենք կստանանք մեր բոտի նշանը, իմ դեպքում դա հետևյալն է.

Օգտագործեք այս նշանը՝ HTTP API-ին մուտք գործելու համար. 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Mikrotik սկրիպտների հեռակառավարման ակտիվացում Telegram-ից
Այնուհետև, դուք պետք է փնտրեք մեր բոտը անունով @MikrotikROuter_bot և սեղմեք «Սկսել» կոճակը:

Դրանից հետո դուք պետք է բացեք զննարկիչը և մուտքագրեք հետևյալ տողը.

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

Որտեղ XXXXXXXXXXXXXXXXXX-ը ձեր բոտի նշանն է:

Կբացվի հետևյալի նման էջ.

Mikrotik սկրիպտների հեռակառավարման ակտիվացում Telegram-ից

Դրա վրա մենք գտնում ենք հետևյալ տեքստը.

"chat":{"id":631290,

Այսպիսով, մենք ունենք բոլոր անհրաժեշտ տեղեկությունները Mikrotik-ի համար սցենարներ գրելու համար, մասնավորապես.

Բոտի նշան. 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Chat ID-ն, որտեղ նա պետք է գրի. 631290

Ստուգելու համար մենք կարող ենք անցնել բրաուզերի միջոցով.

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

Արդյունքը պետք է ստանա.

Mikrotik սկրիպտների հեռակառավարման ակտիվացում Telegram-ից

Մեր հարմարության համար մենք անմիջապես կավելացնենք հրամաններ բոտի համար.

Անունով հաշիվ գտնելը @botfather
Այնուհետև մենք նրան հրաման ենք գրում / setcommands

  • Նա կհարցնի, թե որ բոտը

Մենք գրում ենք:
@MikrotikROuter_bot

Ավելացնել հրամաններ.

  • helloworld< — Փորձնական հաղորդագրություն չաթում 1
  • իր աշխատանքային-Թեստային հաղորդագրություն չաթում 2
  • wolmypc-wake up my PC

Այժմ, եթե չաթում մուտքագրեք «/», դուք պետք է ստանաք.

Mikrotik սկրիպտների հեռակառավարման ակտիվացում 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

Խնդրում ենք նկատի ունենալ, որ MikroTik-ին անհրաժեշտ է ««փախչել նշանից»?URL-ում:

Արդյունքը պետք է ստանա.

Mikrotik սկրիպտների հեռակառավարման ակտիվացում Telegram-ից

Հիմա եկեք անցնենք սցենարներին.

Բարեւ աշխարհ

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-ի և ինտերֆեյսի ճիշտ անունը, ինչպես նաև բոտ-token-ը և chat_id-ը:

Հիմա մի փոքր կբացատրեմ, թե ինչ են անում.

«Helloworld» սցենարը հաղորդագրություն է ուղարկում. «Բարև, աշխարհ»: բոտի հետ մեր զրույցին:
«itsworking» սկրիպտը հաղորդագրություն է ուղարկում. «Test OK, it's Working»: բոտի հետ մեր զրույցին:
Այս սցենարները ցուցադրական նպատակներով են:
Որպես հնարավոր իրագործումներից մեկը ավելացրի «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; 
} 

Ինչպես է այն աշխատում

Ներբեռնեք մեր «getUpdates» հաղորդագրությունները յուրաքանչյուր 30 վայրկյանը մեկ, այնուհետև վերլուծեք՝ պարզելու համար update_id (հաղորդագրության համարը) և տեքստ (մեր թիմերը) և chat_id . Լռելյայնորեն, getUpdates-ը ցուցադրում է 1-ից 100 հաղորդագրություն, հարմարության համար հրամանը կարդալուց հետո մենք ջնջում ենք հաղորդագրությունը։ Telegram api-ն ասում է, որ հաղորդագրություն կարդալու համար անհրաժեշտ է հաղորդագրության համարը + 1

/getUpdates?offset=update_id + 1

Բոլորը փորձարկված են Mikrotik rb915 RouterOS 6.37.1-ի վրա
Եթե ​​դուք միանգամից բազմաթիվ հրամաններ ուղարկեք, դրանք բոլորը կկատարվեն հերթով 30 վայրկյան ընդմիջումով:

Հ.Գ.Շատ շնորհակալ եմ Կիրիլ Կազակովին գաղափարի համար և ընկեր Ալեքսանդրին` սցենարների հարցում օգնության համար:

Սայլակ

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 script)

DUP

Գտնվել է 7 Կասկադյոր7 որ ~14-ից բարձր հաղորդագրություններով ֆայլն այլևս չի մշակվում Find հրամանով (Mikrotik սահմանափակումներ): Հետևաբար, հետագայում սցենարը կփոխեմ լուայի, շնորհակալություն 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] ;

Source: www.habr.com