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