본문 바로가기
사회

파이썬으로 업로드 자동화 : 기본 순서와 뼈대 코드

by 핵 멜로디 2025. 9. 8.
728x90
반응형

 파이썬으로 업로드 자동화: 기본 순서와 뼈대 코드

 

전략


- 가능하면 공식 API 또는 허용된 자동화 방식을 사용


- 초안/예약 발행을 기본으로 하고, 검수 후 공개 전환


- 에러·중복 업로드를 막는 로그와 재시도 로직 포함

 

공통 절차(플랫폼 불문)


1) 앱 등록/토큰 발급
- 개발자 콘솔에서 애플리케이션 등록
- OAuth 또는 API 키 발급, 권한 범위(Post/Media) 확인
2) 글/이미지 준비
- 제목, 본문(HTML/마크다운/플레인텍스트), 카테고리/태그
- 이미지 파일 경로 또는 URL
3) 업로드 API 호출
- 이미지 먼저 업로드 → 반환된 media_id를 본문에 삽입
- 글 본문 POST 요청(초안 또는 비공개)
4) 예약/공개 전환
- 예약 시간 설정 또는 초안→공개 전환 API 호출
5) 로그·예외 처리
- 성공/실패 로그 저장, 429/5xx 재시도
- 중복 방지용 해시 저장(제목+본문 요약)

예시 코드 뼈대

(설명용, 실제 엔드포인트·파라미터는 플랫폼 문서 확인)
import time, hashlib, json, os
import requests

API_BASE = "https://api.example.com"   # 플랫폼의 실제 API 베이스 URL로 변경
ACCESS_TOKEN = os.getenv("ACCESS_TOKEN")

def make_hash(title, body):
    return hashlib.sha256((title + body [:200]). encode("utf-8")). hexdigest()

def upload_image(path):
    url = f"{API_BASE}/media/upload"
    headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}
    with open(path, "rb") as f:
        files = {"file": f}
        r = requests.post(url, headers=headers, files=files, timeout=30)
    r.raise_for_status()
    return r.json()["media_id"]

def create_post(title, body, tags=None, media_ids=None, draft=True, publish_at=None):
    url = f"{API_BASE}/posts"
    headers = {
        "Authorization": f"Bearer {ACCESS_TOKEN}",
        "Content-Type": "application/json",
    }
    payload = {
        "title": title,
        "body": body,
        "tags": tags or [],
        "media_ids": media_ids or [],
        "status": "draft" if draft else "publish",
    }
    if publish_at:
        payload ["publish_at"] = publish_at  # ISO8601 문자열
    r = requests.post(url, headers=headers, data=json.dumps(payload), timeout=30)
    if r.status_code == 429:
        time.sleep(5)
        return create_post(title, body, tags, media_ids, draft, publish_at)
    r.raise_for_status()
    return r.json()

def main():
    title = "샘플 제목"
    body = "<p> 본문입니다. 이미지도 함께 </p>"
    tags = ["자동화", "파이썬"]
    media_id = upload_image("cover.jpg")
    res = create_post(title, body, tags=tags, media_ids=[media_id], draft=True)
    print("Draft created:", res.get("id"))

if __name__ == "__main__":
    main()

실무 팁


- 환경변수에 토큰 저장(코드에 직접 넣지 않기)
- 요청 실패 시 백오프(지수적 딜레이) 적용
- 본문은 HTML 태그 최소화, 서브헤딩과 목록 중심(가독성↑)
- 예약 발행으로 ‘매일 같은 시간’ 리듬 유지

이미지 업로드 없이 글만 올리는 간단 버전
def post_text_only(title, body):
    # 권한/엔드포인트 문서에 맞춰 최소 파라미터로 POST
    ...

자동화 전 체크


- 테스트 계정으로 먼저 수행
- 약관의 자동화 허용 범위 확인(요청 빈도, 스크래핑 금지 조항 등)
- 초안 생성 → 수동 검수 → 공개 전환을 기본 플로우로



728x90
반응형