- Estructura completa del proyecto con FastAPI - Modelos de base de datos (productos, servicios, posts, calendario, interacciones) - Publishers para X, Threads, Instagram, Facebook - Generador de contenido con DeepSeek API - Worker de Celery con tareas programadas - Dashboard básico con templates HTML - Docker Compose para despliegue - Documentación completa Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
75 lines
1.8 KiB
Python
75 lines
1.8 KiB
Python
"""
|
|
Clase base para publishers de redes sociales.
|
|
"""
|
|
|
|
from abc import ABC, abstractmethod
|
|
from typing import Optional, List, Dict
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class PublishResult:
|
|
"""Resultado de una publicación."""
|
|
success: bool
|
|
post_id: Optional[str] = None
|
|
url: Optional[str] = None
|
|
error_message: Optional[str] = None
|
|
|
|
|
|
class BasePublisher(ABC):
|
|
"""Clase base abstracta para publishers."""
|
|
|
|
platform: str = "base"
|
|
|
|
@abstractmethod
|
|
async def publish(
|
|
self,
|
|
content: str,
|
|
image_path: Optional[str] = None
|
|
) -> PublishResult:
|
|
"""Publicar contenido en la plataforma."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def publish_thread(
|
|
self,
|
|
posts: List[str],
|
|
images: Optional[List[str]] = None
|
|
) -> PublishResult:
|
|
"""Publicar un hilo de posts."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def reply(
|
|
self,
|
|
post_id: str,
|
|
content: str
|
|
) -> PublishResult:
|
|
"""Responder a un post."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def like(self, post_id: str) -> bool:
|
|
"""Dar like a un post."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def get_mentions(self, since_id: Optional[str] = None) -> List[Dict]:
|
|
"""Obtener menciones recientes."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def get_comments(self, post_id: str) -> List[Dict]:
|
|
"""Obtener comentarios de un post."""
|
|
pass
|
|
|
|
@abstractmethod
|
|
async def delete(self, post_id: str) -> bool:
|
|
"""Eliminar un post."""
|
|
pass
|
|
|
|
def validate_content(self, content: str) -> bool:
|
|
"""Validar que el contenido cumple con los límites de la plataforma."""
|
|
# Implementar en subclases según límites específicos
|
|
return True
|