Telegram- ից Mikrotik- ի հեռակա սկրիպտների գործողություն

Մինչ այս իրականացմանը ինձ առաջ մղեց Ալեքսանդր Քորուկինը GeXoGeN իր հրապարակմամբ «Հեռավոր սեղմումը անվճար, առանց SMS-ի և առանց ամ CLOUD-ի, Mikrotik-ի միջոցով«.

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

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

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

Եվ այնպես, առաջինը, որ պետք է անել՝ դա բոտ ստեղծել տելեգրալում։

  • Փնտրում ենք @botfather անունով հաշիվը
  • Արագ սկիզբը սեղմում ենք էկրանին ներքևի մասում
  • Այնուհետև մենք գրում ենք նրան հրաման \/newbot

Այնունակ մենք պատասխանում ենք 2 ոչ բարդ հարցերին՝

  • Առաջին հարցը՝ ստեղծվող բոտի անվանումը MyMikrotikROuter
  • Երկրորդ հարցը՝ ստեղծվող բոտի նիկը (պետք է ավարտվի bot-ով)։ 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

Չատի ID, որտեղ նա պետք է գրի՝ 631290

Ստուգելու համար կարող ենք մտնել մանրամասներով՝

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

Պետք է ստանանք արդյունք՝

Telegram- ից Mikrotik- ի հեռակա սկրիպտների գործողություն

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

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

  • Նա կհարցնի, թե ինչպես բոտի

Սcribահանում ենք՝
@MikrotikROuter_bot

Ավելացնում ենք հրամաններ՝

  • helloworld< — Հեքիաթ հաղորդագրություն chat 1-ում
  • itsworking — Հեքիաթ հաղորդագրություն chat 2-ում
  • wolmypc — արթնացնել իմ համակարգիչը

Այժմ, եթե գրել «\/»՝ պետք է ստանանք՝

Telegram- ից Mikrotik- ի հեռակա սկրիպտների գործողություն

Այժմ անցնում ենք MikroTik-ին։

RouterOS-ում կա կոնսոլային ապարատ, որն օգտագործվում է ֆայլերը պատճենելու համար ftp կամ http\/https-ի միջոցով, այսինքն՝ fetch անունով էլեկտրոնային տիրույթ, որը մեզ պետք լինի։

Բացում ենք terminal և գրում ենք՝

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

Խնդրում ենք նկատի ունենալ, որ MikroTik-ում անհրաժեշտ է «» նիշը «?» URLs-ում էկրանավորելու համար։

Պետք է ստանանք արդյունք՝

Telegram- ից Mikrotik- ի հեռակա սկրիպտների գործողություն

Այժմ անցնում ենք սցենարներին՝

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
    n\/tool fetch url="https:\/\/api.telegram.org\/boXXXXXXXXXXXXXXXXXXX?chat_id=631290&text=wol OK" keep-result=no"

Չմոռանաք նշել ճիշտ mac և ինտերֆեյսի անունը, ինչպես և bot-token և chat_id-ի համար։

Այժմ մի քիչ բացատրեմ, թե ինչ են անում նրանք՝

«helloworld» սցենարը հաղորդում է՝ » Hello,world!» մեր բոտի հետ չատում։
«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-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 [ile get [ile find name=getUpdates] contents] ;
:global startLoc 0;
:global endLoc 0;

:if ( [ile get [ile 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 (հաղորդագրության թիվ) և text (մեր հրամանները) և chat_id . Արտաքին կարգով getUpdates-ն արժեք հաղորդագրությունների 1-100, удобство ի համար հետո հրամանների կարդալով, հաղորդագրությունը ենք ջնջում: Telegram API-ում ասվում է, որ հաղորդագրությունը կարդալու համար անհրաժեշտ են հաղորդագրության թիվ + 1

/getUpdates?offset=update_id + 1

Բոլորն ստուգվել են Mikrotik rb915 RouterOS 6.37.1-ի վրա
Եթե մուլտա հրամաններ ուղարկվեն, դրանք մեր հերթով կվերագործվեն 30 վայրկյան ուշացումով:

P.S. Իմ խորին շնորհակալությունները Կիրիլ Կազակովի՝ գաղափարի համար և իմ ընկեր Ալեքսանդրի՝ սկրիպտերի օգնության համար:

Հղումներ

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

Ամրագրել եմ սկրիպտները:

Ավելացրել եմ chat_id-ի ստուգում
Ստուգում հեռավոր ուղարկվածում, եթե ինչ-որ մեկը գրել է մեր կարծիքին, նա նրան պատասխանելու է՝ «I can't talk with you.», համանման պատասխանի կստանա, եթե հրամանը չճանաչվի:
Հրամանի կյանքի ընթացքում, bot-ը հաղորդակցվում է չաթում (տես Ռագիր wolmypc)

ՆԹԲ

Մենք գտանք 7Stuntman7 որ պատկերը ավելի ~ 14 հաղորդագրությունից հետո, դադարեցնում է find հրամանի մշակումը (Mikrotik-ի սահմանափակում): Հետևաբար եկող մոտ ապագայում սկրիպտը կներկայացնեմ lua, շնորհակալություն 7Stuntman7 այդ մասին, lua-ի մասին չէի իմանում:

UPD 08.12.2016

Telegram-ում երևի մի քիչ փոխել են «getUpdate» դուրս։ հիմա հիմնական սկրիպտում պետք է ուղղել տարածքերի 2-ից 1

փոփոխությունները

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

փոխարինել ՝

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

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster