
인스타그램이나 스레드에서 "홈페이지 제작은 OO" 같은 문구가 날마다 조금씩 바뀌어 올라오는 계정을 본 적이 있을 겁니다. 이런 계정 상당수는 AI로 글을 만들고 예약 발행 도구로 올립니다. 이 글은 내 스레드 계정 하나를 로컬 봇으로 자동 운영하는 방법을 처음부터 순서대로 정리한 것입니다. 앱 심사 없이 본인 계정만으로 바로 시작할 수 있습니다.
전체 구조
자동화는 두 부분으로 나뉩니다.
- 글 만들기 (AI) — Claude나 ChatGPT API에 주제·말투·길이를 정해 주고 초안을 여러 개 받습니다.
- 올리기 (Threads API) — Meta가 공개한 Threads API로 글을 게시합니다. 예약은 cron 같은 스케줄러가 맡습니다.
코드 없이 하려면 Make, Zapier, n8n, Buffer 같은 도구가 이 두 단계를 이미 연결해 두었습니다. 아래는 직접 만드는 방법입니다.
1단계. Meta 개발자 앱 만들기
- developers.facebook.com에 페이스북 계정으로 로그인해 개발자로 등록합니다.
- 내 앱 > 앱 만들기를 누르고, 사용 사례(Use case) 선택 화면에서 Threads API 액세스(Threads use case)를 고릅니다.
- 앱을 만들면 앱 ID와 시크릿이 두 쌍 생깁니다. 일반 앱용 한 쌍과 Threads 전용 한 쌍인데, 이 글에서 쓰는 것은 Threads 전용 값입니다. 사용 사례 > Threads > 설정 화면에서 확인할 수 있습니다. 여기서 헷갈려 인증이 계속 실패하는 경우가 많습니다.
- 같은 설정 화면에서 유효한 OAuth 리디렉션 URI를 등록합니다. 나중에 인증 요청에 넣는 주소와 글자 하나까지 똑같아야 합니다. 로컬 봇이라면 내 사이트 아무 페이지나 적어 두고, 로그인 후 주소창에 붙어 오는
code값만 복사해 쓰면 됩니다. - 권한(사용 사례 > 맞춤 설정)에서
threads_basic(기본, 모든 호출에 필요)과threads_content_publish(게시)를 켭니다. 댓글 관리나 통계가 필요하면threads_manage_replies,threads_manage_insights를 추가합니다.
2단계. 내 계정을 테스터로 등록하기
앱 심사를 받지 않은 개발 모드에서도 테스터로 등록된 계정은 API를 쓸 수 있습니다. 나 혼자 쓰는 봇이면 이걸로 충분합니다.
- 앱 대시보드 > 앱 역할 > 역할 탭에서 사람 추가를 누르고, 역할을 Threads 테스터로 골라 내 스레드 사용자 이름을 넣습니다.
- 스레드 앱(또는 웹)에서 계정 설정 > 웹사이트 권한으로 들어가 초대를 수락합니다. 수락하지 않으면 인증 화면에서 오류가 납니다.
주의. 다른 사람 계정까지 대신 운영하는 서비스를 만들 거라면 정식 앱 심사가 필요합니다. 개인 봇은 해당되지 않습니다.
3단계. 액세스 토큰 받기
브라우저로 아래 주소를 열어 로그인하고 허용하면, 리디렉션 주소 뒤에 ?code=...가 붙어 돌아옵니다.
https://threads.com/oauth/authorize
?client_id=앱ID
&redirect_uri=등록한_리디렉션_URI
&scope=threads_basic,threads_content_publish
&response_type=code
code는 1시간 동안만 유효합니다. 이 code를 토큰으로 바꾸고, 1시간짜리 단기 토큰을 60일짜리 장기 토큰으로 교환합니다.
# code -> 단기 토큰 (응답에 user_id 도 함께 옵니다)
curl -X POST https://graph.threads.com/oauth/access_token \
-F client_id="$THREADS_APP_ID" \
-F client_secret="$THREADS_APP_SECRET" \
-F grant_type=authorization_code \
-F redirect_uri="$REDIRECT_URI" \
-F code="$CODE"
# 단기 토큰 -> 장기 토큰 (60일)
curl "https://graph.threads.com/access_token?grant_type=th_exchange_token&client_secret=$THREADS_APP_SECRET&access_token=$SHORT_TOKEN"
받은 장기 토큰과 user_id는 코드에 적지 말고 .env 파일에 넣어 둡니다. 코드를 깃허브에 올리거나 남에게 보여 주다가 토큰이 새는 경우가 가장 흔합니다.
4단계. 글 올리는 코드
게시는 두 번의 호출로 이루어집니다. 먼저 컨테이너(올릴 글 묶음)를 만들고, 그 ID로 발행합니다.
import os, time, httpx
API = "https://graph.threads.com/v1.0"
USER_ID = os.environ["THREADS_USER_ID"]
TOKEN = os.environ["THREADS_TOKEN"]
def post_thread(text: str, image_url: str | None = None) -> str:
params = {"access_token": TOKEN, "text": text}
if image_url:
params |= {"media_type": "IMAGE", "image_url": image_url}
else:
params["media_type"] = "TEXT"
# 1) 컨테이너 생성
r = httpx.post(f"{API}/{USER_ID}/threads", params=params)
r.raise_for_status()
creation_id = r.json()["id"]
# 이미지가 있으면 서버 처리 시간을 기다린다 (공식 권장 약 30초)
if image_url:
time.sleep(30)
# 2) 발행
r = httpx.post(f"{API}/{USER_ID}/threads_publish",
params={"creation_id": creation_id, "access_token": TOKEN})
r.raise_for_status()
return r.json()["id"] # 게시물 ID
이미지는 파일 업로드가 아니라 공개 URL로 넘깁니다. 내 서버나 스토리지에 올려 둔 이미지 주소를 쓰면 됩니다.
5단계. AI로 글 만들기
AI에게는 "무엇을 쓰라"보다 "어떤 사람이 어떤 말투로 쓰는지"를 구체적으로 주는 편이 결과가 좋습니다.
너는 10년차 웹 에이전시 대표다. 스레드에 올릴 글을 쓴다.
- 주제: {오늘의 주제}
- 500자 이내, 반말 섞인 편한 말투, 해시태그 1개 이하
- 첫 줄에 실무에서 겪은 구체적인 장면을 넣을 것
- 광고 문구처럼 같은 문장을 반복하지 말 것
서로 다른 관점으로 3개를 써 줘.
주제는 미리 목록(스프레드시트나 텍스트 파일)으로 쌓아 두고 하나씩 꺼내 쓰면, 매일 비슷한 글이 반복되는 걸 막을 수 있습니다.
6단계. 예약 실행과 토큰 갱신
로컬 봇이면 cron 한 줄이면 됩니다. 예를 들어 매일 오전 9시에 실행하려면:
0 9 * * * cd ~/threads-bot && ./venv/bin/python bot.py >> bot.log 2>&1
장기 토큰은 60일이 지나면 만료됩니다. 발급 후 24시간이 지났고 아직 만료되지 않은 토큰은 아래 호출로 다시 60일 연장할 수 있으니, 봇이 일주일에 한 번쯤 갱신하게 해 두면 잊어버릴 일이 없습니다.
curl "https://graph.threads.com/refresh_access_token?grant_type=th_refresh_token&access_token=$THREADS_TOKEN"
알아 둘 제한과 주의점
| 항목 | 내용 |
|---|---|
| 글자 수 | 게시물당 500자 |
| 게시 횟수 | 계정당 24시간에 250개 |
| 토큰 수명 | 장기 토큰 60일, 주기적으로 갱신 |
| 이미지 | 공개 URL로 전달, 발행 전 처리 대기 |
한도가 넉넉해 보여도 하루 1~3개가 적당합니다. 같은 문장을 키워드만 바꿔 반복하면 도달이 떨어지고 스팸으로 판정될 수 있습니다. 처음에는 AI가 만든 초안을 사람이 한 번 보고 승인한 것만 올라가게 해 두는 것을 권합니다. 완전 무인은 글 품질이 안정된 뒤에 켜도 늦지 않습니다.
정리
- Meta 개발자 앱 생성, 권한 두 개 선택
- 내 계정을 테스터로 등록하고 수락
- code, 단기 토큰, 장기 토큰 순으로 발급해
.env에 저장 - 컨테이너 생성 후 발행, 두 번 호출로 게시
- AI에게 인물·말투·제약을 주고 초안 생성
- cron으로 예약, 토큰은 주기적으로 갱신
여기까지면 나만 쓰는 스레드 봇이 돌아갑니다. 막히는 단계가 있으면 댓글로 남겨 주세요.