управление с телеги

Здесь выкладываем скрипты
Аватара пользователя
Virtue
Сообщения: 43
Зарегистрирован: 07 мар 2014, 10:17

08 июн 2020, 23:49

На днях сдружил свои железки с телеграм, научился запускать скрипты и получать вывод..
Подскажите, есть ли возможность отправлять именно команды (как в терминале) и получать ответ например в переменную? ну а дальше думаю смогу уже прикрутить и к телеге


Аватара пользователя
hulitolku
Сообщения: 23
Зарегистрирован: 07 окт 2018, 11:59

09 июн 2020, 21:07

Я реализовал управление с андройд-смарфтона виджетами termux. Но работает только в пределах локальной сети, так как нет белого айпи.


Аватара пользователя
Virtue
Сообщения: 43
Зарегистрирован: 07 мар 2014, 10:17

07 июл 2020, 02:58

• Кому интересно управление микротиками с помощью телеграмм, решил написать простенький мануальчик. Я и сам недавно только научился, протестировал, а теперь вот делюсь опытом, еще и телеграмм апиай официально разблокировали, так что вообще красота..
Управление сводится к отправке в группу телеграмм команды для определенного тика (в команде присутствует имя, необходимого для запуска скрипта), микрот в свою очередь по шедулеру выполняет чтение поступившей для него команды, и запускает заранее созданный скрипт.
Скриптов можно придумать сколько угодно на все случаи жизни, вот несколько примеров с описанием и содержимым:

telega_test - скрипт, который просто присылает в ответ сообщение и тем самым мы видим что микрот работает и на нем есть интернет
для активации отправляем: /mikrotik telega_test
где "mikrotik" имя роутера по Identity

telega_test

Код: Выделить всё

:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:local name [/system  identity  get name]
:local a [/sys clock get date]
:local b [/sys clock get time]
/tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatID."&text= $a $b $name test")


ping - скрипт, пингующий заданный узел и возвращающий нам количество полученных ответов (можно указывать как айпи, так и хост адрес), 5 запросов-ответов считаю достаточным
для активации отправляем например: /mikrotik ping ya.ru

ping

Код: Выделить всё

:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:local name [/system identity get name]
:global pingaddr

:local pingresult ("ping"." ".$pingaddr." ".[ping address=$pingaddr count=5]."/5")
:tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatID."&text=$name: $pingresult")
log_print - возвращает нам последние логи, команду отправлять с числом, сколько строк из лога мы хотим увидеть (в телеграмме есть ограничения по количеству символов в 1 сообщении, по этому очень много строк отправить не получится) у меня на разных микротах максимальное число строк тоже разное, это может быть и 40, и 80, но обычно нужно посмотреть только самые последние логи, по этому хватает и 10ти. Если лимит будет превышен, то в ответ просто ничего не придет
для активации отправляем например: /mikrotik log_print 10

log_print

Код: Выделить всё

:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"
:local name [/system identity get name]
:local LogsAll [/log print count-only]
:local LogsScan [/log find]
:local counter 0
:local log1
:global logs

:foreach i in=$LogsScan do={
  :if ($counter >= ($LogsAll - $logs)) do={
  :local Log1Time [/log get $i time]
  :local Log1Message [/log get $i message]
  :set log1 ($log1."|".$Log1Time." ".$Log1Message."%0A")
  }
  :set counter ($counter + 1)
}
/tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendMessage?chat_id=".$chatID."&text= $name: $logs poslednih logov: %0A$log1")
wol_my_pc - включает комп, который подключен напрямую к данному микротику и мак адрес которого прописан в скрипте
для активации отправляем: /mikrotik wol_my_pc

wol_my_pc (поменяйте название интерфейса и мак адрес на свои)

Код: Выделить всё

/tool wol interface=bridge3-lan mac=00:11:22:22:11:00
Можете использовать все эти скрипты, либо какие-то из них, либо написать еще. Мануальчик подразумевает что вы уже создали и активировали бота, через которого будете отправлять и получать команды, как это сделать можете посмотреть тут https://habr.com/ru/post/314108/ Вам нужен будет только токен бота и айди чата. Прошивка микротика v6.46.3 или выше. Если у вас ниже, то гарантии нет что будет работать.

