Далечинско активирање на Mikrotik скрипти од Telegram

Александар Корјукин ме турна на оваа имплементација GeXoGeN со неговото објавувањеДалечинско вклучување на компјутерот бесплатно, без СМС и без облаци, користејќи Mikrotik".

И коментар во една од VK групите на Кирил Казаков:

Да, воопшто не е безбедно. Повеќе би сакал да напишам бот за телеграма што прифаќа само команди за активирање од мојот профил.

Решив да напишам таков бот.

Значи, првото нешто што треба да направите е да креирате бот во телеграма.

  • Во пребарувањето наоѓаме сметка со име @botfather
  • Кликнете на копчето Start на дното на екранот
  • Потоа му ја пишуваме командата / newbot

Потоа одговараме на 2 едноставни прашања:

  • Првото прашање е името на ботот што треба да се креира. MyMikrotikROuter
  • Второто прашање е прекарот на ботот што се создава (треба да завршува со бот) MikrotikROuter_bot

Како одговор, ќе го добиеме токенот на нашиот бот, во мојот случај тоа е:

Користете го овој токен за пристап до HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

Далечинско активирање на Mikrotik скрипти од Telegram
Потоа, треба да го пронајдете нашиот бот во пребарувањето по име @MikrotikROuter_bot и притиснете го копчето Start.

После тоа, треба да го отворите прелистувачот и да ја внесете следната линија:

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

Каде што XXXXXXXXXXXXXXXXXX е токенот на вашиот бот.

Ќе се отвори страница слична на следната:

Далечинско активирање на Mikrotik скрипти од Telegram

На него го наоѓаме следниот текст:

"chat":{"id":631290,

Значи, ги имаме сите потребни информации за пишување скрипти за Микротик, имено:

Бот токен: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ИД за разговор каде треба да напише: 631290

За да провериме, можеме да одиме низ прелистувачот:

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

Треба да го добиете резултатот:

Далечинско активирање на Mikrotik скрипти од Telegram

За наша погодност, веднаш ќе додадеме команди за ботот:

Наоѓање сметка со име @botfather
Потоа му пишуваме команда / setcommands

  • Ќе праша кој бот

Ние пишуваме:
@MikrotikROuter_bot

Додадете команди:

  • helloworld< — Тест порака на разговор 1
  • работи-тест порака на разговор 2
  • wolmypc-разбуди го мојот компјутер

Сега, ако напишете „/“ во разговорот, треба да добиете:

Далечинско активирање на 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 и интерфејс, како и бот-токен и 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

Приказ за читањене е јасно зошто, но од работната скрипта не открива глобални податоци, додаде скриптата кога системот ќе се подигне.
Стартување на телеграма

: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") ;

Телеграма

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

ДУП

Пронајден со 7 Каскадер7 дека датотеката со над ~ 14 пораки повеќе не се обработува со командата за наоѓање (ограничувања на Mikrotik). Затоа, во иднина ќе го сменам сценариото во луа, благодарам 7 Каскадер7 за ова не знаев за луа.

ОПД 08.12.2016

во Telegram, очигледно, тие малку го сменија „издувот“ на getUpdate. сега во главната скрипта треба да го поправите поместувањето на пораката од 2 на 1

промени

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

заменить на :

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

Извор: www.habr.com