Facebook·Threads 직접 API 연동
스케줄러 없이 Graph API·Threads API로 직접 발행
Facebook 페이지에 Graph API로 자동 포스팅하고, Meta Threads API로 스레드에 직접 발행합니다. 개인 프로필은 API 제약이 있어 Aside 브라우저 방식을 함께 다룹니다.
예상 소요 시간 약 50분
스케줄러를 쓰지 않는 이유
이 강은 선택 과정입니다. 7강까지의 스케줄러 방식으로 이미 충분하다면 건너뛰어도 됩니다. 설정이 길고(Meta 앱, 토큰) 어렵게 느껴지면 Threads 한 채널만 해보세요. 모든 발행은
--draft로 먼저 확인한 뒤, 사람이 최종 발행합니다.
용어 한 줄: Graph API는 페이스북의 공식 창구, Page Access Token은 "이 페이지에 글을 써도 된다"는 열쇠(비밀번호 같은 것,
.env에만 보관), 앱 리뷰는 Meta가 앱 권한을 심사하는 절차입니다.
5강까지는 스케줄러 하나에 모든 채널을 연결했습니다. 그런데 두 가지 경우에는 직접 API를 쓰는 게 낫습니다.
- 스케줄러 비용을 줄이고 싶을 때 — Facebook 페이지와 Threads는 공식 API가 무료입니다
- 파이프라인 안에서 발행까지 한 번에 돌리고 싶을 때 — 스크립트 한 줄로 끝
이 강에서는 Facebook Graph API(페이지)와 Meta Threads API를 직접 연동합니다.
Facebook은 페이지와 개인 프로필의 자동화 범위가 다릅니다.
페이지 — Graph API로 자동 포스팅
Facebook 페이지(예: "영어 듣기 대충영어" 같은 브랜드 페이지)는 Graph API로 텍스트·이미지·링크 포스팅이 가능합니다.
따라하기 1: 앱 만들기 & Page Access Token 발급
- Meta for Developers 접속: developers.facebook.com 로그인
- 앱 만들기:
내 앱→앱 만들기→비즈니스유형 선택 → 앱 이름 입력 - 제품 추가: 앱 대시보드에서
Facebook 로그인제품 추가 - Graph API 탐색기에서 토큰 발급: developers.facebook.com/tools/explorer
- 앱 선택 →
Get User Access Token→ 권한에pages_manage_posts,pages_read_engagement체크 - 토큰 받은 뒤 →
페이지 액세스 토큰으로 교환: 드롭다운에서 페이지 선택
- 앱 선택 →
- 장기 토큰으로 교환: 단기 토큰은 1~2시간 만료. Claude Code에게 시킵니다:
Graph API 탐색기에서 받은 단기 Page Access Token을 장기 토큰(60일)으로 교환하는 curl 명령을 만들어줘. 앱 ID와 앱 시크릿은 .env에서 읽어.
.env에 추가:
FB_APP_ID=...
FB_APP_SECRET=...
FB_PAGE_ID=...
FB_PAGE_ACCESS_TOKEN=장기토큰
따라하기 2: 포스팅 스크립트
scripts/fb-post.py를 만들어줘.
- .env에서 FB_PAGE_ID, FB_PAGE_ACCESS_TOKEN 읽기 (값은 출력하지 마)
- variants.json의 facebook 항목에서 텍스트, 링크(UTM 포함) 가져오기
- Graph API의
/{page-id}/feed엔드포인트로 POST - 성공하면 게시물 ID와 URL 출력, 실패하면 에러 메시지
--draft옵션: published=false로 비공개 게시 (검수용). 옵션 없이는 실행하기 전에 "정말 발행할까요?"를 물어봐
fb-post.py에 이미지 지원을 추가해줘. cards/에 이미지가 있으면 /{page-id}/photos로 먼저 업로드한 뒤 게시해. --draft에서도 같게 동작해야 해.
실행도 클로드 데스크탑 Code 탭에서 이렇게 시키세요.
scripts/fb-post.py를 --draft 옵션으로 실행해서 비공개로 먼저 올려줘. 결과 URL을 알려줘.
권한 요청의 명령에 --draft가 들어 있는지 읽고 수락합니다. 비공개 결과를 확인한 뒤에만 "이제 --draft 없이 실제로 발행해줘"라고 시키세요.
터미널로도 할 수 있어요
python3 scripts/fb-post.py --draft # 비공개로 먼저 확인
python3 scripts/fb-post.py # 실제 발행
🧪 실습
-
--draft로 실행한 결과 URL을 열었고, 페이지 관리자 화면에서 비공개(초안) 글로 보이는 것을 확인했다 - 글 내용·링크·이미지가 맞는 것을 눈으로 확인한 뒤에 사람이 최종 발행을 지시했다
- 발행된 글을 페이지에서 직접 열어봤다
더 해보기(선택): 예약 발행
Graph API는 예약 발행도 지원합니다:
fb-post.py에 --schedule "2025-02-01 09:00" 옵션을 추가해줘. scheduled_publish_time 파라미터로 Unix 타임스탬프 변환해서 보내고, published=false 설정.
더 해보기(선택): 개인 프로필 — Aside 브라우저 방식
개인 프로필(예: "오승종")은 Graph API로 자동 포스팅이 제한됩니다. publish_to_groups, user_posts 등의 권한은 앱 리뷰(Meta 심사)를 통과해야 하고, 개인 계정용 발행 API는 사실상 닫혀 있습니다.
현실적인 방법은 **Aside 브라우저(Computer Use)**입니다:
Computer Use로 facebook.com에서 내 개인 프로필에 글을 올려줘.
- variants.json의 facebook-personal 항목에서 텍스트와 이미지를 가져와
- 게시물 작성 → 텍스트 입력 → 이미지 첨부 → ⏸ "게시할까요?" 확인 후 게시 버튼
개인 프로필 포스팅이 필요한 분만 하세요. 페이지 하나로 충분한 경우가 많습니다.
Threads — Meta Threads API로 직접 발행
Meta는 Threads API를 공식 공개했습니다. 텍스트, 이미지, 링크 포스팅이 가능합니다.
따라하기 4: Threads API 설정
- 같은 Meta 앱 사용: 따라하기 1에서 만든 앱을 그대로 씁니다
- 제품 추가: 앱 대시보드 →
Threads API 사용 사례제품 추가 - 권한 설정:
threads_basic,threads_content_publish스코프 추가 - Access Token: Facebook 로그인 플로우로 Threads 토큰을 발급받습니다
Threads API용 Access Token을 발급받는 절차를 알려줘. 앱 ID는 .env에서 읽고, OAuth 인증 URL을 브라우저에서 열어 코드를 받은 뒤 장기 토큰으로 교환하는 과정까지.
.env에 추가:
THREADS_USER_ID=...
THREADS_ACCESS_TOKEN=장기토큰
따라하기 5: Threads 포스팅 스크립트
scripts/threads-post.py를 만들어줘.
- .env에서 THREADS_USER_ID, THREADS_ACCESS_TOKEN 읽기 (값은 출력하지 마)
- variants.json의 threads 항목에서 텍스트, 링크 가져오기
- Threads API 2단계 발행:
POST /{user-id}/threads→ media container ID 생성 (media_type=TEXT, text=내용, link_attachment=URL)POST /{user-id}/threads_publish→ container ID로 실제 발행
- 성공하면 스레드 ID와 URL 출력
--draft옵션: 1단계(컨테이너 생성)만 하고 발행은 안 함 (확인용)
threads-post.py에 이미지 지원을 추가해줘. 이미지가 있으면 media_type=IMAGE, image_url을 사용해줘. --draft도 같게 동작해야 해.
Code 탭에서는 이렇게 시키세요.
scripts/threads-post.py를 --draft 옵션으로 실행해서 컨테이너만 만들어줘. 확인하기 전에는 발행하지 마.
확인 후에 "이제 실제로 발행해줘"라고 하면 됩니다. 권한 요청의 명령을 매번 읽고 수락하세요.
터미널로도 할 수 있어요
python3 scripts/threads-post.py --draft # 컨테이너만 생성
python3 scripts/threads-post.py # 실제 발행
🧪 실습
-
--draft로 컨테이너만 만들었고, 아직 발행되지 않은 것을 확인했다 - 내 Threads 프로필에 글이 올라가지 않은 상태를 앱에서 눈으로 봤다
- 사람이 최종 확인한 뒤에만 실제 발행했고, 올라간 글을 앱에서 열어봤다
Threads API 제약 사항
| 항목 | 내용 |
|---|---|
| 발행 한도 | 24시간 내 250개 (충분) |
| 지원 미디어 | 텍스트, 이미지(JPEG/PNG), 동영상, 캐러셀 |
| 답글 | API로 가능하지만 이 과정에서는 손으로 |
| 인사이트 | threads_basic 스코프로 조회수·좋아요 등 수집 가능 |
스킬 파이프라인에 추가
7강에서 만든 SNS 배포 스킬에 직접 API 발행 단계를 추가합니다:
## 3-B. 직접 API 발행 (8강, 선택)
- 스케줄러 대신 직접 API를 쓰는 채널:
- Facebook 페이지: `python3 scripts/fb-post.py --draft` → ⏸ 확인 → 발행
- Threads: `python3 scripts/threads-post.py --draft` → ⏸ 확인 → 발행
- 개인 프로필은 Computer Use로 반자동
- 나머지 채널은 기존 스케줄러 경로 유지
channels.json 업데이트
channels.json에 Facebook과 Threads 직접 API 경로를 추가합니다:
channels.json에 facebook-page와 threads 채널을 추가해줘.
- facebook-page: max_chars 63206, image_ratio "1.91:1" 또는 "1:1", publish_method "graph_api"
- threads: max_chars 500, image_ratio "1:1", publish_method "threads_api"
- facebook-personal: publish_method "aside_browser" (수동)
토큰 만료 관리
| 토큰 | 유효기간 | 갱신 |
|---|---|---|
| Facebook Page (장기) | 60일 | 60일마다 재발급. 스크립트에 만료 7일 전 경고 추가 |
| Threads (장기) | 60일 | 같은 방식. token_expires 필드를 .env에 |
| Facebook 개인 프로필 | — | Aside 방식이라 토큰 불필요 |
fb-post.py와 threads-post.py에 토큰 만료일 체크를 넣어줘. 7일 이내면 "⚠️ 토큰이 N일 뒤 만료됩니다. 갱신하세요." 경고.
오늘의 체크리스트
- (선택 과정) Meta for Developers에 앱을 만들고 Page Access Token을 발급했다
-
fb-post.py --draft로 비공개 게시 후 확인, 발행까지 성공했다 - Threads API 토큰을 발급하고
threads-post.py로 텍스트+링크 발행에 성공했다 - channels.json에 facebook-page, threads 채널이 추가됐다
- 스킬 파일에 직접 API 발행 단계(3-B)가 있다
- 커밋했다
다음 단계
이 과정의 7개 채널(X·스레드·인스타·링크드인·카카오채널·Facebook 페이지·Facebook 개인)이 모두 갖춰졌습니다. "배포해줘" 한 줄이면 스케줄러 경로와 직접 API 경로가 함께 돌아갑니다.