10
Июн

Mikrotik + Telegram

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

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

    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