はてなブックマーク

Hatena Bookmark API 完全ガイド:エンドポイント・OAuth認証・活用事例

ⓘ本ページはプロモーションが含まれています

Contents

スポンサードリンク

Hatena Bookmark API の全体像と主要エンドポイント

はてなブックマークのデータを外部サービスで活用するには、まず REST API の構造と認証方式を正しく理解しておくことが不可欠です。公式ドキュメント(Hatena Developer Center)は随時更新されるため、利用前に必ず最新情報を確認してください。本節では、主要エンドポイントの概要・必須パラメータ・代表的なレスポンス例をまとめ、実装上の注意点も併せて解説します。

エンドポイント一覧

以下に示すエンドポイントは 2026 年時点で公式に公開されているものですが、バージョンアップや仕様変更が行われる可能性があります。必ず公式リファレンスで最新のパラメータ名・レスポンス構造を確認してください

エンドポイント 用途
GET /entries 認証ユーザーがブックマークしているエントリー一覧取得
POST /entries 指定 URL の新規ブックマーク登録
DELETE /entries 自分のブックマーク削除
GET /entry 任意 URL の件数・タグ情報のみ取得
GET /counts 複数 URL のブックマーク件数を一括取得

エントリー取得 (GET /entries)

認証ユーザーが自分のブックマークに登録しているエントリーを一覧で取得します。取得対象は URL エンコード済みurl パラメータ 1 件だけです。

リクエスト例

主なパラメータ

パラメータ 必須 説明
url 取得対象ページの URL(必ず percent‑encoding)

注意: 公式では url のみ受け付け、他のクエリは無視されます。

サンプルレスポンス


ブックマーク追加 (POST /entries)

認証ユーザーが指定した URL をブックマークに登録します。POST ボディは application/x-www-form-urlencoded 形式で送信し、必ず URL エンコードしてください。

リクエスト例

パラメータ

パラメータ 必須 説明
url ブックマーク対象 URL(必ずエンコード)
comment 任意のコメント文字列(UTF‑8, percent‑encoding 推奨)

成功時レスポンス

  • HTTP ステータス 201 Created が返り、ボディは空です。
  • 既に同一 URL が登録済みの場合は 409 Conflict が返ります。

ブックマーク削除 (DELETE /entries)

自分が登録したブックマークを解除します。url パラメータはエンコード必須です。

リクエスト例

成功時レスポンス

  • 204 No Content が返り、ボディはありません。
  • 削除対象が存在しない場合は 404 Not Found となります。

エントリー情報取得 (GET /entry)

任意の URL に対するブックマーク件数・タグ・ユーザー一覧だけを取得したいときに使用します。エンドポイント名は /api/v1/entry(※複数形ではなく単数)です。

リクエスト例

サンプルレスポンス


複数 URL 件数取得 (GET /counts)

複数ページのブックマーク件数を一括で取得できるエンドポイントです。URL のカンマ区切りと個別エンコードが公式例で推奨されています。全体を 1 回だけ quote すると正しく解釈されないため、各 URL を独立に urllib.parse.quote_plus(または同等の関数)でエンコードし、その後カンマで結合してください。

リクエスト例(公式フォーマットに合わせた実装)

検証ポイント
公式ドキュメントのサンプルと照らし合わせ、上記クエリ文字列が正しく動作するか必ずテストしてください。万一結果が期待通りでない場合は、url= の後ろ全体を再度 encodeURIComponent(JavaScript)や quote(Python)で二重エンコードし直すことがあります。

サンプルレスポンス


OAuth 認証フローと必須設定

はてなブックマーク API は OAuth 1.0a によるユーザー認証が必須です。正しいトークン取得手順と User-Agent のフォーマットを守らないと、公式側で自動的にアクセス制限(403/429)が適用されます。

