Инструкция: Уведомления из MikroTik в Telegram-бот (локальная сеть)

Внимание! Все примеры и инструкции ниже рассчитаны на работу внутри одной локальной сети (например, 10.10.10.0/24). Внешний доступ, проброс портов, Cloudflare Tunnel и HTTPS не требуются и не используются.

Оглавление


Вариант 1: Только через API (рекомендуется)

Бот сам опрашивает MikroTik по внутреннему IP (например, 10.10.10.1) через API и отправляет уведомления в Telegram.

Преимущества:

  • Не нужно ничего настраивать на MikroTik
  • Всё централизовано в боте
  • Безопасно (нет открытых портов)

Как работает:

  1. В bot.py реализуется периодический опрос событий (например, новых Wi-Fi клиентов, статуса интернета)
  2. Если найдено новое событие — бот отправляет уведомление в Telegram

Пример кода (добавить в bot.py):

import asyncio
from aiogram import Bot

async def poll_new_clients():
    known_macs = set()
    while True:
        try:
            api = get_mt_api()
            clients = api.path('caps-man', 'registration-table').get()
            new = [c for c in clients if c['mac-address'] not in known_macs]
            for c in new:
                await bot.send_message(<ВАШ_USER_ID>, f"Новый Wi-Fi клиент: {c['mac-address']} IP: {c.get('last-ip', '-')}")
                known_macs.add(c['mac-address'])
        except Exception as e:
            print('Ошибка опроса MikroTik:', e)
        await asyncio.sleep(30)  # опрашивать каждые 30 секунд

# В main:
# asyncio.create_task(poll_new_clients())

Вариант 2: Через fetch-скрипт MikroTik (для мгновенных событий)

MikroTik сам отправляет HTTP-запрос на сервер с ботом по внутреннему адресу (например, 10.10.10.2:8000).

Преимущества:

  • Мгновенные уведомления (без задержки)
  • Не нагружает API частыми запросами

Недостатки:

  • Нужно настраивать скрипт на MikroTik
  • Сервер с ботом должен быть доступен по внутреннему адресу

Как настроить:

  1. В MikroTik создайте скрипт:
    /tool fetch url="http://10.10.10.2:8000/event?type=wifi_connect&mac=$mac&ip=$ip" http-method=get
    
  2. Повесьте этот скрипт на событие DHCP lease или Wi-Fi connect (через Scheduler или Lease Script)
  3. В боте реализуйте обработку входящих HTTP-запросов (например, через FastAPI или Flask)
  4. При получении запроса — отправляйте уведомление в Telegram

Пример кода для Flask:

from flask import Flask, request
from aiogram import Bot

app = Flask(__name__)
bot = Bot(token=os.getenv("TG_BOT_TOKEN"))

@app.route('/event')
def event():
    mac = request.args.get('mac')
    ip = request.args.get('ip')
    # ... другие параметры
    asyncio.create_task(bot.send_message(<ВАШ_USER_ID>, f"MikroTik: новое подключение {mac} IP: {ip}"))
    return 'ok'

Какой способ выбрать?

  • Если не хотите ничего настраивать на MikroTik — используйте только API (вариант 1)
  • Если нужны мгновенные уведомления — используйте fetch-скрипт (вариант 2) или оба варианта вместе

Внешний доступ (опционально)

Если MikroTik и сервер с ботом находятся в разных сетях, используйте Cloudflare Tunnel или проброс портов. Подробнее — см. Cloudflare Tunnel. В обычной локальной схеме это не требуется.