v251104 - OGP画像の自動生成とキューイングシステム
v251104 - OGP画像の自動生成とキューイングシステム
リリース日: 2025年11月4日
カテゴリ: 新機能・パフォーマンス改善
🎉 新機能:投稿時のOGP画像自動生成
投稿を作成すると、SNS共有用のOGP画像が自動的に生成されるようになりました。
これまでの課題
- 手動で
/api/v2.1/screenshot/all_postsを実行する必要があった - 複数ユーザーが同時に投稿すると、サーバーに負荷がかかる可能性があった
- ログが冗長で、既存ファイルのスキップ情報まで表示されていた
改善内容
今回の実装により、以下が実現されました:
-
投稿時の自動生成
- 投稿を作成すると、自動的にOGP画像生成がキューに追加されます
- 手動での操作は不要になりました
-
キューイングシステム
- 複数の画像生成リクエストを順次処理
- サーバー負荷を防ぐため、一度に1つずつ処理
- 優先度とタイムスタンプに基づく処理順序
-
リトライ機能
- 生成に失敗した場合、最大3回まで自動的にリトライ
- リトライ時は優先度を下げて、新しいリクエストを優先
-
スマートなログ出力
- 既に画像が存在する場合は、ログに出力しない(静かにスキップ)
- 新規生成や失敗時のみ、必要な情報を出力
📋 技術的な詳細
キューシステムの仕組み
新しく作成された lib/screenshot-queue.ts により、以下の機能を提供:
interface ScreenshotJob {
id: string; // ジョブID
path: string; // スクリーンショットパス
blogUsername: string; // ブログのユーザー名
postId: string; // 投稿ID
priority: number; // 優先度(高いほど先に処理)
createdAt: Date; // 作成日時
retries: number; // リトライ回数
}
処理フロー
-
投稿作成時
POST /api/v1/posts ↓ 投稿がDBに保存される ↓ screenshotQueue.enqueue() - キューに追加 ↓ 自動的にバックグラウンド処理開始 -
キュー処理
優先度とタイムスタンプでソート ↓ 1つずつ順次処理(並列数制限: 1) ↓ 成功 → 完了 失敗 → リトライ(最大3回) -
ログ出力
📸 Screenshot job enqueued: username/post/12345 ✅ Screenshot generated: username/post/12345 ❌ Screenshot generation failed: username/post/12345 🔄 Retrying screenshot (1/3): username/post/12345 💀 Screenshot generation failed permanently: username/post/12345
API変更点
pages/api/v1/[...slug].ts
投稿作成エンドポイントに、スクリーンショット生成キューへの追加処理を統合:
// 投稿作成後
screenshotQueue.enqueue({
path: `/${blogUsername}/post/${insertedId}`,
blogUsername,
postId: insertedId,
priority: 10, // 通常優先度
});
pages/api/v2.1/[...slug].ts
全投稿の画像を一括生成する /screenshot/all_posts エンドポイントを改善:
- 既存ファイルのスキップを静かに処理
- 新規生成されたものだけを結果に含める
- より簡潔なログ出力
設定パラメータ
| パラメータ | 値 | 説明 |
|-----------|-----|------|
| maxRetries | 3 | 最大リトライ回数 |
| concurrentLimit | 1 | 同時処理数 |
| retryDelay | 1秒 | リトライ間隔 |
🎯 ユーザーへの影響
メリット
✅ 完全自動化 - 投稿後、何もする必要がありません
✅ 即時反映 - SNSでシェアする際、すぐにOGP画像が表示されます
✅ 安定性向上 - サーバー負荷が管理され、安定したパフォーマンス
注意点
- OGP画像生成には数秒かかる場合があります
- 投稿直後にシェアした場合、画像が表示されるまで少し時間がかかることがあります
- 既存の投稿のOGP画像は、必要に応じて
/api/v2.1/screenshot/all_postsで一括生成できます
📊 キューの状態確認(開発者向け)
キューの状態は、screenshotQueue.getStatus() で確認できます:
{
queueLength: 5, // キュー内のジョブ数
processing: true, // 処理中かどうか
processingCount: 1, // 現在処理中のジョブ数
jobs: [ // キュー内のジョブ一覧
{
postId: "12345",
blogUsername: "demo",
priority: 10,
retries: 0,
createdAt: "2025-11-04T03:56:07.000Z"
}
]
}
🚀 今後の改善予定
- [ ] 優先度の動的調整(プレミアムユーザー優先など)
- [ ] 並列処理数の増加(サーバー性能に応じて)
- [ ] WebSocketを使ったリアルタイム生成通知
- [ ] 画像生成の進捗表示UI
- [ ] 古い画像の自動再生成(デザイン変更時など)
💡 使用例
基本的な使い方
1. 投稿を作成する
2. 投稿が公開される
3. 自動的にOGP画像が生成される(バックグラウンド)
4. TwitterなどでシェアするとOGP画像が表示される
開発者向け:手動でキューに追加
import screenshotQueue from '@/lib/screenshot-queue';
screenshotQueue.enqueue({
path: '/username/post/12345',
blogUsername: 'username',
postId: '12345',
priority: 10,
});
開発者向け:一括生成
# すべての投稿のOGP画像を生成
curl https://intrawrite.com/api/v2.1/screenshot/all_posts
📝 関連ドキュメント
lib/screenshot-queue.ts- キューシステムの実装lib/screenshots.ts- スクリーンショット生成ロジックpages/api/v1/[...slug].ts- 投稿作成APIpages/api/v2.1/[...slug].ts- スクリーンショット管理API
この機能により、SNSでのシェアがさらにスムーズになります!