Хотелось бы еще раз остановиться на теме связки роутеров Mikrotik и бота в Telegram.
У нас есть возможность удалённо получать статистику или выполнять определённые команды через нашего мота в Telegram на роутере Mikrotik.
Будем считать что вы уже создали своего бота и готовы к привязке.
Мы будем получать по одной записи отправленной в бота Telegram при помощи роутера Mikrotik и удалять их.
Для начала создаём скрипт в System — Scripts с названием Telegram
:global botID "bot_id" ; :global myChatID "ваш_id" ; :tool fetch url=("https://api.telegram.org/".$botID."/getUpdates"); /system logging remove [find topics~"fetch"] :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] ; :global updateid ([:pick $content $startLoc $endLoc] + (1)); :put [$updateid] ; :log info message="updateID $updateid" ; :set startLoc [:find $content "text" $lastEnd ] ; :set startLoc ( $startLoc + 6 ) ; :local endLoc [:find $content "," ($startLoc)] ; :set endLoc ( $endLoc - 1 ) ; :global 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] ; :global chatId ([:pick $content $startLoc $endLoc]); :put [$chatId] ; :log info message="chatID $chatId "; :tool fetch url=("https://api.telegram.org/".$botID."/getUpdates\?offset=$updateid") keep-result=no; :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} ; }
В System — Scheduler ставим его на выполнение раз в минуту
Теперь наш роутер Mikrotik будет «выгребать» нужные нам команды с сервера Telegram
Для написания скриптов и отправки сообщений, нам нужен botToken и chatID
Для этого нужно создать скрипт Telegram_api_key и добавить в него содержимое.
:global botToken "10454554475:AAFweRTJOdztmdkfdjifND5wncl6VpekI"; :global chatID "340454576";
В System — Scheduler ставим его на при загрузке системы
Теперь чтобы срабатывали наши скрипты в Mikrotik, нужно чтобы их названия совпадали с названием скриптов в System — Scripts
Получить всех активных клиентов capsman
:global botToken :global chatID :local message "" :foreach i in=[/caps-man registration-table find] do={ :local mac [/caps-man registration-table get $i mac-address] :local ssid [/caps-man registration-table get $i ssid] :local iface [/caps-man registration-table get $i interface] :local clientName "" :local ip "" :local lastSeen "" :foreach lease in=[/ip dhcp-server lease find where mac-address="$mac"] do={ :local comment [/ip dhcp-server lease get $lease comment] :local hostname [/ip dhcp-server lease get $lease host-name] :set ip [/ip dhcp-server lease get $lease address] :set lastSeen [/ip dhcp-server lease get $lease last-seen] :if ([:len $comment] > 0) do={ :set clientName $comment } else={ :if ([:len $hostname] > 0) do={ :set clientName $hostname } } } :if ([:len $clientName] = 0) do={ :set clientName $mac } :set message ($message . "%0A<b>" . $clientName . "</b>") :set message ($message . "%0AMAC: " . $mac) :set message ($message . "%0ASSID: " . $ssid) :set message ($message . "%0AInterface: " . $iface) :if ([:len $ip] > 0) do={ :set message ($message . "%0AIP: <code>" . $ip . "</code>") } :if ([:len $lastSeen] > 0) do={ :set message ($message . "%0ALast seen: " . $lastSeen) } :set message ($message . "%0A") } :tool fetch url=("https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatID&text=$message&parse_mode=HTML") keep-result=no
Все клиенты WI-FI
:global botToken :global chatID :local message "" :foreach i in=[/interface wireless registration-table find] do={ :local mac [/interface wireless registration-table get $i mac-address] :local signal [/interface wireless registration-table get $i signal-strength] :local txRate [/interface wireless registration-table get $i tx-rate] :local rxRate [/interface wireless registration-table get $i rx-rate] :local iface [/interface wireless registration-table get $i interface] # Определяем частоту и диапазон :local freq [:tonum [/interface wireless get [find name=$iface] frequency]] :local band "" :if ($freq < 3000) do={ :set band "2.4 GHz" } else={ :set band "5 GHz" } # Имя клиента :local clientName "" :local ip "" :foreach lease in=[/ip dhcp-server lease find where mac-address="$mac"] do={ :local comment [/ip dhcp-server lease get $lease comment] :local hostname [/ip dhcp-server lease get $lease host-name] :set ip [/ip dhcp-server lease get $lease address] :if ([:len $comment] > 0) do={ :set clientName $comment } else={ :if ([:len $hostname] > 0) do={ :set clientName $hostname } } } :if ([:len $clientName] = 0) do={ :set clientName $mac } # Формируем сообщение :set message ($message . "%0A<b>" . $clientName . "</b>") :set message ($message . "%0A\F0\9F\93\A1: " . $band) :set message ($message . "%0A\F0\9F\93\B6: " . $signal . " dBm") :set message ($message . "%0AIP: <code>" . $ip . "</code>") :set message ($message . "%0ATX: " . $txRate . " Mbps") :set message ($message . "%0ARX: " . $rxRate . " Mbps%0A") :log info ("Client: " . $clientName . " | Band: " . $band . " | Signal: " . $signal . " | TX: " . $txRate . " | RX: " . $rxRate) } :log info ("All clients:\n" . $message) # Отправка в Telegram :tool fetch url=("https://api.telegram.org/bot$botToken/sendmessage\?chat_id=$chatID&text=$message&parse_mode=HTML") keep-result=no; :log info "Отправлено в Telegram: $message"
Статистика соединений Wireguard — wireguard_stata
:global botToken :global chatID :local message "" :foreach peer in=[/interface/wireguard/peers/find] do={ :local name [/interface/wireguard/peers/get $peer name] :local handshake [/interface/wireguard/peers/get $peer last-handshake] :local rx [/interface/wireguard/peers/get $peer rx] :local tx [/interface/wireguard/peers/get $peer tx] # Функция для конвертации байтов :local convertSize do={ :local size $1 :local unit "B" :if ($size > 1073741824) do={ :set size ($size / 1073741824) :set unit "GB" } else={ :if ($size > 1048576) do={ :set size ($size / 1048576) :set unit "MB" } else={ :if ($size > 1024) do={ :set size ($size / 1024) :set unit "KB" } } } # Округляем до двух знаков после запятой :set size ($size * 100) :set size ([:tonum $size] / 100) :return ($size . " " . $unit) } :local rxHuman [$convertSize $rx] :local txHuman [$convertSize $tx] :set message ($message . "\F0\9F\91\81: " . $name . " | \F0\9F\A4\9D: " . $handshake . " | Rx: " . $rxHuman . " | Tx: " . $txHuman . "%0A") } :log info $message; # Отправка в Telegram :tool fetch url=("https://api.telegram.org/bot$botToken/sendMessage?chat_id=$chatID&text=$message&parse_mode=HTML") keep-result=no; :log info "Отправлено в Telegram: $message"
Текущая скорость загрузки интерфейсов Mikrotik
:global botToken :global chatID :local message "<b>Interface:</b>%0A" :foreach i in=[/interface find where running=yes] do={ :local name [/interface get $i name] :local rx1 ([/interface get $i rx-byte]) :local tx1 ([/interface get $i tx-byte]) /delay 1 :local rx2 ([/interface get $i rx-byte]) :local tx2 ([/interface get $i tx-byte]) :local rxBits (($rx2 - $rx1) * 8) :local txBits (($tx2 - $tx1) * 8) :local rxRate "" :local txRate "" :if ($rxBits > 1000000) do={ :set rxRate ([:tostr ($rxBits / 1000000)] . " Mbps") } else={ :set rxRate ([:tostr ($rxBits / 1000)] . " kbps") } :if ($txBits > 1000000) do={ :set txRate ([:tostr ($txBits / 1000000)] . " Mbps") } else={ :set txRate ([:tostr ($txBits / 1000)] . " kbps") } :put ("$name => RX: $rxRate | TX: $txRate") :set message ($message . "$name: Rx=<b>$rxRate</b>, Tx=<b>$txRate</b>%0A") } :log info "Отправлено в Telegram: $message" # Отправка в Telegram :tool fetch url=("https://api.telegram.org/bot$botToken/sendmessage\?chat_id=$chatID&text=$message&parse_mode=HTML") keep-result=no; :log info "Отправлено в Telegram: $message"