# Инструкция: Уведомления из MikroTik в Telegram-бот (локальная сеть) **Внимание!** Все примеры и инструкции ниже рассчитаны на работу внутри одной локальной сети (например, 10.10.10.0/24). Внешний доступ, проброс портов, Cloudflare Tunnel и HTTPS не требуются и не используются. ## Оглавление - [Вариант 1: Только через API (рекомендуется)](#вариант-1-только-через-api-рекомендуется) - [Вариант 2: Через fetch-скрипт MikroTik (мгновенные уведомления)](#вариант-2-через-fetch-скрипт-mikrotik-для-мгновенных-событий) - [Пошагово: fetch-скрипт MikroTik](./mt_fetch_script.md) - [Пошагово: FastAPI-приёмник событий](./fastapi_receiver.md) - [Внешний доступ (опционально)](#внешний-доступ-опционально) --- ## Вариант 1: Только через API (рекомендуется) Бот сам опрашивает MikroTik по внутреннему IP (например, 10.10.10.1) через API и отправляет уведомления в Telegram. ### Преимущества: - Не нужно ничего настраивать на MikroTik - Всё централизовано в боте - Безопасно (нет открытых портов) ### Как работает: 1. В bot.py реализуется периодический опрос событий (например, новых Wi-Fi клиентов, статуса интернета) 2. Если найдено новое событие — бот отправляет уведомление в Telegram #### Пример кода (добавить в bot.py): ```python 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: ```python 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](./cloudflare_tunnel.md). В обычной локальной схеме это не требуется.