""" Instagram Graph API 설정 모듈 환경변수를 통해 Instagram API 연동에 필요한 설정을 관리합니다. """ from typing import Optional from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class InstagramSettings(BaseSettings): """ Instagram Graph API 설정 환경변수 또는 .env 파일에서 설정을 로드합니다. Attributes: app_id: Facebook/Instagram 앱 ID app_secret: Facebook/Instagram 앱 시크릿 access_token: Instagram 액세스 토큰 api_version: Graph API 버전 (기본: v21.0) base_url: Instagram Graph API 기본 URL facebook_base_url: Facebook Graph API 기본 URL (토큰 디버그용) timeout: HTTP 요청 타임아웃 (초) max_retries: 최대 재시도 횟수 retry_base_delay: 재시도 기본 대기 시간 (초) retry_max_delay: 재시도 최대 대기 시간 (초) """ model_config = SettingsConfigDict( env_prefix="INSTAGRAM_", env_file=".env", env_file_encoding="utf-8", extra="ignore", ) # ========================================================================== # 필수 설정 (환경변수에서 로드) # ========================================================================== app_id: Optional[str] = Field( default=None, description="Facebook/Instagram 앱 ID", ) app_secret: Optional[str] = Field( default=None, description="Facebook/Instagram 앱 시크릿", ) access_token: Optional[str] = Field( default=None, description="Instagram 액세스 토큰", ) # ========================================================================== # API 설정 # ========================================================================== api_version: str = Field( default="v21.0", description="Graph API 버전", ) base_url: str = Field( default="https://graph.instagram.com", description="Instagram Graph API 기본 URL", ) facebook_base_url: str = Field( default="https://graph.facebook.com", description="Facebook Graph API 기본 URL (토큰 디버그용)", ) # ========================================================================== # HTTP 클라이언트 설정 # ========================================================================== timeout: float = Field( default=30.0, description="HTTP 요청 타임아웃 (초)", ) max_retries: int = Field( default=3, description="최대 재시도 횟수", ) retry_base_delay: float = Field( default=1.0, description="재시도 기본 대기 시간 (초)", ) retry_max_delay: float = Field( default=60.0, description="재시도 최대 대기 시간 (초)", ) # ========================================================================== # 미디어 게시 설정 # ========================================================================== container_poll_interval: float = Field( default=2.0, description="컨테이너 상태 확인 간격 (초)", ) container_timeout: float = Field( default=60.0, description="컨테이너 상태 확인 타임아웃 (초)", ) @property def app_access_token(self) -> str: """앱 액세스 토큰 (토큰 디버그용)""" if not self.app_id or not self.app_secret: raise ValueError("app_id와 app_secret이 설정되어야 합니다.") return f"{self.app_id}|{self.app_secret}" def get_instagram_url(self, endpoint: str) -> str: """Instagram Graph API 전체 URL 생성""" endpoint = endpoint.lstrip("/") return f"{self.base_url}/{endpoint}" def get_facebook_url(self, endpoint: str) -> str: """Facebook Graph API 전체 URL 생성 (버전 포함)""" endpoint = endpoint.lstrip("/") return f"{self.facebook_base_url}/{self.api_version}/{endpoint}" from functools import lru_cache @lru_cache() def get_settings() -> InstagramSettings: """ 설정 인스턴스 반환 (캐싱됨) 테스트 시 캐시 초기화: get_settings.cache_clear() Returns: InstagramSettings 인스턴스 """ return InstagramSettings() # 하위 호환성을 위한 기본 인스턴스 # @deprecated: get_settings() 사용 권장 settings = get_settings()