Մինչ այս իրականացմանը ինձ առաջ մղեց Ալեքսանդր Քորուկինը իր հրապարակմամբ ««.
Եվ մեկնաբանություն մեկի VK խմբում Կիրիլ Քազակովի՝
Այո, իսկապես ոչ անվտանգ է։ Ես ավելի լավ կլինեի գրեի տելեգրամ բոտ, որը միայն իմ հաշվի միջոցով ընդունում է սեղմման հրամաններ։
Ես որոշեցի գրել այդպիսի բոտ։
Եվ այնպես, առաջինը, որ պետք է անել՝ դա բոտ ստեղծել տելեգրալում։
- Փնտրում ենք @botfather անունով հաշիվը
- Արագ սկիզբը սեղմում ենք էկրանին ներքևի մասում
- Այնուհետև մենք գրում ենք նրան հրաման \/newbot
Այնունակ մենք պատասխանում ենք 2 ոչ բարդ հարցերին՝
- Առաջին հարցը՝ ստեղծվող բոտի անվանումը MyMikrotikROuter
- Երկրորդ հարցը՝ ստեղծվող բոտի նիկը (պետք է ավարտվի bot-ով)։ MikrotikROuter_bot
Պատասխանի մեջ կստանանք մեր բոտի այս ազտակը՝
Օգտագործեք այս ազտակը HTTP API-ին հասնելու համար՝ 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Այնուհետև, պետք է գտնել մեր բոտը անունով փնտրելով @MikrotikROuter_bot և սեղմել Start ճեպույթը։
Այնուհետև պետք է բացել մանրամասներ և գրել հետևյալ տողը՝
https://api.telegram.org/botXXXXXXXXXXXXXXXXXX/getUpdates
Որտեղ XXXXXXXXXXXXXXXXXX – ձեր բոտի ազտაკն է։
Բացվելու է էջ մոտավորապես հետևյալ տեսքով՝

Փնտրեք այնտեղ հետևյալ տեքստը՝
«chat»:{«id»:631290,
Եվ այնպես, մենք ունենք բոլոր անհրաժեշտ տեղեկությունները Mikrotik-ի համար սցենարներ գրելու համար, ինչպես հետևյալը՝
Բոտի ազտակը՝ 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4
Չատի ID, որտեղ նա պետք է գրի՝ 631290
Ստուգելու համար կարող ենք մտնել մանրամասներով՝
https://api.telegram.org/bot265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4/sendmessage?chat_id=631290&text=test
Պետք է ստանանք արդյունք՝

Մեր հարմարության համար, անմիջապես ավելացնում ենք հրամաններ բոտի համար՝
Փնտրում ենք հաշիվը անվան @botfather
Այնուհետև մենք գրում ենք նրան հրաման /setcommands
- Նա կհարցնի, թե ինչպես բոտի
Սcribահանում ենք՝
@MikrotikROuter_bot
Ավելացնում ենք հրամաններ՝
- helloworld< — Հեքիաթ հաղորդագրություն chat 1-ում
- itsworking — Հեքիաթ հաղորդագրություն chat 2-ում
- wolmypc — արթնացնել իմ համակարգիչը
Այժմ, եթե գրել «\/»՝ պետք է ստանանք՝

Այժմ անցնում ենք 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-ում էկրանավորելու համար։
Պետք է ստանանք արդյունք՝

Այժմ անցնում ենք սցենարներին՝
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. Իմ խորին շնորհակալությունները Կիրիլ Կազակովի՝ գաղափարի համար և իմ ընկեր Ալեքսանդրի՝ սկրիպտերի օգնության համար:
Հղումներ
:Scripting
upd:
03:11:16
Ամրագրել եմ սկրիպտները:
Ավելացրել եմ chat_id-ի ստուգում
Ստուգում հեռավոր ուղարկվածում, եթե ինչ-որ մեկը գրել է մեր կարծիքին, նա նրան պատասխանելու է՝ «I can't talk with you.», համանման պատասխանի կստանա, եթե հրամանը չճանաչվի:
Հրամանի կյանքի ընթացքում, bot-ը հաղորդակցվում է չաթում (տես Ռագիր wolmypc)
ՆԹԲ
Մենք գտանք որ պատկերը ավելի ~ 14 հաղորդագրությունից հետո, դադարեցնում է find հրամանի մշակումը (Mikrotik-ի սահմանափակում): Հետևաբար եկող մոտ ապագայում սկրիպտը կներկայացնեմ lua, շնորհակալություն այդ մասին, 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
