はじめに
ブログ記事をSNSでシェアする際、OGP画像(Open Graph Protocol画像)の存在は非常に重要です。統一感のあるビジュアルは読者の注目を引き、ブランド認知度向上にも大きく貢献します。
しかし、記事を書くたびに手動でOGP画像を作成するのは時間がかかり、デザインの統一性を保つのも困難です。
そこで今回、MonerionブログのOGP画像を完全自動生成するシステムを作りました。
Python のPillowライブラリを使い、記事のタイトルを元に1200x630pxの標準OGP画像を自動生成。QiitaやZenn風の洗練されたデザインで、統一されたブランドビジュアルを実現しています。
この記事では、実装の過程で直面した課題と解決策、特にClaude Codeでの自動化の限界とフォントの手動対応について詳しく解説します。
なぜOGP画像の自動生成が必要だったのか
1. 手動作成の限界
これまでは記事を公開するたびに、以下の作業が必要でした:
- 画像編集ソフトでテンプレートを開く
- タイトルをコピー&ペースト
- 文字サイズやレイアウトを調整
- 1200x630pxでエクスポート
- ファイル名を記事に合わせてリネーム
1記事あたり10-15分の作業時間が発生し、記事数が増えるほど負担も増大していました。
2. デザイン統一性の課題
手動作成では、以下のような問題も発生していました:
- フォントサイズが記事によって微妙に異なる
- ロゴの配置位置がずれる
- 配色が統一されない
- 長いタイトルの改行処理が不適切
これらの問題を解決するため、完全自動化による統一されたOGP画像生成システムの構築に取り組みました。
実装の壁:フォント自動取得の限界
Claude Codeでの自動ダウンロード試行
最初は、Claude Codeに「Google FontsからNoto Sans JPを自動ダウンロードして」と依頼しました。
しかし、以下のようなエラーが発生:
# Claude Codeが生成したコード(エラーになる)
import requests
from zipfile import ZipFile
def download_noto_sans_jp():
url = "https://fonts.google.com/download?family=Noto%20Sans%20JP"
response = requests.get(url) # ここでエラー
エラーの原因: * Google Fontsは直接的なダウンロードURLを提供していない * 動的に生成されるダウンロードリンクのため、簡単なGETリクエストでは取得不可 * APIキーや複雑な認証が必要な場合がある
現実的な解決策:手動ダウンロード
自動化の限界を認識し、手動ダウンロードという現実的なアプローチを採用しました。
手順:
- Google Fontsにアクセス(https://fonts.google.com/noto/specimen/Noto+Sans+JP)
- 「Download family」ボタンをクリック
- ZIPファイルをダウンロード
- 必要なフォントファイルを抽出
- プロジェクトの指定場所に配置
materials/フォント/NotoSansJP/static/
├── NotoSansJP-Bold.ttf # タイトル用
├── NotoSansJP-Medium.ttf # サイト名用
└── NotoSansJP-Regular.ttf # 予備用
手動対応のメリット: * 確実にフォントファイルを取得可能 * 必要なウェイト(Bold、Medium等)のみを選択 * バージョン管理が容易 * ネットワークエラーの心配がない
Pillowでの実装詳細
基本設計
以下の要素でOGP画像を構成しました:
- サイズ:1200x630px(OGP標準)
- 背景:白色(#ffffff)
- 上下横帯:青色(#2563eb)、高さ60px
- ロゴ:120x120px、右上配置
- タイトル:左寄せ、自動改行、Noto Sans JP Bold
- サイト名:下部横帯内、白文字、Noto Sans JP Medium
実装のポイント
- 画像サイズ: 1200x630px(OGP標準サイズ)
- デザイン: 白背景 + 青い横帯 + ロゴ配置
- フォント: Noto Sans JPを使用(美しい日本語表示)
- レイアウト: タイトルの自動改行とサイズ調整
- フォールバック: フォント読み込み失敗時の代替処理
画像生成にはPythonのPillowライブラリを使用し、記事のタイトルを元に動的にOGP画像を作成する仕組みを構築しました。
実装結果と効果
生成された画像の特徴
現在、以下の画像が自動生成されています:
- ブログ記事13個のOGP画像
- カテゴリ4個のOGP画像
- 合計17枚の統一されたOGP画像
すべて1200x630pxの標準サイズで、以下の品質を保証:
- 統一されたフォント(Noto Sans JP)
- 一貫したレイアウト
- 適切なコントラスト比
- モバイルでも読みやすいサイズ
業務効率の改善
- 作業時間削減:記事作成時のOGP画像作業が完全に不要
- 品質向上:手動作業で発生していたミスやばらつきを排除
- スケーラビリティ:今後何記事追加しても追加工数なし
ブランディング効果
- 視覚的統一感:SNSでのシェア時に一貫したビジュアル
- プロフェッショナル感:カスタムフォントによる高品質な印象
- 認知度向上:統一されたデザインによるブランド認知の向上
今後の改善予定
技術的な改善
- フォント管理の自動化
- CI/CD環境での自動フォントダウンロード(要調査)
-
フォントキャッシュ機能の実装
-
レイアウト機能の拡張
- カテゴリ別のカラーバリエーション
- サムネイル画像の自動配置
-
動的な背景パターン
-
パフォーマンス最適化
- 画像生成の並列処理
- WebP形式での出力オプション
- CDN最適化対応
運用面の改善
- 品質チェック機能:生成された画像の自動検証
- A/Bテスト支援:複数デザインパターンの生成
- 分析連携:OGP画像のクリック率測定
まとめ
MonerionブログのOGP画像自動生成システムの実装を通じて、以下のことを学びました:
技術的な学び
- 自動化の限界認識:Claude Codeでも解決できない問題は手動対応が現実的
- 実用性重視:完璧な自動化より、実際に動く仕組みの価値
- フォールバック設計:環境依存を考慮した堅牢な実装
プロジェクト運営の学び
- 段階的改善:まず動くものを作り、その後改善を重ねる
- 品質と効率の両立:手間を削減しながら品質向上を実現
- ブランド価値向上:技術的な改善がビジネスにも好影響
現在は17枚のOGP画像が全自動で生成されており、記事作成の効率が大幅に向上しました。
同じような課題を抱えている開発者の方に、この実装が参考になれば幸いです。
完璧な自動化を目指すより、現実的で継続可能な仕組みを作ることの重要性を、改めて実感した実装でした。
この記事のOGP画像も、もちろん自動生成されています。記事タイトルから1200x630pxの画像が自動で作られ、SNSでシェアする際に表示されます。