Для корректной работы не одного, а нескольких тиков в одной группе телеграмм, перед каждой командой пишется название тика (Identity) которому адресована команда либо "all", чтобы команда выполнилась на всех тиках. Чтобы не держать в голове все имена и команды, можно добавить шаблоны в свою группу телеграмм через бота BotFather, для этого пишем ему (БотФазеру) команду:
/setcommands
выбираете своего бота и пишите список команд по шаблону:
tik1_wol_my_pc - tik1 my pc on
tik1_telega_test - proverka svyazi tik1
tik1_log_print_10 - last logs
tik1_ping - ping addr or ip
tik2_log_print_10 - last logs
tik2_wol_my_pc - tik2 my pc on
tik3_log_print_10 - last logs
tik4_log_print_10 - last logs
all_log_print_10 - last logs
Теперь, нажав на кнопку "/", всегда можно посмотреть, какие команды (скрипты) и на каких устройствах нам доступны.

Бота создали, скрипты подготовили, теперь создаем скрипт, например с именем - Telegram
это будет основной скрипт для чтения телеграмм на наличие новых команд
Запихиваем в него содержимое (не забывая поменять айдишки на свои):

Telegram

Код: Выделить всё

:local botID "bot1000099999:AAAAx0xXxxXXXXx_XXX0xXxX0XxxXxxXxxx"
:local chatID "-990009999"

:global content [/tool fetch url=("https://api.telegram.org/".$botID."/getUpdates") as-value output=user]
:set content ($content ->"data")

:if ([:len $content] > 23 ) do={

  :local startLoc  [:find $content "update_id" -1 ]
  :set startLoc ( $startLoc + 11 )
  :local endLoc [:find $content "," $startLoc]
  :local messageId ([:pick $content $startLoc $endLoc] + (1))

  :set startLoc  [:find $content "text" -1 ]
  :set startLoc ( $startLoc  + 7 )
  :set endLoc [:find $content "," ($startLoc)]
  :set endLoc ( $endLoc - 1 )
  :local message [:pick $content ($startLoc + 1) $endLoc]

  :set startLoc  [:find $content "chat" -1 ]
  :set startLoc ( $startLoc + 12 )
  :set endLoc [:find $content "," $startLoc]
  :local chatID2 ([:pick $content $startLoc $endLoc])
  
  :if ($chatID2 = $chatID) do={
    :if (($message ~ [/system  identity  get name]) or ($message ~ "all")) do={
      :local neponimat true
      :foreach i in=[/system script find name~""] do={
        if ($message ~ [/system script get $i name]) do={
        :set neponimat false
        :local ScriptName [/system script get $i name]
          :if ($ScriptName = "log_print") do={
            :local startLoc1 ([:find $message "log_print"] +10)
            :local endLoc1 ([:find $message "log_print"] +12)
            :global logs
            :set logs [:pick $message $startLoc1 $endLoc1]
          }
          if ($ScriptName = "ping") do={
            :local startLoc2 ([:find $message "ping"] +5)
            :local endLoc2 ([:find $message "ping"] +20)
            :global pingaddr
            :set pingaddr [:pick $message $startLoc2 $endLoc2]
          }
        :log info message="Script $ScriptName zapus4en"
        /system script run $ScriptName
        if ($message ~ "all") do={
          :delay 55
          }
        :tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")
        }
      }
     if ($neponimat = true) do={
       :tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")
       :delay 3
       :local name [/system  identity  get name]
       :tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/sendmessage?chat_id=".$chatID."&text=$name: Moya tvoya neponimat'")
       }
    } else={:delay 55; :tool fetch keep-result=no url=("https://api.telegram.org/".$botID."/getUpdates?offset=$messageId")}
  }
}
Далее создаем шедулер с интервалом запуска например раз в минуту как у меня и содержимым:

Код: Выделить всё

/system script run Telegram
Проверяем, если все сделали правильно, должно работать

примеры команд (где "mikrotik" имя роутера по Identity):
/mikrotik telega_test

/mikrotik ping mail.ru

/mikrotik log_print 15

/mikrotik wol_my_pc

/all ping 8.8.8.8

/all log_print 20
Последний раз редактировалось Virtue 01 авг 2020, 22:14, всего редактировалось 1 раз.


