📊

ZennトレンドをClaude APIで自動レポート化するミニアプリを作った【Anthropic API入門】

「最新技術のキャッチアップが追いつかない…」そんなエンジニアのために、Zennのトレンド記事をClaude APIで自動解説レポートに変換するミニアプリを作ります。ChatGPT APIを使ったことがある方にも、Claudeならではの書き方の違いが伝わるよう解説します。

はじめに

エンジニアの日常あるある:

  • Zennのトレンドを見て「気になる…」と思いつつ、読む時間がない
  • 技術用語だけ並んでいて、何が嬉しいのかよくわからない
  • 毎日チェックするのが地味につらい

このアプリはそれを解決します。ZennのRSSフィードでトレンドを取得 → Claude APIでわかりやすい解説レポートを自動生成 → Markdownファイルとして保存、これだけです。

この記事でゴールとすること

Zennの公式RSSフィードからトレンド記事を取得し、
Claude APIが「今週注目すべき技術とその理由」をレポートとして生成し、
output/yyyy-mm-dd_hh-mm-ss.md として保存する

コード量は全部で約120行。APIキーさえあれば今日中に動かせます。

https://youtu.be/nPcyy0oiX6A

ZennのRSSフィードについて

Zennには公式のトレンドRSSフィードが提供されています。

https://zenn.dev/feed

このURLにアクセスするだけで、現在トレンドの記事20件がXML形式で返ってきます。登録不要・APIキー不要・完全無料なのが嬉しいポイントです。

トピック別のフィードも用意されています。

URL 内容
https://zenn.dev/feed 全体トレンド(今回使用)
https://zenn.dev/topics/python/feed Pythonタグのトレンド
https://zenn.dev/topics/typescript/feed TypeScriptタグのトレンド

なお、Zennには非公式のAPIも存在しますが(https://zenn.dev/api/**)、公式ドキュメントがなくバージョン変更で動かなくなるリスクがあります。公式RSSを使うのが安定・安全です。

なぜClaude APIなのか

OpenAI APIを使ったことがある方向けに一言で言うと、「日本語のレポート生成においてClaudeは特に自然」という感覚があります。技術解説のような「正確さ」と「読みやすさ」を両立させたい用途にフィットします。

現在のモデルラインナップはシンプルで選びやすいです。

モデル 用途 料金(入力/出力 per 1M tokens)
claude-haiku-4-5 高速・低コスト $1 / $5
claude-sonnet-4-6 バランス重視(今回使用) $3 / $15
claude-opus-4-7 最高精度 $5 / $25

今回のようなレポート生成には claude-sonnet-4-6 がコスパ最良です。1回のレポート生成で消費するのはせいぜい数千トークン、コストは数円以下の世界です。

環境構築:uvを使う

今回はPythonパッケージマネージャーに uv を使います。pip より圧倒的に速く、仮想環境の管理も一体化されているため、近年エンジニアの間で急速に普及しています。

uvのインストール

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows(PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

プロジェクトの初期化

uv init trend_reporter
cd trend_reporter
uv vnev

これだけで pyproject.toml と仮想環境の準備が整います。

依存ライブラリの追加

uv add anthropic feedparser python-dotenv

pip install の代わりに uv add を使います。自動で pyproject.toml に記録されます。

環境変数の設定

プロジェクトルートに .env ファイルを作成します。

ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxx

.gitignore.env を追加することを忘れずに!

echo ".env" >> .gitignore

ディレクトリ構成

trend_reporter/
├── .env
├── .gitignore
├── pyproject.toml       # uv が自動生成
├── main.py
└── output/              # レポートの保存先(自動作成)
    ├── 2025-04-30_09-00-00.md
    └── 2025-05-01_09-00-00.md

実装(main.py)

import os
import feedparser
import anthropic
from datetime import datetime
from pathlib import Path
from dotenv import load_dotenv

load_dotenv()

# ── 1. ZennトレンドRSSの取得 ──────────────────────────────
def fetch_zenn_trends(n: int = 10) -> list[dict]:
    """ZennのトレンドRSSフィードから記事を取得する"""
    feed = feedparser.parse("https://zenn.dev/feed")

    articles = []
    for entry in feed.entries[:n]:
        articles.append({
            "title": entry.title,
            "url": entry.link,
            "summary": entry.get("summary", "")[:200],  # 冒頭200文字
            "published": entry.get("published", ""),
            "author": entry.get("author", ""),
        })

    return articles


# ── 2. Claude APIでレポート生成 ───────────────────────────
def generate_report(articles: list[dict]) -> str:
    """取得した記事リストをもとにClaude APIでレポートを生成する"""
    client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

    article_list = "\n".join([
        f"- 【{a['title']}\n  URL: {a['url']}\n  概要: {a['summary'][:100]}..."
        for a in articles
    ])

    today = datetime.now().strftime("%Y年%m月%d日")

    prompt = f"""
あなたはエンジニア向けの技術トレンドアナリストです。
以下は {today} 時点のZennでトレンドとなっている記事一覧です。

{article_list}

これらをもとに、以下の構成でレポートを作成してください。

## 今週のZenn技術トレンドレポート

### 📌 注目キーワード TOP3
(記事タイトルや概要から頻出・注目度の高い技術キーワードを3つ選び、各100字以内で「なぜ今注目されているか」を解説)

### 📋 記事サマリー
(各記事を1〜2文で要約。初心者にもわかる言葉で。記事URLも併記)

### 💡 エンジニアへのひとこと
(トレンドを踏まえた、今週学ぶと良いことを1段落で)

日本語で、読みやすく・具体的に書いてください。
"""

    print("Claude APIでレポートを生成中...")
    with client.messages.stream(
        model="claude-sonnet-4-6",
        max_tokens=1500,
        messages=[{"role": "user", "content": prompt}]
    ) as stream:
        report = stream.get_final_text()

    return report


# ── 3. Markdownファイルとして保存 ─────────────────────────
def save_report(report: str, articles: list[dict]) -> Path:
    """レポートをoutput/yyyy-mm-dd_hh-mm-ss.md として保存する"""
    output_dir = Path("output")
    output_dir.mkdir(exist_ok=True)

    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    filepath = output_dir / f"{timestamp}.md"

    # ファイルの先頭にメタ情報を付与
    header = f"""# Zenn技術トレンドレポート
生成日時: {datetime.now().strftime("%Y年%m月%d日 %H:%M:%S")}
取得記事数: {len(articles)}

---

"""
    filepath.write_text(header + report, encoding="utf-8")
    return filepath


# ── メイン処理 ────────────────────────────────────────────
if __name__ == "__main__":
    print("Zennトレンドを取得中...")
    articles = fetch_zenn_trends(n=10)
    print(f"{len(articles)}件の記事を取得しました\n")

    for i, a in enumerate(articles, 1):
        print(f"  {i}. {a['title']}")
    print()

    report = generate_report(articles)

    saved_path = save_report(report, articles)
    print(f"\n✅ レポートを保存しました: {saved_path}")

    print("\n--- レポートプレビュー ---\n")
    print(report)

実行してみる

uv run main.py

uv run を使うと、仮想環境をアクティベートしなくても正しい環境でスクリプトが実行されます。

実行すると、こんな出力が得られます(例):

Zennトレンドを取得中...
10件の記事を取得しました

  1. AI VTuber開発日記 〜AIキャラクターの作成からOBSを用いたYouTube配信まで〜
  2. Rust初心者でも簡単にゲームが作れる!macroquad入門
  3. ...

Claude APIでレポートを生成中...

✅ レポートを保存しました: output/2025-04-30_09-00-12.md

--- レポートプレビュー ---

## 今週のZenn技術トレンドレポート

### 📌 注目キーワード TOP3
...

output/ フォルダに 2025-04-30_09-00-12.md のようなファイルが生成されます。毎日実行するとレポートが蓄積されていきます。


ChatGPT APIとの書き方の違い

OpenAI APIを使ったことがある方向けに比較します。

# ── OpenAI APIの場合 ──
from openai import OpenAI
client = OpenAI(api_key="...")
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "Hello"}]
)
print(response.choices[0].message.content)  # ← choices[0].message.content

