- FastAPI приложение для отправки мониторинговых алертов в мессенджеры - Поддержка Telegram и MAX/VK - Интеграция с Grafana, Zabbix, AlertManager - Автоматическое создание тикетов в Jira - Управление группами мессенджеров через API - Декораторы для авторизации и скрытия эндпоинтов - Подробная документация в папке docs/ Автор: Сергей Антропов Сайт: https://devops.org.ru
196 lines
11 KiB
Python
196 lines
11 KiB
Python
"""
|
||
Модели данных для отправки простых сообщений в Telegram.
|
||
|
||
Автор: Сергей Антропов
|
||
Сайт: https://devops.org.ru
|
||
"""
|
||
from typing import Optional
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class SendMessageRequest(BaseModel):
|
||
"""Запрос на отправку текстового сообщения."""
|
||
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts", "devops"])
|
||
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123, 456])
|
||
text: str = Field(..., description="Текст сообщения", examples=["Привет! Это тестовое сообщение.", "<b>Важное уведомление</b>\n\nСистема работает нормально."])
|
||
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown", "MarkdownV2"])
|
||
disable_web_page_preview: bool = Field(True, description="Отключить превью ссылок", examples=[True, False])
|
||
|
||
model_config = {
|
||
"json_schema_extra": {
|
||
"examples": [
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"text": "Привет! Это тестовое сообщение.",
|
||
"parse_mode": "HTML",
|
||
"disable_web_page_preview": True
|
||
},
|
||
{
|
||
"tg_group": "alerts",
|
||
"tg_thread_id": 123,
|
||
"text": "<b>Критическое уведомление</b>\n\nСистема недоступна!\n\n<i>Время: 2024-02-08 16:49:44</i>",
|
||
"parse_mode": "HTML",
|
||
"disable_web_page_preview": False
|
||
},
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"text": "**Важное уведомление**\n\nСистема работает нормально.\n\n[Подробнее](https://example.com)",
|
||
"parse_mode": "Markdown",
|
||
"disable_web_page_preview": True
|
||
}
|
||
]
|
||
}
|
||
}
|
||
|
||
|
||
class SendPhotoRequest(BaseModel):
|
||
"""Запрос на отправку фото."""
|
||
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
|
||
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
|
||
photo: str = Field(..., description="URL фото или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/image.jpg", "https://grafana.example.com/render/dashboard-solo?panelId=1&width=1000&height=500"])
|
||
caption: Optional[str] = Field(None, description="Подпись к фото", examples=["График производительности", "<b>График CPU</b>\n\nВремя: 2024-02-08 16:49:44"])
|
||
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
|
||
|
||
model_config = {
|
||
"json_schema_extra": {
|
||
"examples": [
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"photo": "https://example.com/image.jpg",
|
||
"caption": "Описание фото",
|
||
"parse_mode": "HTML"
|
||
},
|
||
{
|
||
"tg_group": "alerts",
|
||
"tg_thread_id": 123,
|
||
"photo": "https://grafana.example.com/render/dashboard-solo?panelId=1&width=1000&height=500",
|
||
"caption": "<b>График CPU</b>\n\n<i>Время: 2024-02-08 16:49:44</i>",
|
||
"parse_mode": "HTML"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
|
||
|
||
class SendVideoRequest(BaseModel):
|
||
"""Запрос на отправку видео."""
|
||
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
|
||
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
|
||
video: str = Field(..., description="URL видео или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/video.mp4", "https://example.com/recording.webm"])
|
||
caption: Optional[str] = Field(None, description="Подпись к видео", examples=["Запись экрана", "<b>Запись работы системы</b>\n\nДлительность: 60 сек"])
|
||
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
|
||
duration: Optional[int] = Field(None, description="Длительность видео в секундах", examples=[60, 120, 300])
|
||
width: Optional[int] = Field(None, description="Ширина видео в пикселях", examples=[1280, 1920])
|
||
height: Optional[int] = Field(None, description="Высота видео в пикселях", examples=[720, 1080])
|
||
|
||
model_config = {
|
||
"json_schema_extra": {
|
||
"examples": [
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"video": "https://example.com/video.mp4",
|
||
"caption": "Описание видео",
|
||
"parse_mode": "HTML",
|
||
"duration": 60,
|
||
"width": 1280,
|
||
"height": 720
|
||
},
|
||
{
|
||
"tg_group": "alerts",
|
||
"tg_thread_id": 123,
|
||
"video": "https://example.com/recording.webm",
|
||
"caption": "<b>Запись работы системы</b>\n\n<i>Длительность: 60 сек</i>",
|
||
"parse_mode": "HTML",
|
||
"duration": 60,
|
||
"width": 1920,
|
||
"height": 1080
|
||
}
|
||
]
|
||
}
|
||
}
|
||
|
||
|
||
class SendAudioRequest(BaseModel):
|
||
"""Запрос на отправку аудио."""
|
||
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
|
||
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
|
||
audio: str = Field(..., description="URL аудио файла или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/audio.mp3", "https://example.com/notification.ogg"])
|
||
caption: Optional[str] = Field(None, description="Подпись к аудио", examples=["Аудио уведомление", "<b>Аудио запись</b>\n\nДлительность: 3 мин"])
|
||
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
|
||
duration: Optional[int] = Field(None, description="Длительность аудио в секундах", examples=[180, 300])
|
||
performer: Optional[str] = Field(None, description="Исполнитель (для музыкальных файлов)", examples=["Artist Name", "System Notification"])
|
||
title: Optional[str] = Field(None, description="Название трека (для музыкальных файлов)", examples=["Song Title", "Alert Notification"])
|
||
|
||
model_config = {
|
||
"json_schema_extra": {
|
||
"examples": [
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"audio": "https://example.com/audio.mp3",
|
||
"caption": "Описание аудио",
|
||
"parse_mode": "HTML",
|
||
"duration": 180,
|
||
"performer": "Artist Name",
|
||
"title": "Song Title"
|
||
},
|
||
{
|
||
"tg_group": "alerts",
|
||
"tg_thread_id": 123,
|
||
"audio": "https://example.com/notification.ogg",
|
||
"caption": "<b>Аудио уведомление</b>\n\n<i>Система работает нормально</i>",
|
||
"parse_mode": "HTML",
|
||
"duration": 30,
|
||
"performer": "System Notification",
|
||
"title": "Alert Notification"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
|
||
|
||
class SendDocumentRequest(BaseModel):
|
||
"""Запрос на отправку документа."""
|
||
tg_group: str = Field(..., description="Имя группы Telegram из конфигурации", examples=["monitoring", "alerts"])
|
||
tg_thread_id: int = Field(0, description="ID треда в группе Telegram (0 для основной группы)", examples=[0, 123])
|
||
document: str = Field(..., description="URL документа или путь к файлу (поддерживается автоматическая загрузка с URL)", examples=["https://example.com/file.pdf", "https://example.com/report.xlsx"])
|
||
caption: Optional[str] = Field(None, description="Подпись к документу", examples=["Отчет за неделю", "<b>Отчет</b>\n\nДата: 2024-02-08"])
|
||
parse_mode: Optional[str] = Field("HTML", description="Режим парсинга подписи (HTML, Markdown, MarkdownV2)", examples=["HTML", "Markdown"])
|
||
filename: Optional[str] = Field(None, description="Имя файла (если не указано, используется имя из URL)", examples=["document.pdf", "report_2024-02-08.xlsx"])
|
||
|
||
model_config = {
|
||
"json_schema_extra": {
|
||
"examples": [
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"document": "https://example.com/file.pdf",
|
||
"caption": "Описание документа",
|
||
"parse_mode": "HTML",
|
||
"filename": "document.pdf"
|
||
},
|
||
{
|
||
"tg_group": "alerts",
|
||
"tg_thread_id": 123,
|
||
"document": "https://example.com/report.xlsx",
|
||
"caption": "<b>Отчет за неделю</b>\n\n<i>Дата: 2024-02-08</i>",
|
||
"parse_mode": "HTML",
|
||
"filename": "report_2024-02-08.xlsx"
|
||
},
|
||
{
|
||
"tg_group": "monitoring",
|
||
"tg_thread_id": 0,
|
||
"document": "https://example.com/logs.txt",
|
||
"caption": "Логи системы",
|
||
"parse_mode": "HTML",
|
||
"filename": "system_logs_2024-02-08.txt"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
|