Skip to content

✨ ブログの記事URLからタイトル・説明・公開日・媒体・サムネイルを自動で入力する - #355

Open
Tivo0921 wants to merge 1 commit into
mainfrom
feature/blog-thumbnail-autofill
Open

Tivo0921 wants to merge 1 commit into
mainfrom
feature/blog-thumbnail-autofill

Conversation

@Tivo0921

@Tivo0921 Tivo0921 commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

概要

Closes #354

記事管理ページ (/internal/blogs) で記事URLを入力すると、タイトル・説明・公開日・媒体・サムネイル画像URLを自動で入力するようにしました。入力された値はそのまま書き換えられます。自動で取れない媒体 (「その他」) や項目は、これまでどおり手動で入力します。

媒体ごとに自動で入る項目

項目 Qiita Zenn Medium
タイトル ○ og:title (末尾の「 - Qiita」は削る) ○ og:title ○ RSS
説明 ○ og:description (本文の冒頭) - -
公開日 ○ JSON-LD の datePublished - ○ RSS の pubDate
媒体 ○ ドメインで判定 ○ ○
サムネイル ○ og:image ○ og:image ○ RSS 内の本文の先頭画像
  • Medium は記事ページへのリクエストがボット対策で 403 になるため、公式 RSS (medium.com/feed/@ユーザー名 など) を使っています。RSS に載るのは直近 10 件程度なので、古い記事は取れず手動入力になります (媒体だけはドメインから入ります)。
  • Zenn の公開日はページ内部のデータにしか無く、関連記事の日付を誤って拾う恐れがあるので取っていません。
  • 公開日は日本時間の日付にしています。

変更内容

  • lib/blog-metadata.ts: 記事URLから情報を取得する処理 (サーバー側)
    • 取得先を Qiita / Zenn / Medium のドメインに限定 (SSRF 対策: サーバーから任意のURLへリクエストさせない)
    • リダイレクトは redirect: "manual" で 1 回ずつ追い、行き先が許可ドメインでない・https でないときは打ち切る (最大 3 回)
    • タイムアウト 5 秒、本文は 2MB まで
  • app/api/blogs/metadata/route.ts: 上記を呼ぶ API。ログイン済み・未退会のメンバーだけが使える。取れなかったときも 200 で metadata: null
  • lib/blog-autofill.ts: フォームのどの欄に入れるか / いつ消すかを決める純粋関数
  • components/blogs/blog-manager.tsx:
    • 記事URLの欄からフォーカスを外したとき、空欄にだけ自動で入れる (手で入れた値は上書きしない)
    • 「記事の情報を取り直す」ボタンで、入力済みの欄も上書きして取り直せる
    • 自動で入れた値は、記事URLを変えたら消す (前の記事の値が残らないように)。書き換えた値は残す
    • 取得中は「登録する」を押せない (取得完了前に登録すると、届いた値が捨てられていたため)

テスト

  • lib/blog-metadata.test.ts / lib/blog-autofill.test.ts を追加 (43 件)
    • 紛らわしいドメイン (qiita.com.evil.example、evilmedium.com)、http、許可外へのリダイレクト、リダイレクトの上限、2MB 超の本文、タイムアウト、タイトル末尾の媒体名の削り方、日本時間への変換 (UTC で日付がずれる時刻)、手で入れた値を消さないこと など
  • 全体: 24 ファイル / 391 件 passed
  • 実際のサイトで確認: Qiita・Zenn・最近の Medium 記事は取得でき、古い Medium 記事は null (手動入力)
  • ローカル (Firestore エミュレータ) のブラウザで、自動入力 → 登録 → 公開一覧 (/blogs) での表示まで確認

スクリーンショット (ローカル)

Qiita の記事URLを入力してフォーカスを外すと、各項目が自動で入る

blog-autofill-form

登録後、公開一覧 (/blogs) にサムネイル付きで表示される (右は Medium の記事)

blog-list

🤖 Generated with Claude Code

- Qiita / Zenn は記事ページの OGP と JSON-LD、Medium は公式 RSS から取得する
- 取得先は Qiita / Zenn / Medium のドメインに限り、リダイレクト先も確かめる (SSRF 対策)
- 自動で入れた値は記事URLを変えたら消し、手で入れた値は残す
- 取得中は登録ボタンを押せないようにする

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Tivo0921 Tivo0921 added the enhancement New feature or request label Oct 24, 2026
@Tivo0921 Tivo0921 self-assigned this Oct 24, 2026
@Tivo0921
Tivo0921 requested a review from Seripro October 24, 2026 04:21
@github-actions

Copy link
Copy Markdown

Deployed on https://dev-pr-355-birbz3fm6q-an.a.run.app

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] ブログの記事URLからサムネイル画像URLを自動で取得する

1 participant