5.0 KiB
5.0 KiB
Инструкция: Уведомления из MikroTik в Telegram-бот (локальная сеть)
Внимание! Все примеры и инструкции ниже рассчитаны на работу внутри одной локальной сети (например, 10.10.10.0/24). Внешний доступ, проброс портов, Cloudflare Tunnel и HTTPS не требуются и не используются.
Оглавление
- Вариант 1: Только через API (рекомендуется)
- Вариант 2: Через fetch-скрипт MikroTik (мгновенные уведомления)
- Пошагово: fetch-скрипт MikroTik
- Пошагово: FastAPI-приёмник событий
- Внешний доступ (опционально)
Вариант 1: Только через API (рекомендуется)
Бот сам опрашивает MikroTik по внутреннему IP (например, 10.10.10.1) через API и отправляет уведомления в Telegram.
Преимущества:
- Не нужно ничего настраивать на MikroTik
- Всё централизовано в боте
- Безопасно (нет открытых портов)
Как работает:
- В bot.py реализуется периодический опрос событий (например, новых Wi-Fi клиентов, статуса интернета)
- Если найдено новое событие — бот отправляет уведомление в 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
- Сервер с ботом должен быть доступен по внутреннему адресу
Как настроить:
- В MikroTik создайте скрипт:
/tool fetch url="http://10.10.10.2:8000/event?type=wifi_connect&mac=$mac&ip=$ip" http-method=get - Повесьте этот скрипт на событие DHCP lease или Wi-Fi connect (через Scheduler или Lease Script)
- В боте реализуйте обработку входящих HTTP-запросов (например, через FastAPI или Flask)
- При получении запроса — отправляйте уведомление в 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. В обычной локальной схеме это не требуется.