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キーさえあれば今日中に動かせます。
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].text(choices[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