프로젝트로 돌아가기
Openclaw + SNS 카드뉴스 자동화14 min

Threads 자동 발행 실전: 텍스트부터 8장 캐러셀까지

카드뉴스가 완성됐으면 Threads에 올라가야 합니다. Threads API 구조부터 텍스트 발행, 이미지 1장 발행, 8장 캐러셀 발행까지 실제로 작동한 과정을 기록합니다. 이미지 서버가 왜 필요한지, 공개 URL이 없으면 왜 안 되는지도 설명합니다.

카드뉴스가 완성됐으면 발행까지 자동으로 가야 한다

지금까지의 파이프라인은 주제 입력 → 카피 작성 → 이미지 생성 → 렌더링 → PNG 출력입니다. 마지막 단계가 출력입니다. 그런데 출력된 PNG 이미지를 사람이 직접 Threads에 올리면, 그건 자동화가 아닙니다.

진정한 자동화는 에이전트가 완성된 PNG를 Threads 계정에 직접 발행하는 것입니다. 이 단계를 완성하려면 Threads API를 에이전트에게 연결해야 합니다.

Threads API 구조

Threads는 Meta에서 2023년에 출시한 소셜 네트워크 서비스입니다. Twitter의 경쟁자이면서도, Instagram Graph API와 유사한 구조의 공개 API를 제공합니다.

Threads API를 사용하려면 두 가지가 필요합니다.

1. THREADS_TOKEN: Threads 계정의 Access Token 2. THREADS_USER_ID: Threads 사용자 ID (숫자)

Access Token은 Meta for Developers 페이지에서 Threads API 앱을 등록한 후 발급합니다. 이 프로젝트에서는 이미 발급이 완료된 상태를 기준으로 설명합니다. 토큰 발급 과정은 Meta의 공식 문서를 참고하면 됩니다.

Threads 발행은 2~3단계 패턴

Threads API의 발행 방식은 특이합니다. 한 번에 발행하지 않습니다. 미디어 컨테이너를 먼저 생성한 후, 그것을 게시하는 두 단계 패턴입니다.

이 패턴을 이해하는 것이 중요합니다. 왜냐하면 에러가 나면 어디서 막혔는지 알 수 있기 때문입니다.

텍스트 발행: 2단계

  • 1단계: TEXT 미디어 컨테이너 생성
  • 2단계: 게시

이미지 1장 발행: 2단계

  • 1단계: IMAGE 미디어 컨테이너 생성
  • 2단계: 게시

캐러셀(여러 장) 발행: 3단계

  • 1단계: 각 이미지를 item으로 생성 (8회 반복)
  • 2단계: CAROUSEL 컨테이너로 모두 묶기
  • 3단계: 게시

텍스트 발행 (2단계)

가장 간단한 발행부터 시작합니다. 텍스트만 발행하는 경우입니다.

1단계: 미디어 컨테이너 생성

curl -X POST "https://graph.threads.net/v1.0/me/threads" \\
  -H "Authorization: Bearer \${THREADS_TOKEN}" \\
  -d "media_type=TEXT" \\
  -d "text=마음이 흔들릴 때 꺼내보는 문장 6가지

불안할수록 더 단순하게.
지금 당장 할 수 있는 것 하나만 하면 된다.

."

API 응답:

{
  "id": "18001234567890123"
}

응답으로 받은 id는 생성된 미디어 컨테이너의 ID입니다. 이 ID를 다음 단계에서 사용합니다.

2단계: 게시

curl -X POST "https://graph.threads.net/v1.0/me/threads_publish" \\
  -H "Authorization: Bearer \${THREADS_TOKEN}" \\
  -d "creation_id=18001234567890123"

API 응답:

{
  "id": "18001234567890123"
}

응답이 오면 Threads 계정에 텍스트가 발행됩니다. Threads 발행 형식(제목 1줄 / 내용 2줄 / 빈 줄 / .)을 텍스트에 그대로 적용한 것을 확인할 수 있습니다. 첫 번째 텍스트 발행 성공입니다.

이미지 서버가 필요한 이유

Threads API는 이미지를 직접 업로드받지 않습니다. 다른 방식입니다.

  1. 에이전트가 이미지를 공개 웹 서버에 업로드
  2. 그 이미지의 공개 HTTPS URL을 Threads API에 전달
  3. Threads 서버가 그 URL에서 이미지를 다운로드
  4. 이미지가 발행됨

