📚 이 글은 “개발자가 AI 자동화로 부업하는 실전 기록” 시리즈입니다.
- 📌 1편: WordPress + Claude API 자동화 환경 세팅기
- 📌 2편: Slack 봇으로 블로그 발행 트리거 만들기
- 📌 3편: Threads API로 블로그 자동 배포 연결하기 (현재 글)
- 📌 4편: Claude가 쓴 글, 실제로 수익이 날까? 애드센스 연동 기록 (예정)
← 2편: Slack 봇으로 블로그 발행 트리거 만들기
솔직히 말하면, Day 3는 시작부터 기분이 좋지 않았다.
블로그 발행 자동화가 어느 정도 돌아가기 시작하니까, 자연스럽게 다음 욕심이 생겼다. “어차피 글 올라가는 거, SNS에도 자동으로 뿌려지면 안 되나?” 트래픽을 조금이라도 더 모으려면 SNS 유입이 필요하다는 걸 너무 잘 알고 있었으니까. 처음엔 인스타그램 자동화를 생각했다. 그런데 찾아보니 Meta의 Instagram Graph API는 비즈니스 계정 필수에 Facebook 페이지 연결 필수에, 심사에 앱 검수까지 필요하다. 개인 개발자가 혼자 하기엔 진입 장벽이 너무 높았다.
그때 눈에 들어온 게 Threads API였다. 2024년에 Meta가 공개한 Threads API는 인스타그램 Graph API 기반이긴 한데, 개인 크리에이터도 접근이 가능하고 구조가 훨씬 단순했다. “이거다” 싶었다. 그리고 바로 뛰어들었다가, 예상치 못한 벽을 몇 개 만났다.
Threads API, 생각보다 까다로운 진입 절차
처음에 가장 많이 헷갈린 부분이 “어디서 시작하냐”는 거였다. Threads API는 Meta Developer 플랫폼을 통해서만 접근할 수 있다. 대략적인 흐름은 이렇다.
- ✅ Meta Developer 계정 생성 (developers.facebook.com)
- ✅ 앱 생성 → 앱 유형: “기타” 또는 “비즈니스” 선택
- ✅ Threads API 제품 추가
- ✅ Threads 계정과 앱 연결 (Threads 설정 > 계정 > 웹사이트 권한)
- ✅ 액세스 토큰 발급 (단기 토큰 → 장기 토큰으로 교환)
문제는 여기서 터졌다. 앱을 “개발 모드”로 만들면 본인 계정에만 토큰 발급이 가능하다. 이건 나한테는 오히려 좋은 조건이었다. 어차피 내 블로그 글을 내 Threads 계정에 올리면 되니까. 별도의 앱 심사 없이 개발 모드 상태로도 자동화 운영이 가능하다는 게 핵심 포인트였다.
그런데 삽질 포인트가 하나 있었다. 단기 액세스 토큰의 유효기간이 1시간이다. 자동화 시스템에 1시간짜리 토큰을 넣으면 당연히 금방 죽는다. 장기 토큰으로 교환하는 API 호출을 반드시 해야 하고, 장기 토큰도 60일이 만료이기 때문에 이것도 주기적으로 갱신하는 로직이 필요하다. 이 부분을 처음엔 몰라서 “왜 토큰이 자꾸 죽지?” 하고 2시간 날렸다.
Threads API는 개인 개발자도 개발 모드에서 충분히 사용 가능하다. 단, 토큰 만료 주기를 반드시 이해하고 시작해야 한다.
Instagram Graph API vs Threads API — 무엇이 다른가
둘 다 Meta 플랫폼 기반이라 헷갈리는 사람이 많을 것 같아서 비교표로 정리해봤다. 내가 Threads API를 선택한 이유도 이 표 안에 있다.
| 항목 | Instagram Graph API | Threads API |
|---|---|---|
| 계정 요건 | 비즈니스/크리에이터 계정 필수 | 일반 Threads 계정으로도 가능 |
| Facebook 페이지 연결 | 필수 | 불필요 |
| 앱 심사 | 퍼블릭 배포 시 필요 | 개발 모드로 본인 계정 운용 가능 |
| 텍스트 포스팅 | 지원 안 함 (미디어 필수) | 텍스트 단독 포스팅 지원 |
| 링크 첨부 | 캡션에 URL 포함 (클릭 불가) | 링크 포함 텍스트 포스팅 가능 |
| 개인 개발자 난이도 | 높음 | 상대적으로 낮음 |
텍스트 단독 포스팅이 가능하다는 게 나한테는 결정적이었다. 블로그 글 제목 + 요약 + 링크를 텍스트로 그냥 던지면 되니까. 이미지 생성이나 첨부 같은 추가 작업이 없어도 된다는 게 자동화 파이프라인 단순화에 큰 도움이 됐다.
텍스트 링크 포스팅이 가능한 Threads API는 블로그 자동 배포 용도로 Instagram보다 훨씬 실용적이다.
자동화 파이프라인 설계 — 글 발행부터 Threads 포스팅까지
내가 설계한 흐름은 단순하다. 2편에서 만든 Slack 봇 트리거와 연결했다.
- Slack에서 명령어 입력 → Claude API가 글 초안 생성
- WordPress REST API로 글 발행 (JWT 인증)
- 발행된 글의 URL + 제목 + 요약을 Threads API로 포스팅
- Slack으로 “발행 완료 + Threads 링크” 결과 리포트
3번 단계에서 Threads에 올릴 텍스트는 Claude API로 따로 한 번 더 생성한다. 블로그 글 본문을 그대로 올릴 수는 없으니까. SNS용 짧은 후킹 문구 + 블로그 링크 형태로. Claude한테 “이 글 제목과 요약을 보고 Threads에 올릴 200자 이내의 흥미로운 소개 문구를 써줘”라고 시키면 꽤 쓸만한 결과가 나온다.
실전 코드 — Threads API 포스팅 함수
Threads API 포스팅은 2단계다. 먼저 미디어 컨테이너를 만들고(creation step), 그다음 publish 요청을 보낸다. 이 구조를 모르면 “왜 POST 한 번에 안 올라가지?” 하고 헤맬 수 있다. 나도 처음에 그랬다.
⚙️ 사전 준비: Meta Developer 앱에서 Threads API 제품이 추가되어 있어야 하고, 장기 액세스 토큰(Long-Lived Access Token)과 Threads User ID가 준비되어 있어야 합니다. .env 파일에 THREADS_ACCESS_TOKEN과 THREADS_USER_ID를 설정하세요.
import os
import requests
from dotenv import load_dotenv
load_dotenv()
THREADS_ACCESS_TOKEN = os.getenv("THREADS_ACCESS_TOKEN")
THREADS_USER_ID = os.getenv("THREADS_USER_ID")
THREADS_API_BASE = "https://graph.threads.net/v1.0"
def post_to_threads(text: str) -> dict:
"""
Threads에 텍스트 포스팅 (2단계: 컨테이너 생성 → 퍼블리시)
"""
# 1단계: 미디어 컨테이너 생성
create_url = f"{THREADS_API_BASE}/{THREADS_USER_ID}/threads"
create_payload = {
"media_type": "TEXT",
"text": text,
"access_token": THREADS_ACCESS_TOKEN,
}
create_res = requests.post(create_url, data=create_payload)
create_data = create_res.json()
if "id" not in create_data:
raise Exception(f"컨테이너 생성 실패: {create_data}")
container_id = create_data["id"]
# 2단계: 퍼블리시
publish_url = f"{THREADS_API_BASE}/{THREADS_USER_ID}/threads_publish"
publish_payload = {
"creation_id": container_id,
"access_token": THREADS_ACCESS_TOKEN,
}
publish_res = requests.post(publish_url, data=publish_payload)
publish_data = publish_res.json()
if "id" not in publish_data:
raise Exception(f"퍼블리시 실패: {publish_data}")
return {
"threads_post_id": publish_data["id"],
"status": "published",
}
실제로 돌려보면 응답이 꽤 빠르다. 컨테이너 생성과 퍼블리시 합쳐서 2~3초 이내로 완료된다. 다만 주의할 점이 있는데, 퍼블리시 요청을 컨테이너 생성 직후 바로 보내면 간혹 “컨테이너가 준비되지 않았다”는 에러가 뜬다. 나는 중간에 `time.sleep(1)` 을 하나 끼워넣어서 해결했다. 공식 문서에도 짧은 대기를 권장하고 있다.
Claude로 Threads용 홍보 문구 자동 생성하기
이 부분이 개인적으로 가장 재밌었다. 블로그 글 제목과 요약을 Claude에 넘기면, SNS에 어울리는 짧고 흥미로운 문구를 바로 뽑아준다. 아래 코드는 Slack 봇 파이프라인 안에서 호출하는 방식으로 연결했다.
⚙️ 사전 준비: anthropic 라이브러리가 설치되어 있어야 하고, .env에 ANTHROPIC_API_KEY가 설정되어 있어야 합니다. 블로그 발행 후 반환된 포스트 URL을 blog_url 인자로 넘겨주세요.
import anthropic
import os
from dotenv import load_dotenv
load_dotenv()
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
def generate_threads_caption(title: str, summary: str, blog_url: str) -> str:
"""
블로그 글 정보를 받아 Threads 포스팅용 캡션 생성
"""
prompt = f"""다음 블로그 글을 Threads SNS에 홍보하는 짧은 문구를 작성해줘.
글 제목: {title}
글 요약: {summary}
블로그 링크: {blog_url}
조건:
- 전체 200자 이내
- 궁금증을 유발하는 첫 문장으로 시작
- 마지막에 블로그 링크 포함
- 해시태그 3개 이내로 자연스럽게 포함
- 말투는 친근하고 자연스럽게, 과장 금지
"""
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=300,
messages=[{"role": "user", "content": prompt}],
)
return message.content[0].text.strip()
실제로 이 함수가 뽑아주는 문구가 내가 직접 쓰는 것보다 훨씬 SNS 친화적이다. 처음엔 “AI가 쓴 게 티 나지 않을까?” 걱정했는데, 조건을 잘 잡아주면 생각보다 자연스럽다. 물론 가끔 너무 마케팅 느낌이 강한 문구가 나올 때는 손으로 살짝 다듬기도 한다.
Claude에게 SNS 문구까지 맡기면 블로그 발행부터 Threads 홍보까지 사람이 건드릴 게 없어진다.
Day 3 솔직한 평가 — 뿌듯함 60%, 불안함 40%
시스템이 처음으로 완전히 한 사이클을 돌았다. Slack에서 명령어 하나 치면, Claude가 글 쓰고, WordPress에 발행되고, Threads에 홍보 문구까지 올라간다. 처음으로 이 흐름이 에러 없이 돌아가는 걸 봤을 때, 진짜 뿌듯했다. 개발자라서 자동화 자체가 새로운 건 아닌데도 이상하게 기분이 좋았다.
그런데 솔직히 불안한 부분도 있다. Threads API가 아직 베타 성격이 강하다. Meta가 정책을 바꾸거나 API를 조용히 바꿔버리면 자동화 파이프라인이 한순간에 무너질 수 있다. 내가 티스토리에서 겪었던 그 상황이 또 반복될 수도 있다는 거다. 그래서 Threads 의존도를 너무 높이지 않고, 파이프라인 상에서 Threads 실패 시 그냥 스킵하고 넘어가는 예외 처리를 반드시 넣어뒀다.
월 고정비용도 같이 공개하자면, Hostinger $4.99 + Claude API 사용량 기준으로 이번 달은 약 19,000원 정도 나올 것 같다. Threads API는 현재 무료다. 비용 대비로는 나쁘지 않다고 생각하는데, 아직 수익이 0원이라는 게 함정이긴 하다.
자동화 시스템은 완성됐지만, 수익은 아직 0원이다. 결국 콘텐츠가 쌓여야 의미가 생긴다.
📌 다음 편: Claude가 쓴 글, 실제로 수익이 날까? 애드센스 연동 실전기
- 자동화로 쌓인 글들의 애드센스 심사 통과 여부
- AI 생성 콘텐츠에 대한 Google 정책 현황
- 첫 수익 발생까지 걸린 시간과 현실적인 기대치
- 트래픽 0에서 시작하는 SEO 전략 보완