個人サイトのライブウィジェットと外部 API の制限
一言まとめ
GitHub 草・Spotify 再生中・Last.fm・Steam・Strava・Letterboxd・WakaTime などを個人サイトに出すときの取得経路とレート制限、秘密キーの置き場所。Spotify は 2025-05 から extended quota が法人限定になり、Letterboxd は公式 API が個人不可で RSS が現実解。
調査時点: 2026-04。外部 API のポリシーとレート制限は変わりやすいので、実装前に再確認する。
GitHub contribution graph
- 2D: GraphQL API の
contributionsCollectionを SSG のビルド時に取得して静的 SVG にする。非公式の REST プロキシや gitgraph.dev のような埋め込みサービスもある。 - レート制限: トークンなし 60 req / 時、PAT あり 5,000 req / 時。ビルド時取得なら問題にならない。公開情報なのでプライバシー影響はほぼない。
- 3D skyline:
gh-skyline(GitHub 公式 CLI 拡張)で STL / MP4 を生成して画像・動画として貼る。インタラクティブ版(github-graph-3dなど)は WebGL 依存でモバイルが重い。 - 自サイトの投稿頻度ヒートマップは
cal-heatmap(MIT)や D3 で、Content Collections の投稿日から静的 SVG を作れば外部 API 不要。
“Now playing” 系
| サービス | 経路 | 制限・注意 |
|---|---|---|
| Spotify | /v1/me/player/currently-playing をサーバーレス関数経由で返す | 2025-04-15 発表・2025-05-15 施行で extended quota mode は法人限定。個人は development mode のまま使える。レート制限は非公式で 1 秒 20 req 目安。サーバーレス側でキャッシュ + 30 秒 revalidate、refresh token 管理が要る |
| Last.fm | User.getrecenttracks(API キーのみ、認証不要) | 公式レート制限 5 req / 秒。Spotify の代替・補完に向く |
| Steam | IPlayerService/GetRecentlyPlayedGames | 直近 2 週間・最大 10 件。API キー無料。プロフィール非公開だと取得不可、プレイしていない週は空 |
| Strava | V3 API、または公式 iframe embed | access token は 6 時間で失効し refresh token フロー必須。Free tier は 15 分 100 req / 1 日 1,000 req。位置情報を含むのでプライバシーゾーン設定を確認 |
| Letterboxd | ユーザー RSS(https://letterboxd.com/<username>/rss/)を parse | 公式 API は個人プロジェクト不可。RSS → JSON は Cloudflare Worker などで。非公式 API の迂回はグレー、RSS は通常利用の範囲 |
| WakaTime | 公開用の embeddable chart URL | 秘密 API キーをクライアントに置くのは明示的に禁止。レート制限は 5 分ウィンドウで 10 req / 秒以下 |
その他の埋め込み
- Cal.com 予約: inline / pop-up ボタン / element click pop-up の 3 方式。
@calcom/embed-reactか script タグ 1 行。Free プランで無制限、OSS でセルフホスト可。 - ローカル時刻・稼働状況:
Intl.DateTimeFormatで特定タイムゾーンを描けば外部 API 不要。現在地は都市名レベルに留める。 - ゲストブック: memorista.io(ホスティング型、free tier)か Supabase + 自作フォーム。reCAPTCHA / honeypot のスパム対策が要る。
- AMA フォーム: 外部サービス(CuriousCat / NGL)誘導か、Workers + KV で自作。匿名ゆえ荒らし対策が要る。
- AI チャットボット: LLM + RAG。有料 API を常時公開するコスト設計(小さいモデルでも月数百円規模になりうる)とプロンプトインジェクション対策が要る。SSG では edge function か外部 API サーバーが必須。
- ターミナル風 UI: スクリーンリーダー対応が難しく、メインナビは別途必要。
WebGL ヒーロー・カスタムカーソル
- Three.js 本体は約 600KB min。
@react-three/fiberか vanilla Three.js を Island にして、モバイル GPU 負荷とprefers-reduced-motionの代替表示を用意する。 - カスタムカーソルは
cursor: none+ 追従 div(GSAP で smooth lag)。タッチデバイスでは無意味で、フォーカスの視認性と reduced-motion 対応が要る。 - アニメーションのコスト順は CSS → Web Animations API → JS ライブラリ。
関連
更新履歴
- 2026-04-19: 初版(ローカル調査ノート)
- 2026-10-17: Wiki へ移植、概念ページとして再構成
出典
- https://docs.github.com/en/rest/overview/rate-limits-for-the-rest-api
- https://developer.spotify.com/blog/2025-04-15-updating-the-criteria-for-web-api-extended-access
- https://developer.spotify.com/documentation/web-api/concepts/rate-limits
- https://www.last.fm/api
- https://partner.steamgames.com/doc/webapi/iplayerservice
- https://developers.strava.com/
- https://letterboxd.com/api-beta/
- https://wakatime.com/developers
- https://cal.com/embed
同じトピック — Web
- 単一画面の Canvas ツールのスタック選定(vanilla TS / Svelte / Preact と PWA ツーリング)
- DAM カラオケ検索(clubdam)の挙動と制約
- Core Web Vitals と画像最適化
- favicon の最小構成(SVG + ICO + apple-touch-icon + manifest)
- フロントエンドのフレームワークとツールの動き(2025)
- HTML-in-Canvas API
- HTML-in-Canvas の実現性(a11y・性能・セットアップ・シェーダー)
- iOS Safari で canvas の画像を保存させる(download 属性 / Web Share / 長押し)
- 日本語 Web フォントのライセンスとサブセット化
- モダン CSS / Web API の対応状況(2025-2026)
- OPFS(Origin Private File System)
- Google Places API のキーの守り方(ブラウザ露出 vs サーバ中継)
- iOS の PWA 制限
- 機能別 React / TS ライブラリ対応表(2026-04 時点)
- URL 長の上限と日本語の URL エンコード膨張
- 書き出すテキストファイルの UTF-8 BOM と Markdown 継続行
- 縦書き Web の実装(writing-mode・ルビ・圏点・縦中横・禁則)
- PWA の Web Share Target(Android)の実測と落とし穴
- WebAssembly(Wasm)
- YouTube oEmbed で動画タイトルとチャンネル名を取る