블로그

· 2분 분량

API로 Bluesky에 게시하고 예약하기, 10줄로

REST 호출 한 번으로 앱에서 Bluesky 글을 게시하고 예약하세요. 등록할 개발자 앱은 없습니다. cURL, JavaScript, Python 예제가 있습니다.

Bluesky는 자동화하기 가장 쉬운 소셜 네트워크 중 하나입니다. 등록할 개발자 앱도, 기다릴 심사 큐도 없습니다. 그래도 “쉽다”는 말은 세션, 레코드 형식, 링크와 멘션용 facet, 이미지 blob을 직접 다뤄야 한다는 뜻이고, Bluesky에는 예약 기능 자체가 없습니다.

이 가이드는 Hapi로 REST 호출 한 번에 Bluesky 글을 게시하고 예약하는 방법을 보여 줍니다. 같은 요청으로 X와 LinkedIn에도 동시에 올릴 수 있습니다.

1단계: Bluesky에서 앱 비밀번호 만들기

Bluesky에서 Settings → Privacy and security → App passwords → Add app password로 이동하세요. hapi 같은 이름을 붙이고 복사하세요.

앱 비밀번호로는 계정 비밀번호를 바꾸거나 계정을 삭제할 수 없습니다. 연동에 넘기기에 맞는 자격 증명입니다.

2단계: Hapi에서 계정 연결

Hapi 계정을 만들고 Accounts → Connect → Bluesky를 연 다음, 핸들과 앱 비밀번호를 붙여 넣으세요. Hapi는 자격 증명을 저장 시 암호화하고(AES-256-GCM), 브라우저로는 다시 돌려주지 않습니다.

그다음 API keys에서 API 키를 만드세요. 한 번만 보이므로 환경 변수에 넣으세요.

bash
export HAPI_API_KEY="hapi_live_..."

3단계: 글 게시

cURL

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Hello Bluesky, posted from an API 🦋",
    "platforms": ["bluesky"]
  }'

JavaScript

js
const res = await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    content: "Hello Bluesky, posted from an API 🦋",
    platforms: ["bluesky"],
  }),
});
console.log(await res.json());

Python

python
import os, requests

res = requests.post(
    "https://hapi.tools/v1/posts",
    headers={"Authorization": f"Bearer {os.environ['HAPI_API_KEY']}"},
    json={"content": "Hello Bluesky, posted from an API 🦋", "platforms": ["bluesky"]},
)
print(res.json())

이게 전부입니다. 201과 함께 게시물, 그리고 계정별 상태가 돌아옵니다.

4단계: 나중으로 예약

Bluesky는 예약 게시를 네이티브로 지원하지 않아서, 보통이라면 작업 실행기를 직접 만들어야 합니다. Hapi에서는 scheduledAt만 추가하면 됩니다.

json
{
  "content": "This goes out Monday morning",
  "platforms": ["bluesky"],
  "scheduledAt": "2026-11-16T09:00:00-03:00"
}

Hapi 스케줄러가 정시에 게시하고, 서명된 post.published(또는 post.failed) 웹훅을 보내므로 앱이 결과를 알 수 있습니다.

5단계: Bluesky, X, LinkedIn에 한 번에

같은 요청에 플랫폼만 더합니다.

json
{
  "content": "We just shipped v2 🚀",
  "platforms": ["bluesky", "x", "linkedin"],
  "platformOptions": {
    "bluesky": { "content": "We just shipped v2 🚀 (Bluesky gets the short version)" }
  }
}

platformOptions로 네트워크마다 문구를 바꿀 수 있습니다. Bluesky는 글을 300자로 제한해서, 이럴 때 유용합니다.

재시도할 때 두 번 올리지 않기

네트워크는 가끔 끊깁니다. Idempotency-Key 헤더를 보내면 Hapi는 복제본을 만들지 않고 원래 게시물을 돌려줍니다.

bash
-H "Idempotency-Key: release-v2-announcement"

API를 호출하는 쪽이 AI 에이전트라면 이건 더 중요합니다.

직접 만들지 않아서 건너뛴 것

  • AT Protocol에 대한 세션 생성과 갱신
  • 링크와 멘션 facet을 손으로 만들기
  • 이미지 blob을 업로드하고 레코드에 붙이기
  • 스케줄러, 재시도, 실패 알림

15일 체험 시작 → $5 체험에는 15일 동안 연결 계정 5개와 게시물 300개가 포함됩니다.