Mikrotik skriptu attālināta aktivizēšana no Telegram

Aleksandrs Korjukins mani pamudināja uz šo ieviešanu GeXoGeN ar savu publikācijuDatora attālināta ieslēgšana bez maksas, bez SMS un bez mākoņiem, izmantojot Mikrotik".

Un Kirila Kazakova komentārs vienā no VK grupām:

Jā, tas nemaz nav droši. Es drīzāk rakstītu telegrammas robotu, kas pieņem tikai aktivizēšanas komandas no mana konta.

Es nolēmu uzrakstīt šādu botu.

Tātad, pirmā lieta, kas jādara, ir izveidot botu telegrammā.

  • Meklēšanā mēs atrodam kontu ar nosaukumu @botfather
  • Noklikšķiniet uz pogas Sākt ekrāna apakšā
  • Tad mēs rakstām viņam komandu / newbot

Tad mēs atbildam uz 2 vienkāršiem jautājumiem:

  • Pirmais jautājums ir izveidojamās robotprogrammatūras nosaukums. MyMikrotikROuter
  • Otrais jautājums ir izveidotā robota segvārds (jābeidzas ar bot) MikrotikROuter_bot

Atbildot uz to, mēs saņemsim mūsu robota marķieri, manā gadījumā tas ir:

Izmantojiet šo pilnvaru, lai piekļūtu HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Mikrotik skriptu attālināta aktivizēšana no Telegram
Pēc tam meklēšanā pēc nosaukuma ir jāatrod mūsu robots @MikrotikROuter_bot un nospiediet pogu Sākt.

Pēc tam jums ir jāatver pārlūkprogramma un jāievada šāda rindiņa:

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

Kur XXXXXXXXXXXXXXXXXXXXX ir jūsu robota marķieris.

Tiks atvērta lapa, kas ir līdzīga šim:

Mikrotik skriptu attālināta aktivizēšana no Telegram

Uz tā atrodam šādu tekstu:

"čats":{"id":631290,

Tātad, mums ir visa nepieciešamā informācija Mikrotik skriptu rakstīšanai, proti:

Bota marķieris: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Tērzēšanas ID, kurā viņam būtu jāraksta: 631290

Lai pārbaudītu, mēs varam doties caur pārlūkprogrammu:

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

Jāiegūst rezultāts:

Mikrotik skriptu attālināta aktivizēšana no Telegram

Ērtības labad mēs nekavējoties pievienosim botam komandas:

Konta atrašana ar vārdu @bottēvs
Tad mēs uzrakstām viņam komandu / setcommands

  • Viņš jautās, kura bota

Mēs rakstām:
@MikrotikROuter_bot

Pievienojiet komandas:

  • helloworld< — testa ziņojums 1. tērzēšanā
  • itsworking-Test Message tērzēšanā 2
  • wolmypc-pamodiniet manu datoru

Tagad, ja tērzēšanā ierakstāt "/", jums vajadzētu iegūt:

Mikrotik skriptu attālināta aktivizēšana no Telegram

Tagad pāriesim pie MikroTik.

RouterOS ir konsoles utilīta failu kopēšanai, izmantojot ftp vai http / https, utilītu sauc fetch, ko mēs izmantosim.

Atvērt termināls un ievadiet:

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

Lūdzu, ņemiet vērā, ka MikroTik ir nepieciešams "» izvairīties no zīmes «?' URL.

Jāiegūst rezultāts:

Mikrotik skriptu attālināta aktivizēšana no Telegram

Tagad pāriesim pie skriptiem:

Sveika pasaule

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}

tas darbojas

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"

Neaizmirstiet norādīt pareizo Mac un interfeisa nosaukumu, kā arī bot-token un chat_id.

Tagad es nedaudz paskaidrošu, ko viņi dara:

Skripts "helloworld" nosūta ziņojumu: "Sveika, pasaule!" uz mūsu tērzēšanu ar robotu.
Skripts "itsworking" nosūta ziņojumu: "Test OK, it's Working!" uz mūsu tērzēšanu ar robotu.
Šie skripti ir paredzēti demonstrācijas nolūkiem.
Es pievienoju "wolmypc" skriptu kā vienu no iespējamajām implementācijām.
Pēc skripta izpildes robots tērzēšanā ierakstīs “wol OK”.
Patiesībā jūs varat palaist pilnīgi jebkuru skriptu.

Izveidojiet uzdevumu:

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

Lasāms skatsnav skaidrs, kāpēc, bet no darba skripta tas neatklāj globālos datus, pievienoja skriptu, kad sistēma sāks darboties.
Telegram palaišana

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

Kā tas darbojas

Lejupielādējiet mūsu “getUpdates” ziņojumus ik pēc 30 sekundēm, pēc tam parsējiet, lai uzzinātu update_id (ziņas numurs) un teksts (mūsu komandas) un tērzēšanas_id . Pēc noklusējuma getUpdates parāda no 1 līdz 100 ziņojumiem, ērtības labad pēc komandas izlasīšanas mēs izdzēšam ziņojumu. Telegram api saka, ka, lai lasītu ziņojumu, jums ir nepieciešams ziņojuma numurs + 1

/getUpdates?offset=update_id + 1

Viss pārbaudīts uz Mikrotik rb915 RouterOS 6.37.1
Ja nosūtāt vairākas komandas vienlaikus, tās visas tiks izpildītas pēc kārtas ar 30 sekunžu intervālu.

PS Liels paldies Kirilam Kazakovam par ideju un manam draugam Aleksandram par palīdzību scenāriju izstrādē.

atsauces

habrahabr.ru/post/313794
1spla.ru/index.php/blog/telegram_bot_for_mikrotik
core.telegram.org/bots/api
wiki.mikrotik.com/wiki/Manual: Skriptu veidošana

upd:

03:11:16

Uzlaboti skripti:

Pievienota chat_id pārbaude
Pārbaudot, vai nav muļķis, ja kāds rakstīs mūsu botam, viņš viņam atbildēs: "Es nevaru ar tevi runāt. “, atbildēs mums līdzīgi, ja neatzīs komandu.
Pēc komandas izpildes robots atceļ tērzēšanas abonēšanu (skatiet wolmypc skriptu)

DUP

Atrasts ar 7Kaskadieris7 ka fails ar virs ~14 ziņojumiem vairs netiek apstrādāts ar komandu find (Mikrotik ierobežojumi). Tāpēc turpmāk nomainīšu skriptu uz lua, paldies 7Kaskadieris7 par to es nezināju par lua.

UPD 08.12.2016

Telegram, acīmredzot, viņi nedaudz mainīja getUpdate "izplūdi". tagad galvenajā skriptā jums ir jālabo ziņojuma nobīde no 2 uz 1

izmaiņas

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

заменить на :

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

Avots: www.habr.com

Iegādājieties uzticamu mitināšanu vietnēm ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa vietņu mitināšanu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster