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

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
LordNarzgul
Сообщения: 8
Зарегистрирован: 08 фев 2021, 20:22

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

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

telega_test

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

# script by Virtue
: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

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

# script by Virtue
: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

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

# script by Virtue
: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]
    :if ([/log get $i message] ~ "[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]:[0-F][0-F]") do={
      :foreach k in=[/ip dhcp-server lease find] do={
      :local mac [/ip dhcp-server lease get $k value-name=mac-address]
        :if ([/log get $i message] ~ "$mac") do={
        :set Log1Message ($Log1Message . " / " . [/ip dhcp-server lease get $k value-name=comment])
        }
      }
    }
    :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 (поменяйте название интерфейса и мак адрес на свои)

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

# script by Virtue
/tool wol interface=bridge3-lan mac=00:11:22:22:11:00
Можете использовать все эти скрипты, либо какие-то из них, либо написать еще. Мануальчик подразумевает что вы уже создали и активировали бота, через которого будете отправлять и получать команды, а также добавили его в отдельно созданную группу, как это сделать можете посмотреть тут: https://1spla.ru/blog/telegram_bot_for_mikrotik/

Необходимо узнать токен бота и айди чата для использования скриптов.
Прошивка микротика 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

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

# script modified by Virtue
: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
Сообщения: 142
Зарегистрирован: 07 мар 2014, 10:17

LordNarzgul писал(а): 09 фев 2021, 10:00 Именно из группы в телеграмм при отправке приходит ошибка Неизвестная команда.
При этом если отправить самого микротик все приходит нормально.
можете показать скрин как вы отправляете команду и собственно саму ошибку?


LordNarzgul
Сообщения: 8
Зарегистрирован: 08 фев 2021, 20:22

Virtue писал(а): 09 фев 2021, 12:39
LordNarzgul писал(а): 09 фев 2021, 10:00 Именно из группы в телеграмм при отправке приходит ошибка Неизвестная команда.
При этом если отправить самого микротик все приходит нормально.
можете показать скрин как вы отправляете команду и собственно саму ошибку?
Да скрины приложил.

Изображение

Изображение


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

LordNarzgul писал(а): 09 фев 2021, 14:53
Да скрины приложил.
как-то у вас странно и не так всё выглядит, вот посмотрите как это у меня:

вот отправка команды:

Изображение


а вот так выглядит ответ (причем ответ мне приходит в другую группу)


Изображение


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

LordNarzgul писал(а): 09 фев 2021, 14:53
не понимаю, кто у вас пишет
MikroTik: Unknown command:

вы сами в скрипте указали так отвечать на неизвестные команды?


LordNarzgul
Сообщения: 8
Зарегистрирован: 08 фев 2021, 20:22

Virtue писал(а): 09 фев 2021, 15:59
LordNarzgul писал(а): 09 фев 2021, 14:53
Да скрины приложил.
как-то у вас странно и не так всё выглядит, вот посмотрите как это у меня:

вот отправка команды:

Изображение


а вот так выглядит ответ (причем ответ мне приходит в другую группу)


Изображение
Спасибо кажись понял в чем проблема по результатам отпишусь спасибо за уделенное время.
А не подскажете чтобы ответ приходил в другую группу это нужно поменять в главном скрипте который у вас назван Телеграмм или в скриптах к примеру test_telega ?


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

LordNarzgul писал(а): 09 фев 2021, 17:20 Спасибо кажись понял в чем проблема по результатам отпишусь спасибо за уделенное время.
А не подскажете чтобы ответ приходил в другую группу это нужно поменять в главном скрипте который у вас назван Телеграмм или в скриптах к примеру test_telega ?
К примеру telega_test.

Да, отпишитесь пожалуйста, что не так было.


LordNarzgul
Сообщения: 8
Зарегистрирован: 08 фев 2021, 20:22

Virtue писал(а): 09 фев 2021, 19:23
LordNarzgul писал(а): 09 фев 2021, 17:20 Спасибо кажись понял в чем проблема по результатам отпишусь спасибо за уделенное время.
А не подскажете чтобы ответ приходил в другую группу это нужно поменять в главном скрипте который у вас назван Телеграмм или в скриптах к примеру test_telega ?
К примеру telega_test.

Да, отпишитесь пожалуйста, что не так было.
Перепроверил скрипт все верно, заново создал две группы и по боту для двух групп.
В итоге результата нет в логе ошибок нет.



Изображение


LordNarzgul
Сообщения: 8
Зарегистрирован: 08 фев 2021, 20:22

Virtue писал(а): 09 фев 2021, 19:23
LordNarzgul писал(а): 09 фев 2021, 17:20 Спасибо кажись понял в чем проблема по результатам отпишусь спасибо за уделенное время.
А не подскажете чтобы ответ приходил в другую группу это нужно поменять в главном скрипте который у вас назван Телеграмм или в скриптах к примеру test_telega ?
К примеру telega_test.

Да, отпишитесь пожалуйста, что не так было.
Причем обратиться по name identity как видно из скрина выше тоже не дает.


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

LordNarzgul писал(а): 09 фев 2021, 23:02
Причем обратиться по name identity как видно из скрина выше тоже не дает.
Скрипт как раз обращается по "name identity", а почему у вас не дает обратиться? Это вы видимо так написали шаблоны и забыли указать этот самый "name identity"
команды должны быть вида:
/mikrotik telega_test
где "mikrotik" как раз и есть - "name identity"
можете попробовать вручную ввести такую команду
если у вас имя тика 7777, то ваша команда должна выглядеть так:
/7777 telega_test


Ответить