# ── Anthropic APIの場合 ──
import anthropic
client = anthropic.Anthropic(api_key="...")
message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,           # ← 必須パラメータ(OpenAIは任意)
    messages=[{"role": "user", "content": "Hello"}]
)
print(message.content[0].text)  # ← content[0].text でアクセス

主な違いは2点:

  • max_tokens必須 パラメータ(OpenAIでは任意)
  • レスポンスの取り出しが message.content[0].textchoices[0].message.content ではない)

カスタマイズのアイデア

トピック別に絞り込む

# Pythonのトレンドだけ取得
feed = feedparser.parse("https://zenn.dev/topics/python/feed")

# 複数トピックを合算する場合
topics = ["python", "typescript", "rust"]
all_entries = []
for topic in topics:
    f = feedparser.parse(f"https://zenn.dev/topics/{topic}/feed")
    all_entries.extend(f.entries[:5])

毎日自動実行する

GitHub Actionsのスケジュール機能と組み合わせると、毎朝レポートが自動生成・保存されます。

# .github/workflows/daily_report.yml
on:
  schedule:
    - cron: '0 0 * * *'  # 毎日UTC 0時(JST 9時)
jobs:
  report:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v4
      - run: uv run main.py

Streamlitで画面を作る

uv add streamlit
import streamlit as st

st.title("Zennトレンドレポート")
if st.button("レポートを生成"):
    with st.spinner("取得中..."):
        articles = fetch_zenn_trends()
        report = generate_report(articles)
        save_report(report, articles)
    st.markdown(report)

まとめ

今回作ったものを振り返ると:

  • uv でシンプルかつ高速に環境構築
  • Zenn公式RSSフィード でトレンド記事を取得(登録不要・無料・安定)
  • Claude API(Sonnet 4.6) でレポートを自動生成
  • output/yyyy-mm-dd_hh-mm-ss.md としてレポートを蓄積保存
  • コスト は1回あたり数円以下

「Hello World」ではなく、実際に自分が毎日使えるものを作るのが一番の近道です。

次のステップ

  • Streamlit でWeb UI化(数十行追加するだけ)
  • GitHub Actions で毎朝自動生成 → レポートをリポジトリに蓄積
  • Claude APIの system パラメータ でレポートのトーンや形式を固定する
  • Qiita APIと組み合わせる でより広範なトレンドカバレッジを実現

参考リンク

ヘッドウォータース

Discussion