- FastAPI приложение для отправки мониторинговых алертов в мессенджеры - Поддержка Telegram и MAX/VK - Интеграция с Grafana, Zabbix, AlertManager - Автоматическое создание тикетов в Jira - Управление группами мессенджеров через API - Декораторы для авторизации и скрытия эндпоинтов - Подробная документация в папке docs/ Автор: Сергей Антропов Сайт: https://devops.org.ru
175 lines
6.7 KiB
Python
175 lines
6.7 KiB
Python
"""
|
||
Базовый абстрактный класс для работы с мессенджерами.
|
||
|
||
Автор: Сергей Антропов
|
||
Сайт: https://devops.org.ru
|
||
"""
|
||
import logging
|
||
from abc import ABC, abstractmethod
|
||
from typing import Optional, Union, Dict, Any
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class MessengerClient(ABC):
|
||
"""Базовый абстрактный класс для всех мессенджеров."""
|
||
|
||
@abstractmethod
|
||
async def send_message(
|
||
self,
|
||
chat_id: Union[str, int],
|
||
text: str,
|
||
thread_id: Optional[int] = None,
|
||
reply_markup: Optional[Dict[str, Any]] = None,
|
||
disable_web_page_preview: bool = True,
|
||
parse_mode: str = "HTML",
|
||
**kwargs
|
||
) -> bool:
|
||
"""
|
||
Отправить текстовое сообщение.
|
||
|
||
Args:
|
||
chat_id: ID чата или группы (может быть строкой или числом).
|
||
text: Текст сообщения.
|
||
thread_id: ID треда в группе (опционально, не все мессенджеры поддерживают).
|
||
reply_markup: Клавиатура с кнопками (опционально, формат зависит от мессенджера).
|
||
disable_web_page_preview: Отключить превью ссылок.
|
||
parse_mode: Режим парсинга (HTML, Markdown, и т.д.).
|
||
**kwargs: Дополнительные параметры для конкретного мессенджера.
|
||
|
||
Returns:
|
||
True если сообщение отправлено успешно, False в противном случае.
|
||
"""
|
||
pass
|
||
|
||
@abstractmethod
|
||
async def send_photo(
|
||
self,
|
||
chat_id: Union[str, int],
|
||
photo: Union[str, bytes],
|
||
caption: Optional[str] = None,
|
||
thread_id: Optional[int] = None,
|
||
parse_mode: str = "HTML",
|
||
**kwargs
|
||
) -> bool:
|
||
"""
|
||
Отправить фото.
|
||
|
||
Args:
|
||
chat_id: ID чата или группы.
|
||
photo: Путь к файлу, URL, bytes или BytesIO объект с фото.
|
||
caption: Подпись к фото (опционально).
|
||
thread_id: ID треда в группе (опционально).
|
||
parse_mode: Режим парсинга (HTML, Markdown).
|
||
**kwargs: Дополнительные параметры.
|
||
|
||
Returns:
|
||
True если фото отправлено успешно, False в противном случае.
|
||
"""
|
||
pass
|
||
|
||
@abstractmethod
|
||
async def send_video(
|
||
self,
|
||
chat_id: Union[str, int],
|
||
video: Union[str, bytes],
|
||
caption: Optional[str] = None,
|
||
thread_id: Optional[int] = None,
|
||
parse_mode: str = "HTML",
|
||
duration: Optional[int] = None,
|
||
width: Optional[int] = None,
|
||
height: Optional[int] = None,
|
||
**kwargs
|
||
) -> bool:
|
||
"""
|
||
Отправить видео.
|
||
|
||
Args:
|
||
chat_id: ID чата или группы.
|
||
video: Путь к файлу, URL, bytes или BytesIO объект с видео.
|
||
caption: Подпись к видео (опционально).
|
||
thread_id: ID треда в группе (опционально).
|
||
parse_mode: Режим парсинга (HTML, Markdown).
|
||
duration: Длительность видео в секундах (опционально).
|
||
width: Ширина видео (опционально).
|
||
height: Высота видео (опционально).
|
||
**kwargs: Дополнительные параметры.
|
||
|
||
Returns:
|
||
True если видео отправлено успешно, False в противном случае.
|
||
"""
|
||
pass
|
||
|
||
@abstractmethod
|
||
async def send_audio(
|
||
self,
|
||
chat_id: Union[str, int],
|
||
audio: Union[str, bytes],
|
||
caption: Optional[str] = None,
|
||
thread_id: Optional[int] = None,
|
||
parse_mode: str = "HTML",
|
||
duration: Optional[int] = None,
|
||
performer: Optional[str] = None,
|
||
title: Optional[str] = None,
|
||
**kwargs
|
||
) -> bool:
|
||
"""
|
||
Отправить аудио.
|
||
|
||
Args:
|
||
chat_id: ID чата или группы.
|
||
audio: Путь к файлу, URL, bytes или BytesIO объект с аудио.
|
||
caption: Подпись к аудио (опционально).
|
||
thread_id: ID треда в группе (опционально).
|
||
parse_mode: Режим парсинга (HTML, Markdown).
|
||
duration: Длительность аудио в секундах (опционально).
|
||
performer: Исполнитель (опционально).
|
||
title: Название трека (опционально).
|
||
**kwargs: Дополнительные параметры.
|
||
|
||
Returns:
|
||
True если аудио отправлено успешно, False в противном случае.
|
||
"""
|
||
pass
|
||
|
||
@abstractmethod
|
||
async def send_document(
|
||
self,
|
||
chat_id: Union[str, int],
|
||
document: Union[str, bytes],
|
||
caption: Optional[str] = None,
|
||
thread_id: Optional[int] = None,
|
||
parse_mode: str = "HTML",
|
||
filename: Optional[str] = None,
|
||
**kwargs
|
||
) -> bool:
|
||
"""
|
||
Отправить документ.
|
||
|
||
Args:
|
||
chat_id: ID чата или группы.
|
||
document: Путь к файлу, URL, bytes или BytesIO объект с документом.
|
||
caption: Подпись к документу (опционально).
|
||
thread_id: ID треда в группе (опционально).
|
||
parse_mode: Режим парсинга (HTML, Markdown).
|
||
filename: Имя файла (опционально).
|
||
**kwargs: Дополнительные параметры.
|
||
|
||
Returns:
|
||
True если документ отправлен успешно, False в противном случае.
|
||
"""
|
||
pass
|
||
|
||
@property
|
||
@abstractmethod
|
||
def messenger_type(self) -> str:
|
||
"""Тип мессенджера (telegram, max, и т.д.)."""
|
||
pass
|
||
|
||
@property
|
||
@abstractmethod
|
||
def supports_threads(self) -> bool:
|
||
"""Поддерживает ли мессенджер треды."""
|
||
pass
|
||
|