OAuth 1.0a 取得手順

  1. アプリ登録 – Hatena Developer Center にて「Consumer Key」と「Consumer Secret」を発行。
  2. リクエストトークン取得POST https://www.hatena.com/oauth/initiate にキーを付与し、oauth_callback=oob を指定。
  3. ユーザー認証 – 取得した oauth_token を使い https://www.hatena.ne.jp/oauth/authorize?oauth_token=... にリダイレクトさせ許可を得る。
  4. アクセストークン取得 – ユーザーが許可したら返ってくる oauth_verifier を用いて POST https://www.hatena.com/oauth/token へ再度リクエストし、最終的な Access Token / Secret を入手。

Python の requests_oauthlib は上記フローを自動でハンドリングできるため、実装はシンプルです。

User-Agent ヘッダーの必須フォーマット

公式ドキュメントが示す例:

  • ASCII のみで構成し、改行や余計な空白は入れないこと。
  • この情報が無いと 403 エラーになるケースがあります。

実践活用事例①:Python+requests_oauthlib でブックマークを自動追加

Qiita に掲載されたサンプルコード(2025 年版)に、2026 年時点のベストプラクティスを加味した完全版です。認証・エラーハンドリング・重複チェックまで網羅しています。

スクリプト全体像

主なポイント解説

内容
1‑4 環境変数から機密情報を取得し、コード上の平文漏洩リスクを回避。
9‑10 quote_plus による URL エンコーディングは必須(公式が要求)。
14‑20 OAuth1Session が OAuth 1.0a の署名・ヘッダー生成を自動化。
23‑26 正しい User-Agent を設定しないと 403 が返ることがある。
28‑36 ステータスコード別に成功、重複、その他エラーを分岐処理。

実装時の追加注意点

  • 二重エンコード防止requests は自動でエンコードしないため、必ず quote_plus した文字列をそのまま送信してください。
  • リトライロジック:ネットワーク障害時は requests.exceptions.RequestException を捕捉し、指数バックオフで再試行すると安全です(次章参照)。

実践活用事例②:複数 URL のブックマーク件数取得とダッシュボード化

大量コンテンツの人気度を把握したい場合は /counts エンドポイントで一括取得し、可視化するのが最も効率的です。以下では Python でデータ取得 → pandas DataFrame 整形 → Plotly によるインタラクティブダッシュボード作成までを示します。

エンドポイント呼び出し手順

実装上のポイント

  • エンコード方式:公式例と同様に「各 URL を quote_plus してカンマで連結」すれば、サーバ側で正しくパースされます。
  • タイムアウト設定:ネットワーク遅延時のハングアップ防止として timeout=10 秒を推奨します。
  • 例外処理:ステータスコードが 200 以外の場合は即座に例外化し、呼び出し側でリトライやログ記録ができるようにします。

データ集約と可視化

取得した DataFrame を Plotly Express で棒グラフ化し、Jupyter Notebook や Streamlit アプリへ埋め込む例です。

実運用向けベストプラクティス

項目 推奨策
キャッシュ ETag / If-None-Match を利用し、304 Not Modified 時はローカルデータを再利用。
レートリミット回避 公式が示す「1 分間に 60 リクエスト」以下になるよう、URL バッチサイズは 20 前後に分割し time.sleep(1) を挟む。
エラーハンドリング 429 Too Many Requests が返ったら Retry-After ヘッダーの秒数だけ待機し再送。指数バックオフでリトライ回数は最大 3 回まで。

実践活用事例③:トレンド分析・コンテンツ推薦システムの基本設計

はてなブックマークデータは、ユーザー関心や業界トレンドをリアルタイムで把握する上で有効です。ここでは 取得 → 前処理 → 集計 → 推薦 のフローを概観し、最小構成のサンプルコードと API 設計例を示します。

データ取得フロー

ポイントjson_normalize を使うとネストされた userstags がフラットなテーブルになるため、集計が楽になります。

