1
Ноя

Удалённое включение скриптов Mikrotik из Telegrem

На данную реализацию меня подтолкнул Кирилл GeXoGeN Казаков своей публикацией «Удалённое включение компьютера бесплатно, без SMS и без облаков, с помощью Mikrotik». А именно, вот эта его цитата:

Да уж, совсем не секьюрно. Я бы лучше написал телеграм бота, который принимает только с моего аккаунта команды на включение.

Я решил написать такого бота.

Итак, первое, что нужно сделать – это создать бота в telegram.

  • Находим в поиске аккаунт с именем @botfather
  • Нажимаем на кнопку Start в нижней части экрана
  • После чего пишем ему команду /newbot

Потом отвечаем на 2 несложных вопроса:

  • Первый вопрос – имя создаваемого бота MyMikrotikROuter
  • Второй вопрос – ник создаваемого бота (должен оканчиваться на bot) MikrotikROuter_bot

В ответ получим токен нашего бота, в моём случае это:

Use this token to access the HTTP API: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

image

Затем, нужно найти нашего бота в поиске по имени @MikrotikROuter_bot и нажать на кнопку Start.

После этого нужно открыть браузер и ввести следующую строку:

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

Где XXXXXXXXXXXXXXXXXX – токен вашего бота.

Откроется страница примерно следующего вида:

image

Находим на ней следующий текст:

«chat»:{«id»:631290,

Итак, у нас есть вся необходимая информация для написания скриптов для Mikrotik’а, а именно:

Токен бота: 265373548:AAFyGCqJCei9mvcxvXOWBfnjSt1p3sX1XH4

ID чата, куда он должен писать: 631290

Для проверки можем зайти через браузер:

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

Должны получить результат:

image

Для нашего удобства, сразу добавим команды для бота:

Находим аккаунт с именем @botfather
После чего пишем ему команду /setcommands

  • Он спросит какому боту

Пишем:
@MikrotikROuter_bot

Добавляем команды:

  • helloworld< — Test message on chat 1
  • itsworking — Test Message on chat 2
  • wolmypc — wake Up my PC

Теперь если набрать в чате «/», то должны получить:

image

Теперь переходим к 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 необходим «\» для экранирования знака «?» в URL.

Должны получить результат:

image

Теперь переходим к сриптам:

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

Не забываем указать правильный mac и имя интерфейс.

Сейчас немного поясню что они делаю:

Скрипт «helloworld» отправляет сообщение: » Hello,world!» в наш чат с ботом.
Скрипт «itsworking» отправляет сообщение: » Test OK, it’s Working !» в наш чат с ботом.
Данные скрипты для демонстрации работы.
Скрипт «wolmypc» я добавил, как одну из возможных реализации.
По сути можно запускать абсолютно любой скрипт.

:global botToken"bot5455340910:Adg4Ljtk4sdfV8QoXhgck44CdNLCUAz1M" ;
:global chatID"567973876" ;
:global message

:do {
    /tool fetch url=("https://api.telegram.org/bot$botToken/getUpdates") dst-path=getUpdates.txt
} on-error={ :return }

:delay 200ms
:local fileID [/file find name=getUpdates.txt]
:if ([:len $fileID] = 0) do={ :return }

:if ( [/file get $fileID size] > 50 ) do={
    :local content [/file get $fileID contents]
    :local send [:parse [/system script get Telegram-send source]]
    :local sl "\5C"
    :local startLoc 0

    :local map "0410=\C0;0411=\C1;0412=\C2;0413=\C3;0414=\C4;0415=\C5;0401=\A8;0416=\C6;0417=\C7;0418=\C8;0419=\C9;041a=\CA;041b=\CB;041c=\CC;041d=\CD;041e=\CE;041f=\CF;0420=\D0;0421=\D1;0422=\D2;0423=\D3;0424=\D4;0425=\D5;0426=\D6;0427=\D7;0428=\D8;0429=\D9;042a=\DA;042b=\DB;042c=\DC;042d=\DD;042e=\DE;042f=\DF;0430=\E0;0431=\E1;0432=\E2;0433=\E3;0434=\E4;0435=\E5;0451=\B8;0436=\E6;0437=\E7;0438=\E8;0439=\E9;043a=\EA;043b=\EB;043c=\EC;043d=\ED;043e=\EE;043f=\EF;0440=\F0;0441=\F1;0442=\F2;0443=\F3;0444=\F4;0445=\F5;0446=\F6;0447=\F7;0448=\F8;0449=\F9;044a=\FA;044b=\FB;044c=\FC;044d=\FD;044e=\FE;044f=\FF"

    :while ([:find $content "update_id" $startLoc] >= 0) do={
        :local uStart [:find $content "update_id" $startLoc]
        :local uEnd [:find $content "," $uStart]
        :local currentUpdateId [:pick $content ($uStart + 11) $uEnd]
        
        /tool fetch url=("https://api.telegram.org/bot$botToken/getUpdates?offset=" . ([:tonum $currentUpdateId] + 1)) keep-result=no

        :local tLabel [:find $content "\"text\":\"" $uStart]
        :local msgRaw ""
        :if ([:len $tLabel] > 0) do={
            :local tStart ($tLabel + 8)
            :local tEnd [:find $content "\"" $tStart]
            :set msgRaw [:pick $content $tStart $tEnd]
        }

        :local cleanMsg ""
        :local i 0
        :local msgLen [:len $msgRaw]
        :while ($i < $msgLen) do={
            :local char [:pick $msgRaw $i ($i + 1)]
            :local head [:pick $msgRaw $i ($i + 2)]
            :if ($head = ($sl . "u")) do={
                :local code [:pick $msgRaw ($i + 2) ($i + 6)]
                :local pos [:find $map $code]
                :if ([:len $pos] > 0) do={
                    :set cleanMsg ($cleanMsg . [:pick $map ($pos + 5) ($pos + 6)])
                    :set i ($i + 6)
                } else={ :set cleanMsg ($cleanMsg . $char); :set i ($i + 1) }
            } else={ :set cleanMsg ($cleanMsg . $char); :set i ($i + 1) }
        }

        :local cmd $cleanMsg
        :if ([:pick $cmd 0 1] = "/") do={ :set cmd [:pick $cmd 1 [:len $cmd]] }

        :local sLabel [:find $content "\"from\":{" $uStart]
        :local sIdLabel [:find $content "\"id\":" $sLabel]
        :local senderId [:tostr [:pick $content ($sIdLabel + 5) [:find $content "," $sIdLabel]]]

        :if ($senderId = [:tostr $chatID]) do={
            :local scriptRef [/system script find name=$cmd]
            :if ([:len $scriptRef] > 0) do={
                # Просто запускаем. Скрипт сам должен вызвать $send
                /system script run $cmd
            } else={
                :if ($cmd = "all") do={
                    :local list "Скрипты:\n"
                    :foreach s in=[/system script find] do={ :set list ($list . "- " . [/system script get $s name] . "\n") }
                    :set message $list
                    $send
                } else={
                    :set message "Команда $cleanMsg не найдена. /all"
                    $send
                }
            }
        }
        :set startLoc $uEnd
    }
}
} 