Localhost 경로나 로컬 파일 경로는 쓸 수 없습니다. 예를 들어, /home/user/output-sketch/slide_01.png는 Threads API에서 접근할 수 없습니다. Threads 서버는 그 경로에 접근할 수 없기 때문입니다.

그래서 이미지 서버가 필요합니다. 이 프로젝트에서 사용하는 이미지 서버는 img.dmssolution.co.kr입니다.

이미지 서버로 전송하기:

scp output-sketch/slide_01.png user@img.dmssolution.co.kr:/srv/threads/

이 명령이 성공하면, https://img.dmssolution.co.kr/threads/slide_01.png URL로 이미지에 접근할 수 있게 됩니다.

접근 가능 여부 확인 (필수):

curl -I https://img.dmssolution.co.kr/threads/slide_01.png

응답:

HTTP/1.1 200 OK
...

HTTP 200이 나오면, 그 URL은 공개적으로 접근 가능합니다. 이 단계가 중요합니다. 이 단계를 빠뜨리고 발행하면, "COULD_NOT_DOWNLOAD_IMAGE" 에러가 나고 이미지 발행이 실패합니다.

이미지 1장 발행

하나의 이미지를 발행하는 경우입니다.

1단계: 이미지 포함 컨테이너 생성

curl -X POST "https://graph.threads.net/v1.0/me/threads" \\
  -H "Authorization: Bearer \${THREADS_TOKEN}" \\
  -d "media_type=IMAGE" \\
  -d "image_url=https://img.dmssolution.co.kr/threads/slide_01.png" \\
  -d "text=마음이 흔들릴 때 꺼내보는 문장 6가지

불안할수록 더 단순하게.
지금 당장 할 수 있는 것 하나만 하면 된다.

."

응답:

{
  "id": "18001234567890124"
}

주의: image_url은 반드시 공개 접근 가능한 HTTPS URL이어야 합니다. curl -I로 확인한 후에만 이 API를 호출해야 합니다.

만약 "COULD_NOT_DOWNLOAD_IMAGE" 에러가 나면, URL이 공개 접근 불가 상태입니다. 다시 확인하고 재시도합니다.

2단계: 게시

curl -X POST "https://graph.threads.net/v1.0/me/threads_publish" \\
  -H "Authorization: Bearer \${THREADS_TOKEN}" \\
  -d "creation_id=18001234567890124"

이미지 1장 발행 완료입니다.

8장 캐러셀 발행 (3단계)

가장 복잡한 부분입니다. 8장 이미지를 한 번에 발행하는 캐러셀 형식입니다.

1단계: 각 이미지를 개별 item으로 생성 (8회 반복)

# item ID를 저장할 배열
declare -a ITEM_IDS

# 8번 반복
for i in \$(seq -f "%02g" 1 8); do
  RESPONSE=\$(curl -s -X POST "https://graph.threads.net/v1.0/me/threads" \\
    -H "Authorization: Bearer \${THREADS_TOKEN}" \\
    -d "media_type=IMAGE" \\
    -d "is_carousel_item=true" \\
    -d "image_url=https://img.dmssolution.co.kr/threads/slide_\${i}.png")
  
  ITEM_ID=\$(echo \$RESPONSE | jq -r '.id')
  ITEM_IDS+=(\\$ITEM_ID)
  echo "Item \$i: \\$ITEM_ID"
done

이 단계가 끝나면 8개의 item ID가 배열에 저장됩니다. 예를 들어:

Item 1: 18001234567890201
Item 2: 18001234567890202
Item 3: 18001234567890203
...
Item 8: 18001234567890208

2단계: 캐러셀 컨테이너 생성

Item들을 하나의 캐러셀로 묶습니다.

# 쉼표로 구분된 ID 문자열 생성
CHILDREN=\$(IFS=,; echo "\\*")

curl -X POST "https://graph.threads.net/v1.0/me/threads" \\
  -H "Authorization: Bearer \${THREADS_TOKEN}" \\
  -d "media_type=CAROUSEL" \\
  -d "children=\${CHILDREN}" \\
  -d "text=마음이 흔들릴 때 꺼내보는 문장 6가지

불안할수록 더 단순하게.
지금 당장 할 수 있는 것 하나만 하면 된다.

."

응답:

{
  "id": "18001234567890300"
}

3단계: 게시

curl -X POST "https://graph.threads.net/v1.0/me/threads_publish" \\
  -H "Authorization: Bearer \${THREADS_TOKEN}" \\
  -d "creation_id=18001234567890300"

8장 캐러셀이 Threads에 발행됩니다.

차은별이 자동으로 발행하는 전체 흐름

