97 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Инструкция: Уведомления из 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). В обычной локальной схеме это не требуется.