
Хотелось бы еще раз остановиться на теме связки роутеров 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"