Aleksandrs Korjukins mani pamudināja uz šo ieviešanu ar savu publikāciju".
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

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:

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:

Ē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:

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:

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