에이전트에게 "발행해"라고 하면 다음 순서로 자동 실행됩니다.

output-sketch/ 에서 slide_01.png ~ slide_08.png 확인
        ↓
각 파일을 img.dmssolution.co.kr/threads/ 로 업로드
        ↓
업로드 URL 접근 가능 여부 확인 (curl -I)
        ↓
SOUL.md 기준 Threads 발행 형식으로 캡션 작성
        ↓
Threads API로 8장 캐러셀 발행
        ↓
완료. Threads 발행됨. 이미지/문구 반영 완료.

URL 확인 단계가 중요합니다. 이 단계를 빠뜨리면 이미지 발행 오류로 실패하고, 에이전트가 "완료"라고 했는데 실제로는 안 올라간 상황이 생깁니다. 이것 때문에 MEMORY.md에 "확인 안 된 결과물은 완료로 보고하지 않는다"고 적어뒀습니다.

이번 단계에서 완성한 것

| 항목 | 결과 | |-----|------| | Threads 텍스트 발행 | 성공 | | Threads 이미지 1장 발행 | 성공 | | Threads 8장 캐러셀 발행 | 성공 | | 이미지 서버 업로드 연결 | 성공 | | 에이전트 자동 발행 흐름 | 완성 |

전체 파이프라인 완성

처음 이 자동화를 시작할 때 목표로 삼은 전체 흐름이 이제 완성됐습니다.

주제 입력
   ↓
차은별 카피 작성 (6~8장)
   ↓
job.json 생성 → 윈도우 ComfyUI 전송
   ↓
ComfyUI 이미지 생성 → 리눅스 회수
   ↓
render-sketch.js 카드뉴스 렌더링
   ↓
이미지 서버 업로드 (img.dmssolution.co.kr)
   ↓
Threads 8장 캐러셀 발행

주제 하나를 입력하면, 완성된 카드뉴스가 Threads에 올라갑니다. 에이전트가 이 흐름을 전부 처리합니다.

여전히 남은 과제

자동화가 완성됐지만, 앞으로 개선할 것들이 있습니다.

발행 시간 예약: 지금은 즉시 발행합니다. 나중에는 예약 발행 기능을 추가할 수 있습니다. Threads API는 예약 발행을 지원하지만, 아직 구현하지 않았습니다.

반응 데이터 수집: 발행 후 좋아요, 댓글, 공유 수를 수집해서 어떤 콘텐츠가 잘 먹히는지 분석할 수 있습니다. 이 데이터를 MEMORY.md에 누적하면 에이전트가 더 나은 콘텐츠를 만들 수 있습니다.

더 많은 카피 패턴 학습: 지금은 카피 작성을 대표님이 직접 합니다. 나중에는 에이전트가 주제만 받으면 여러 가지 버전의 카피를 생성해서 제시할 수 있도록 개선할 수 있습니다.

주제 자동 제안: 지금은 주제를 수동으로 줍니다. 나중에는 에이전트가 삶의 지혜, 인사이트, 부, 건강 영역에서 스스로 주제를 발굴하고, 카드뉴스를 만들고, 발행하는 구조도 가능합니다. 이것이 가장 높은 단계의 자동화입니다.

19단계의 의미

18단계에서 에이전트의 기억이 완성됐습니다. 19단계는 그 에이전트가 만든 결과물을 세상에 내보내는 단계입니다.

카드뉴스 자동 생성 파이프라인은 16단계에서 완성됐고, 디자인 방향은 17단계에서 정해졌고, 에이전트의 기억은 18단계에서 갖춰졌습니다. 19단계는 그 모든 것을 연결해서 자동 발행까지 완료한 단계입니다.

이제 차은별은 주제를 받으면 시작부터 발행까지 혼자 끝냅니다. 이것이 완전한 에이전트의 모습입니다.

리도 프로필

리도 인사이트

기술을 현장 언어로 다시 풀어 쓰는 사람

3D 설계, 광통신 인프라 장비 개발, 글로벌 현장 교육을 19년 넘게 다뤄왔고, 요즘은 AI 자동화, 꿈꾸는 카메라, 실무 채널 운영을 연결해 복잡한 일을 더 쉽게 만드는 방법을 기록하고 있습니다.

다음 대화

읽고 끝내지 말고, 실제 문제로 이어가도 좋습니다.

자동화, 설계, 교육, 콘텐츠 중 무엇이든 지금 필요한 문제부터 같이 정리해볼 수 있습니다.

편하게 문의하기