- Switch from requests to httpx.AsyncClient (full async HTTP) - Add _request() with exponential backoff on 429/401 - Cache followees with 5-min TTL to reduce API calls - Remove dead code (_get_all_stories, instagram_password, session_file) - Graceful shutdown via asyncio.Event + SIGTERM/SIGINT handlers - Add /health command with connection status - Stream media downloads with httpx + aiofiles - Track story expiring_at for smart cleanup - Sanitize .env.example (remove real tokens)
26 lines
931 B
Python
26 lines
931 B
Python
import os
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class Config:
|
|
telegram_bot_token: str = os.getenv("TELEGRAM_BOT_TOKEN", "")
|
|
telegram_chat_id: int = int(os.getenv("TELEGRAM_CHAT_ID", "0"))
|
|
instagram_username: str = os.getenv("INSTAGRAM_USERNAME", "")
|
|
check_interval_minutes: int = int(os.getenv("CHECK_INTERVAL_MINUTES", "15"))
|
|
download_dir: str = os.getenv("DOWNLOAD_DIR", "/data/downloads")
|
|
max_media_size_mb: int = int(os.getenv("MAX_MEDIA_SIZE_MB", "50"))
|
|
max_post_age_hours: int = int(os.getenv("MAX_POST_AGE_HOURS", "24"))
|
|
concurrent_checks: int = int(os.getenv("CONCURRENT_CHECKS", "5"))
|
|
|
|
def validate(self) -> list[str]:
|
|
errors = []
|
|
if not self.telegram_bot_token:
|
|
errors.append("TELEGRAM_BOT_TOKEN is required")
|
|
if not self.telegram_chat_id:
|
|
errors.append("TELEGRAM_CHAT_ID is required")
|
|
return errors
|
|
|
|
|
|
config = Config()
|