Sertik
Сообщения: 908
Зарегистрирован: 15 сен 2017, 09:03

07 июл 2020, 09:27

:local ScriptName [/system script get $i name]
:if ($ScriptName = "log_print") do={
:local startLoc1 ([:find $message "log_print"] +10)
:local endLoc1 ([:find $message "log_print"] +12)
:global logs
:set logs [:pick $message $startLoc1 $endLoc1]
}
if ($ScriptName = "ping") do={
:local startLoc2 ([:find $message "ping"] +5)
:local endLoc2 ([:find $message "ping"] +20)
:global pingaddr
:set pingaddr [:pick $message $startLoc2 $endLoc2]
}
:log info message="Script $ScriptName zapus4en"
/system script run $ScriptName
if ($message ~ "all") do={
:delay 55

Не понял, простите, этих строк, выделенных жирным шрифтом ... Это что же там идет проверка на имена команд ? То есть, главный Ваш скрипт надо каждый раз дополнять - имя каждого выполняемого скрипта туда вписывать с проверками на условие ? Или почему такая избирательность для запуска этих скриптов ? А остальные, получается просто запускаются и всё ?


Чего не знаем то нагуглим
Аватара пользователя
Virtue
Сообщения: 43
Зарегистрирован: 07 мар 2014, 10:17

07 июл 2020, 09:40

Sertik писал(а):
07 июл 2020, 09:27
... почему такая избирательность для запуска этих скриптов ? А остальные, получается просто запускаются и всё ?
для данных скриптов прописаны дополнительные строки в основном скрипте, они нужны для получения дополнительных параметров (для пинга нужен адрес что пинговать, а для логов задается количество строк из лога)

если же вы создаете свой скрипт и для него не нужны доп. параметры, а нужно просто запустить скрипт, то ничего дописывать в основной скрипт не нужно


Sertik
Сообщения: 908
Зарегистрирован: 15 сен 2017, 09:03

07 июл 2020, 09:48

Понятно, но как то не очень универсально ... А доработать можно ?

А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?


Чего не знаем то нагуглим
Аватара пользователя
Virtue
Сообщения: 43
Зарегистрирован: 07 мар 2014, 10:17

07 июл 2020, 10:13

Sertik писал(а):
07 июл 2020, 09:48
Понятно, но как то не очень универсально ... А доработать можно ?
при желании всё можно доработать, смотря что вам нужно..
Sertik писал(а):
07 июл 2020, 09:48
А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Бегло просмотрел, и что могу сказать..
Скрипт того человека по сути также просто запускает скрипты по названию (без всяких там доп параметров и заморочек) соответственно с помощью данного скрипта не выполнить например пинг определенного хоста..

А еще минус того скрипта перед моим, что он написан для одного микротика и с помощью него не запустить например какой-то скрипт сразу на нескольких роутерах


ReadMe
Сообщения: 22
Зарегистрирован: 29 окт 2014, 21:31

07 июл 2020, 10:16

Sertik писал(а):
07 июл 2020, 09:48
Понятно, но как то не очень универсально ... А доработать можно ?

А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Не работает этот скрипт...


Аватара пользователя
Virtue
Сообщения: 43
Зарегистрирован: 07 мар 2014, 10:17

07 июл 2020, 10:22

ReadMe писал(а):
07 июл 2020, 10:16
Sertik писал(а):
07 июл 2020, 09:48
Понятно, но как то не очень универсально ... А доработать можно ?

А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Не работает этот скрипт...
У меня ксате тоже появились вопросы по его работоспособности..
Например я не понял где объявляется переменная $quotas


ReadMe
Сообщения: 22
Зарегистрирован: 29 окт 2014, 21:31

07 июл 2020, 10:23

Virtue писал(а):
07 июл 2020, 10:22
ReadMe писал(а):
07 июл 2020, 10:16
Sertik писал(а):
07 июл 2020, 09:48
Понятно, но как то не очень универсально ... А доработать можно ?

А это человек сделал давно уже ... https://habr.com/ru/post/482802/ как Вам ?
Не работает этот скрипт...
У меня ксате тоже появились вопросы по его работоспособности..
Например я не понял где объявляется переменная $quotas
там не в этом прикол viewtopic.php?f=14&t=11797


Ответить