分析・推薦ロジック(概要)

  1. トレンド集計
  2. timestamp を日付単位でグルーピングし、増減率上位 10 件を「今週の注目記事」として抽出。
  3. タグ頻度分析
  4. tags 配列から語彙リスト化し、collections.Counter で出現回数を算出。上位キーワードはカテゴリ分類に利用。
  5. シンプル協調フィルタリング
  6. 同一ユーザーがブックマークした記事同士の共起行列を作り、コサイン類似度上位の記事を推薦対象とする。

以下は Flask + SQLite で「おすすめエンドポイント」を実装した最小例です。

実装上の留意点

  • データ更新頻度:はてなブックマークはリアルタイムに近いので、バッチ処理は 1 時間に 1 回程度で十分。
  • タグ保存方式:検索性を高めたい場合は JSONB(PostgreSQL)や別テーブル正規化を検討してください。
  • スケーラビリティ:初期は SQLite でも動作しますが、アクセス増加時は PostgreSQL + インデックス付与へ移行するのが自然です。

API 利用時の制限・ベストプラクティス & 今すぐ実装へ

はてなブックマーク API は便利ですが、レートリミット利用規約 を遵守しないとアクセス遮断やアカウント停止のリスクがあります。以下では安全に運用するための具体策をまとめました。

連続アクセス制限とリトライ戦略

制限項目 公式数値(2026 年) 推奨回避策
1 分間あたりのリクエスト上限 60 回 バッチサイズ ≤ 20、time.sleep(0.5~1) を挟む
短時間連続エラー時 429 / 503 が返ることがある Retry-After ヘッダーの秒数待機、指数バックオフ (2, 4, 8 秒) を実装

Python で安全に GET するサンプル

レスポンスキャッシュ活用

  1. ETag / If-None-Match
  2. GET 系エンドポイントは ETag を返すことが多いので、取得時に保存し次回は If-None-Match ヘッダーで送信。304 が返ればデータ転送量を削減できます。

  3. ローカルキャッシュ実装例(Python)

エラーハンドリングの基本表

HTTP ステータス 主な原因 推奨対応
400 Bad Request パラメータ不正、URL 未エンコード 入力バリデーションを徹底
401 Unauthorized OAuth トークン期限切れ・無効 再認証フローへ誘導
403 Forbidden User-Agent 不正、利用規約違反 正しいフォーマットで再送
404 Not Found 対象エントリ未登録 必要なら事前に /entries で確認
429 Too Many Requests レート超過 Retry-After 待機後リトライ
5xx 系エラー サーバ障害・一時的な不具合 最大 3 回まで指数バックオフで再試行し、継続失敗はアラート送信

安全に利用するための最終チェックリスト

  1. 公式ドキュメントを毎回確認
  2. エンドポイント URL・パラメータ仕様・レートリミットは随時変更される可能性があります。実装前後に必ず最新情報を参照してください。
  3. User-Agent を正しい形式で送信
  4. アプリ名、バージョン、問い合わせメールアドレスの 3 要素が必須です。ASCII のみで記述し、余計な改行は入れないようにします。
  5. URL エンコード方法を統一
  6. /counts のクエリは「各 URL を個別に quote_plus → カンマ結合」するのが公式例と一致します。二重エンコードや全体エンコードは避けましょう。
  7. レートリミットを守る
  8. 1 分間 60 回以下、バッチサイズは 20 前後に抑える。超過したら Retry-After に従い待機します。
  9. キャッシュと ETag の活用
  10. 同一リクエストの頻度が高い場合はローカルキャッシュで 304 を利用し、帯域とレートリミットを節約します。
  11. 例外・エラー処理を徹底
  12. ステータスコードごとのハンドリングと指数バックオフの実装は必須です。

以上の手順とベストプラクティスに沿って実装すれば、はてなブックマーク API を安定・安全に活用できるようになります。ぜひ本稿で紹介したコードを自社サービスや個人ツールに組み込み、ユーザー体験の向上やデータドリブンな意思決定に役立ててください。

スポンサードリンク

-はてなブックマーク