Contents
はてなブックマーク API 全体像と主要エンドポイント
結論
はてなブックマークが提供する API は大きく分けて次の 2 系統に分類できます。
| 系統 | 主な用途 | 認証要否 | 代表エンドポイント |
|---|---|---|---|
| はてなブックマークリスト API(公開情報取得) | 任意 URL のエントリー情報・ブックマーカ数だけを取得。外部サービスへの埋め込みやトレンド分析に最適。 | なし(公開データのみ) | https://b.hatena.ne.jp/entry/json/{url} |
| はてなブックマーク REST API(認証必須) | 認証ユーザーのブックマーク取得、追加・削除、タグ操作などフル CRUD。自作ツールやバックエンド連携に利用。 | OAuth 1.0a 必要 | https://bookmark.hatena.com/rest/v1/bookmarks |
※公式ドキュメント
- はてなブックマークリスト API: https://developer.hatena.ne.jp/ja/documents/bookmark/apis/getinfo/
- はてなブックマーク REST API: https://developer.hatena.ne.jp/ja/documents/bookmark/apis/rest/
1. エンドポイントとサンプルレスポンス
1‑1. 公開情報取得(はてなブックマークリスト API)
|
1 2 |
GET https://b.hatena.ne.jp/entry/json/{url} |
例
|
1 2 3 4 5 6 7 8 |
{ "title": "Example Site", "url": "https://example.com/", "count": 1234, "eid": "abcdefg", "tags": ["tech", "news"] } |
1‑2. 認証ユーザー向け CRUD(はてなブックマーク REST API)
- 取得(GET)
|
1 2 3 4 |
GET https://bookmark.hatena.com/rest/v1/bookmarks?count=100 Authorization: OAuth oauth_consumer_key="...", oauth_token="..." User-Agent: MyApp/1.0 (Contact: dev@example.com) |
レスポンス例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "bookmarks": [ { "entry_url": "https://example.com/", "comment": "便利な情報", "tags": ["programming"], "timestamp": "2026-05-04T12:34:56+09:00" } /* ... */ ], "user": "your_user_id" } |
1‑3. 非公式「全文検索 API」
|
1 2 |
GET https://bookmark.hatena.com/search.json?q=keyword |
重要
本エンドポイントは Hatena が正式に公開しているものではなく、公式ドキュメントも存在しません。利用する場合は 動作が予告なしに変更・廃止される可能性 があることを十分に認識した上で、代替手段(例:自前で取得したブックマークを検索エンジンへインデックス)を検討してください。
2. 認証方式とアプリ登録手順
2‑1. 推奨認証 ― OAuth 1.0a
はてなブックマーク API の公式認可フローは OAuth 1.0a です。2024 年時点での最新エンドポイントは以下の通りです(変更があれば Hatena Developer Center の「OAuth」ページを必ず確認してください)。
| ステップ | エンドポイント | 主なパラメータ |
|---|---|---|
| アプリ登録 | - | Hatena Developer Center → 「アプリケーションの追加」 |
| リクエストトークン取得 | POST https://www.hatena.com/oauth/initiate |
oauth_callback(必須) |
| ユーザー認可 | GET https://www.hatena.com/oauth/authorize?oauth_token=… |
- |
| アクセストークン取得 | POST https://www.hatena.com/oauth/token |
oauth_verifier |
注意点
- コールバック URL は HTTPS が推奨され、実際に受け取るエンドポイントは外部からアクセス可能である必要があります。
- 取得した Consumer Key/Secret と Access Token/Secret は安全な場所(環境変数やシークレットマネージャ)に保管し、コードベースにハードコーディングしないでください。
2‑2. WSSE・Cookie 認証は非推奨
過去の資料に WSSE や Cookie 認証が記載されていることがありますが、Hatena の公式情報には掲載されておらず、現在はサポート対象外です。実装時には OAuth 1.0a を唯一の選択肢 とし、他方式は使用しないようにしてください。
3. 実装サンプル
3‑1. Python(requests + requests_oauthlib)
|
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 |
import os, time, random from requests_oauthlib import OAuth1Session # ------------------------------------------------- # 環境変数から認証情報を取得(例: .env ファイル等) # ------------------------------------------------- CONSUMER_KEY = os.getenv("HATENA_CONSUMER_KEY") CONSUMER_SECRET = os.getenv("HATENA_CONSUMER_SECRET") ACCESS_TOKEN = os.getenv("HATENA_ACCESS_TOKEN") ACCESS_SECRET = os.getenv("HATENA_ACCESS_SECRET") session = OAuth1Session( client_key=CONSUMER_KEY, client_secret=CONSUMER_SECRET, resource_owner_key=ACCESS_TOKEN, resource_owner_secret=ACCESS_SECRET, ) def request_with_backoff(url, params=None, max_retry=5): """429(レートリミット)時に指数バックオフで再試行するユーティリティ""" delay = 1.0 for _ in range(max_retry): resp = session.get(url, params=params, headers={"User-Agent": "MyBookmarkTool/1.0 (Contact: dev@example.com)"}) if resp.status_code != 429: return resp time.sleep(delay + random.random()) delay *= 2 raise RuntimeError("レートリミットが続き、再試行回数上限に達しました") # ------------------------------------------------- # ブックマーク一覧取得(最大100件) # ------------------------------------------------- api_url = "https://bookmark.hatena.com/rest/v1/bookmarks" response = request_with_backoff(api_url, params={"count": 100}) if response.status_code == 200: data = response.json() for bm in data["bookmarks"]: print(f"{bm['entry_url']} - {bm['comment']}") else: # 基本的なエラーハンドリング例 if response.status_code in (401, 403): print("認証情報が無効です。トークンを再取得してください") else: print(f"Error {response.status_code}: {response.text}") |
3‑2. JavaScript(Fetch API)
ポイント
OAuth 1.0a のシグネチャはサーバ側で生成し、クライアントへAuthorizationヘッダーだけを渡す形が安全です。
|
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 |
// サーバ側で作成した Authorization ヘッダー文字列を取得(例: /auth/header エンドポイント) async function getOAuthHeader() { const res = await fetch("/auth/header"); if (!res.ok) throw new Error("認証ヘッダー取得失敗"); return await res.text(); // 例: 'OAuth oauth_consumer_key="...", ...' } async function fetchBookmarks() { const authHeader = await getOAuthHeader(); const url = "https://bookmark.hatena.com/rest/v1/bookmarks?count=50"; const resp = await fetch(url, { method: "GET", headers: { "Authorization": authHeader, "User-Agent": "MyBookmarkTool/1.0 (Contact: dev@example.com)" } }); if (resp.ok) { const data = await resp.json(); data.bookmarks.forEach(bm => console.log(`${bm.entry_url} - ${bm.comment}`)); } else { switch (resp.status) { case 401: console.error("認証エラー。トークンの有効期限を確認してください"); break; case 429: console.warn("レートリミットに達しました。数秒後に再試行します"); setTimeout(fetchBookmarks, 3000); break; default: const txt = await resp.text(); console.error(`Error ${resp.status}: ${txt}`); } } } fetchBookmarks(); |
4. 実務での活用シナリオ(3例)
| シナリオ | 主な目的 | 実装のポイント |
|---|---|---|
| 個人向け「マイブックマーク」全文検索ツール | 自分だけのローカル検索エンジンで過去ブックマークを高速に検索 | 1. /rest/v1/bookmarks で全件取得2. SQLite/ElasticSearch にインデックス化 3. フロントはシンプルな検索ボックス |
| 業界トレンド可視化ダッシュボード | キーワードやハッシュタグの出現頻度をリアルタイムに把握 | 1. 非公式検索 API(※リスクあり)または自前で取得したデータを定期取得 2. TF‑IDF 等で重要語抽出 3. Grafana / Chart.js で可視化 |
| SEO 用ブックマーク分析 | 自社ページの被ブックマークリストとタグ構成を把握し、被リンク効果を測定 | 1. URL リスト(CMS API 等)から /entry/json/{url} を叩く2. count と tags を CSV/DataFrame に集約3. ページ別ランキングや上位タグのレポート作成 |
サンプル:SQLite へ保存する Python スクリプト(シナリオ①)
|
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 |
import sqlite3, os, json, requests DB_PATH = "my_bookmarks.db" API_URL = "https://bookmark.hatena.com/rest/v1/bookmarks?count=1000" # ------------------------------------------------- # OAuth 認証済みセッションは省略(前節参照) # ------------------------------------------------- session = ... # OAuth1Session のインスタンス resp = session.get(API_URL, headers={"User-Agent": "MyBookmarkTool/1.0"}) resp.raise_for_status() bm_data = resp.json()["bookmarks"] conn = sqlite3.connect(DB_PATH) cur = conn.cursor() cur.execute("""CREATE TABLE IF NOT EXISTS bm ( url TEXT PRIMARY KEY, title TEXT, comment TEXT, tags TEXT, ts TEXT )""") for bm in bm_data: cur.execute( "INSERT OR REPLACE INTO bm VALUES (?,?,?,?,?)", ( bm["entry_url"], bm.get("title", ""), bm.get("comment", ""), ",".join(bm.get("tags", [])), bm["timestamp"] ) ) conn.commit() conn.close() print(f"{len(bm_data)} 件のブックマークを SQLite に保存しました") |
5. 利用上の注意点とベストプラクティス
5‑1. User-Agent の必須指定 & レートリミット
公式ドキュメントは 「User‑Agent を明示しないリクエストは制限対象」 と明記しています。
推奨フォーマット例:
|
1 2 |
YourAppName/バージョン (Contact: your@email) |
例:MyBookmarkTool/1.2 (Contact: dev@example.com)
- レートリミット は 1 分間に最大 60 リクエスト(※変更の可能性あり)です。
- 429 が返されたら必ず指数バックオフで再試行してください。
5‑2. エラーハンドリングと再試行戦略
| HTTP ステータス | 想定原因 | 推奨対策 |
|---|---|---|
| 401 / 403 | 認証情報が無効、または権限不足 | トークンの有効期限を確認し、必要なら再取得 |
| 429 | レートリミット超過 | 指数バックオフ(1 s → 2 s → 4 s …)でリトライ |
| 500 系 | サーバ側障害 | 数秒待機後に再試行、連続失敗時はアラートを上げる |
バックオフ実装例(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
import time, random def get_with_backoff(session, url, params=None, max_retry=6): delay = 1.0 for _ in range(max_retry): r = session.get(url, params=params) if r.status_code != 429: return r time.sleep(delay + random.random()) delay *= 2 # 1 → 2 → 4 → … raise RuntimeError("レートリミットが続き、再試行上限に達しました") |
5‑3. セキュリティ
- シークレット情報は環境変数や Vault に保管し、Git リポジトリに絶対に含めない。
- OAuth の署名生成はサーバ側で行い、クライアントには
Authorizationヘッダーだけを渡す。 - API 呼び出し時は常に HTTPS を使用し、中間者攻撃から保護する。
6. まとめ
- API の選択
- 公開データだけが欲しい → はてなブックマークリスト API(認証不要)
-
ユーザー固有の操作や大量取得が必要 → はてなブックマーク REST API(OAuth 1.0a 必須)
-
認証は OAuth 1.0a のみを使用。WSSE・Cookie 認証は公式にサポートされていないため実装しないこと。
-
非公式な全文検索エンドポイントはリスクが高い。必ず代替手段(自前インデックス)を検討するか、利用の際は動作保証がない旨をコード・ドキュメントに明記してください。
-
実装例(Python / JavaScript)は公式推奨ライブラリを活用し、
User-Agentとレートリミット対策を必ず組み込むこと。 -
活用シナリオとして、個人検索ツール、トレンド可視化ダッシュボード、SEO 用ブックマーク分析がすぐに試せる実務的な例です。
これらの手順とベストプラクティスをプロジェクトに組み込めば、はてなブックマークデータを安全かつ効果的に活用でき、サービス開発やマーケティング施策の速度が格段に向上します。