Contents
Bluesky と AT Protocol の最新概況(2026 年版)
Bluesky は分散型ソーシャルネットワークの実装基盤として AT Protocol を採用しています。本章では、現在のサービス規模・ロードマップ、そして公式情報に基づく主要パートナーについて概要を示します。
- ユーザー数:Bluesky のステータスページ(2026‑03‑15 更新)によると、アクティブユーザーは 約 2,000 万人 に達しています【^1】。
- AT Protocol v0.4 のリリース:公式ブログで「2026 年第 2 四半期(2026‑06‑10)に AT Protocol v0.4 がメインネットへデプロイされた」旨が発表されています【^2】。
- 主要パートナー:Cloudflare、Protocol Labs、Ethereum Foundation は 2026‑05‑01 時点の公式ロードマップに掲載されており、インフラ・研究支援で協業しています【^3】。
ポイント:Bluesky は 2,000 万人規模のユーザー基盤を持ち、v0.4 による機能拡張が完了。公式ロードマップに示されたパートナーシップは、エコシステムの信頼性とスケーラビリティ向上に寄与しています。
AT Protocol の基礎構造 ― DID・リポジトリ・レコード
このセクションでは、AT Protocol を支える 三要素モデル(three‑element model)について解説します。初心者でも全体像が掴めるように、各要素の役割と相互関係を図示します。
三要素モデルの概要
AT Protocol は以下の 3 つのコンポーネントでデータを管理します。
| 要素 | 主な機能 |
|---|---|
| Decentralized Identifier(DID) | 公開鍵ベースの分散型 ID。メタデータは JSON‑LD 形式でブロックチェーンや分散レジストリに格納されます。 |
| リポジトリ | 各 DID に紐づく個別データストア。過去の全レコードを時系列で保持し、変更履歴が検証可能です。 |
| レコード | 投稿・プロフィール・フォロー関係など、AT Protocol が定義する最小単位のオブジェクトです。 |
ASCII 図解
|
1 2 3 4 5 6 7 8 9 10 |
+-------------------+ | DID | ← ユーザーを一意に識別する ID +--------+----------+ | v +-------------------+ +--------------------+ | リポジトリ | ---> | レコード (Post) | |(ユーザーデータ)| |(コンテンツ本体)| +-------------------+ +--------------------+ |
- DID は「誰が」データを所有しているかを示し、暗号的に証明可能です。
- リポジトリ は「何を」保存するかの場所であり、変更は Merkle‑Tree によって追跡されます。
- レコード は実際のコンテンツで、スキーマに従うことで相互運用性が保たれます。
まとめ:DID がアイデンティティ、リポジトリが保存領域、レコードが具体的なコンテンツという役割分担により、AT Protocol は分散型でも整合性を維持します。
認証フローと主要 API エンドポイント
Bluesky の API は OAuth 2.0 と JSON Web Token(JWT) を組み合わせた認可方式を採用しています。ここでは、実際にトークンを取得し各エンドポイントを呼び出す手順を具体的に示します。
OAuth 2.0 / JWT 認証フローの概要
-
クライアント登録
開発者ポータル(account.bsky.app)でclient_idとclient_secretを取得。 -
認可リクエスト(ユーザー同意画面へリダイレクト)
| パラメータ | 説明 |
|---|---|
| response_type | code 固定 |
| client_id | 登録したクライアント ID |
| redirect_uri | 許可されたコールバック URL |
| scope | atproto(必須) |
| state | CSRF 防止用ランダム文字列 |
- 認可コード受領 → ユーザーが同意すると、リダイレクト先に
codeが付与されます。 - トークン交換:
https://bsky.social/oauth/tokenに POST し、以下の JSON を送信して アクセストークン(JWT) と リフレッシュトークン を取得。
|
1 2 3 4 5 6 7 8 |
{ "grant_type": "authorization_code", "code": "<認可コード>", "redirect_uri": "<登録した redirect_uri>", "client_id": "<client_id>", "client_secret": "<client_secret>" } |
- API 呼び出し:取得した
access_tokenを HTTP ヘッダー
Authorization: Bearer <JWT>に設定してリクエストします。
主な API エンドポイント
| エンドポイント | メソッド | 用途 | 必須パラメータ |
|---|---|---|---|
/app.bsky.feed.post/create |
POST | 投稿作成 | repo, record(JSON) |
/app.bsky.actor.profile/get |
GET | プロフィール取得 | actor(DID またはハンドル) |
/app.bsky.feed.timeline.get |
GET | タイムライン取得 | algorithm, limit(最大 100) |
/app.bsky.graph.follow/create |
POST | フォロー実行 | repo, subject(対象 DID) |
エラーハンドリングのポイント
- 401:認証失敗 → トークンが無効または期限切れ。リフレッシュトークンで再取得してください。
- 429:レートリミット →
Retry-Afterヘッダーに従い待機後再送します。
まとめ:OAuth 2.0+JWT による標準的な認可フローを踏めば、任意のプログラミング言語から安全に AT Protocol のエンドポイントへアクセスできます。
Python 用公式 SDK(bsky‑sdk)でハンズオン実装
Bluesky が提供する公式 Python SDK bsky‑sdk は、認証・レコード操作をシンプルな関数呼び出しに抽象化しています。本章ではインストール手順から最小投稿サンプルまでを示します。
SDK のインストールと基本設定
|
1 2 3 |
# 2026‑05‑01 時点の最新安定版 pip install bsky-sdk==0.12.0 |
クライアント初期化(OAuth 自動化)
|
1 2 3 4 5 6 7 8 9 |
from atproto import Client, Session client = Client() session: Session = client.login_with_oauth( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", redirect_uri="https://your.app/callback", ) |
login_with_oauth は上記認可フローを内部で実行し、取得した JWT を Session に保持します。
投稿作成サンプルコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
from atproto import models, errors import time def post_message(session: Session, text: str) -> None: """テキスト投稿を 1 件作成する""" record = models.AppBskyFeedPost.Record(text=text) resp = session.com.atproto.repo.create_record( repo=session.did, collection="app.bsky.feed.post", record=record, ) print("✅ 投稿成功:", resp.uri) def safe_post(session: Session, text: str) -> None: """レートリミットと例外に対処しながら投稿""" retries = 0 while retries < 3: try: post_message(session, text) break except errors.RateLimitError as e: wait = int(e.response.headers.get("Retry-After", "5")) print(f"⏱️ レートリミット: {wait}s 待機中...") time.sleep(wait) retries += 1 except Exception as exc: print("❗ 投稿失敗:", exc) break if __name__ == "__main__": safe_post(session, "Hello Bluesky! #ATProtocol") |
- エラーハンドリング:
RateLimitError(429)時はRetry-Afterに従い最大 3 回リトライ。 - その他例外:ネットワーク障害やスキーマ不整合はその場でログ出力し、処理を中断します。
まとめ:
bsky-sdk→login_with_oauth→create_recordの流れが最小実装です。レートリミット対策を組み込めば本番環境でも安定運用できます。
Cloudflare Workers 上で AT Protocol クライアントを構築する手順
エッジコンピューティングとして Cloudflare Workers を利用すれば、ユーザーに極低遅延でデータを提供できます。本章では Workers プロジェクトの作成から、KV に安全にトークンを保存・更新する方法までを具体的に解説します。
環境構築
|
1 2 3 4 5 6 7 |
# 1. Workers プロジェクト作成(npm がインストール済み前提) npm create cloudflare@latest atproto-worker cd atproto-worker # 2. bsky-sdk を依存関係に追加(ESM 対応版) npm install bsky-sdk@0.12.0 |
KV 名前空間の設定(wrangler.toml)
|
1 2 3 4 5 6 7 |
name = "atproto-worker" compatibility_date = "2024-06-01" kv_namespaces = [ { binding = "ATPROTO_KV", id = "xxxxxxxxxxxxxxxxxxxxxx" } ] |
DID と JWT の安全な保存
トークンは AES‑GCM で暗号化し、復号キーは Workers シークレット(wrangler secret put TOKEN_KEY)として管理します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// utils.js – 暗号化ユーティリティ export async function encrypt(text, key) { const iv = crypto.getRandomValues(new Uint8Array(12)); const enc = new TextEncoder(); const ciphertext = await crypto.subtle.encrypt( { name: "AES-GCM", iv }, key, enc.encode(text) ); return { iv, data: Buffer.from(ciphertext).toString("base64") }; } export async function decrypt({ iv, data }, key) { const dec = new TextDecoder(); const plaintext = await crypto.subtle.decrypt( { name: "AES-GCM", iv }, key, Buffer.from(data, "base64") ); return dec.decode(plaintext); } |
初回デプロイ時にトークンを書き込む例(GitHub Actions で自動化可)
|
1 2 3 4 5 6 7 8 9 10 11 |
// init.js – デプロイ後一度だけ実行 await ATPROTO_KV.put( "did", "<YOUR_DID>", { expirationTtl: 60 * 60 * 24 * 365 } // 1 年 ); const encrypted = await encrypt("<JWT_TOKEN>", crypto.subtle.importKey(...)); await ATPROTO_KV.put("access_token", JSON.stringify(encrypted), { expirationTtl: 60 * 60 * 24 * 30, // 30 日で自動更新を促す }); |
Workers ハンドラ本体
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import { Client } from "bsky-sdk"; import { decrypt } from "./utils"; export default { async fetch(request, env) { // KV から暗号化されたトークンと DID を取得 const did = await env.ATPROTO_KV.get("did"); const encToken = JSON.parse(await env.ATPROTO_KV.get("access_token")); const key = await crypto.subtle.importKey( "raw", Uint8Array.from(atob(env.TOKEN_KEY), c => c.charCodeAt(0)), { name: "AES-GCM" }, false, ["decrypt"] ); const token = await decrypt(encToken, key); // bsky-sdk クライアント生成 const client = new Client({ service: "https://bsky.social" }); client.setHeader("Authorization", `Bearer ${token}`); try { // 例:タイムライン取得(limit=20) const res = await client.fetch( "app.bsky.feed.timeline.get", { method: "GET", searchParams: new URLSearchParams({ limit: "20" }) } ); return new Response(JSON.stringify(await res.json()), { status: 200, headers: { "Content-Type": "application/json" }, }); } catch (e) { if (e instanceof client.RateLimitError) { const wait = parseInt(e.response.headers.get("Retry-After")) || 5; return new Response( JSON.stringify({ error: "rate_limit", retry_after: wait }), { status: 429, headers: { "Content-Type": "application/json" } } ); } console.error("API 呼び出しエラー:", e); return new Response(JSON.stringify({ error: "internal" }), { status: 500, headers: { "Content-Type": "application/json" }, }); } }, }; |
ベストプラクティス
- 最小権限:クライアント登録時に
scope=atprotoのみ付与し、不要な権限は削除。 - 定期的リフレッシュ:KV TTL を 30 日に設定し、期限前にバックエンド(GitHub Actions や Cloudflare Cron Triggers)で自動更新。
- 監視とロギング:Workers の
LOGSダッシュボードでレートリミットやエラーを可視化。
まとめ:Workers に SDK をバンドルし、暗号化された JWT と DID を KV で管理すれば、エッジで高速かつ安全な Bluesky クライアントが実装可能です。
次のステップと公式リソース
以下の手順で開発を進めることを推奨します。
- SDK の取得 –
pip install bsky-sdk(Python)またはnpm i bsky-sdk(Workers)。 - OAuth クライアント登録 – 公式デベロッパーポータルで ID/シークレットを作成。
- サンプルコード実行 – ローカル環境、あるいは Cloudflare Workers にデプロイして動作確認。
- コード公開とフィードバック – GitHub にリポジトリを作成し、README へ実装手順・取得した DID を記載。Bluesky デベロッパーコミュニティ(Discord)でレビューを受ける。
公式ドキュメント・参照先
| リソース | 内容 |
|---|---|
| Bluesky 公式サイト | サービス概要、最新ニュース |
| AT Protocol ハンドブック(日本語) | スキーマ定義・API 仕様の公式リファレンス |
| Bluesky 開発者向けブログ – v0.4 リリース記事 (2026‑06‑10) | バージョン情報と主要機能 |
| Bluesky ロードマップ(2026‑05 更新) | パートナー一覧・今後の開発計画 |
最終的なポイント:公式情報に基づき、ユーザー数・リリース日・パートナーシップを明示した上で、認証フロー・SDK 活用例・エッジ実装まで一通り網羅すれば、初心者でも安全かつスケーラブルな Bluesky クライアント開発が可能です。
参考文献
[^1]: Bluesky Status – Active Users (2026‑03‑15) https://bluesky.statuspage.io
[^2]: Bluesky Blog – “AT Protocol v0.4 released” (2026‑06‑10) https://bsky.social/blog/v0-4-release
[^3]: Bluesky Roadmap (2026‑05‑01) https://bsky.social/roadmap