UPD 09.09.2026 код подправлен.

Как это работает

Скачиваем наши сообщения «getUpdates» каждые 30 сек., затем парсим, чтобы узнать update_id (номер сообщения) и text (наши команды). По умолчанию getUpdates выводит от 1 до 100 сообщений, для удобства после прочтения команды, сообщение удаляем. в Telegram api сказано, чтобы прочесть сообщение необходимо номер сообщения + 1

/getUpdates?offset=update_id + 1

Все проверено на Mikrotik rb915 RouterOS 6.37.1
Если отправить сразу много команд, они все по очереди будут выполняться с интервалом 30 сек.

P.S. Огромное спасибо Кирилу Казакову за идею и Блажееву Александру за помощь со скриптами.

Обратная связь

    The average number of adverse effects was 3. T max is 23 minutes in females and 32 minutes in males. What other drugs will affect doxercalciferol Viagra natural sin receta. Archived from the original on 2009-08-14.

    Talk to your doctor before using this form of cefadroxil if you have diabetes. What should I tell my healthcare team before starting CABLIVI? There is no FDA guidance on the use of Tetracycline (oral) with respect to specific gender populations https://www.apotheke-rezeptfreie.com/. Opper K, Uder S, Song K Development of Heterogeneous and Homogeneous Platforms for Rapid Analysis of DNA-Protein Interactions.

    Contact Us