o2o-castad-backend/poc/instagram/config.py

141 lines
4.6 KiB
Python

"""
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()