141 lines
4.6 KiB
Python
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()
|