「毎朝のAIやテック業界の最新動向を追いたいけれど、情報が多すぎて追いつかない」
「ニュース収集を自動化しても、データがあちこちに散乱して後から活用できない」
このような悩みを抱えていませんか?
本記事では、RSSによる最新テック記事の収集 ➔ Gemini 3.1 Flash-Lite による要点・発信ネタの自動抽出 ➔ 毎朝7時のSlack通知 ➔ Obsidian(第二の脳)への直接同期 までを一気通貫で完結させる自律自動化システムのアーキテクチャと実装手順を徹底解説します。
[!TIP]
【この記事の要約(TL;DR)】
- 全自動リサーチ: ITmedia AI+、Zenn等の一次フィードから最新記事を自動収集し、Gemini 3.1 Flash-Liteで「要約+自身への影響+発信ネタ」を即時生成。
- 完全自律配信: Macの常駐機能(
launchd)により、PCを開かなくても毎朝7:00にスマホのSlackへ朝刊が届く。- SSOT(第二の脳)設計: 中間JSONを完全に廃止し、Obsidian内のMarkdownファイル(
00_Inbox)を唯一のマスターデータとして管理。- 1年後も爆速なダッシュボード: サーバーが必要な分だけMarkdownをオンデマンドパースすることで、1年(365日分)溜まっても0.005秒で高速表示。
1. なぜ「中間DB」を捨てて「Obsidian直結」にしたのか?
A. 自動化ツールが陥りがちな「データの散乱問題」
ニュース要約ツールを開発する際、多くの場合は「取得したデータをJSONやSQLiteに溜めてWeb画面で見る」という設計にしがちです。
しかし、この方法には2つの大きな欠点があります:
- 1年後のパフォーマンス劣化: 毎日追記される単一JSONファイルは肥大化し、ブラウザの読み込みや検索がどんどん重くなる。
- 知識の分断: 要約データがツールのデータベース内に閉じ込められ、普段メモや執筆を行っている「Obsidian」と連携できない。
graph TD
subgraph 従来のブラックボックス構造
A1[RSS収集] --> B1[巨大JSONファイル]
B1 --> C1[Webダッシュボード]
B1 -.->|手動コピペ| D1[Obsidian]
end
subgraph 036 FactoryのSSOT構造(今回の設計)
A2[RSS収集] --> B2[Gemini 3.1 Flash-Lite]
B2 --> C2[Slack通知(即時確認)]
B2 --> D2[Obsidian Markdown直接保存]
D2 -->|オンデマンド読み込み| E2[軽量ダッシュボードUI]
D2 -->|引用・リンク| F2[ブログ / SNS執筆]
end
B. Single Source of Truth(唯一の情報源)の確立
そこで採用したのが、「Obsidianノートを唯一のマスターデータ(正本)とするSSOT設計」 です。
- 毎朝の速報は、直接
Obsidian_Notes/00_Inbox/Daily_Tech_Brief_YYYYMMDD.mdに保存する。 - Webダッシュボードは、そのフォルダ内の最新Markdownファイルを直接読み取って表示するだけにする。
これにより、二重管理の無駄が完全にゼロになり、Obsidianの強力な全文検索やリンク機能を100%活かせるようになります。
2. システムの全体像とコア技術
| レイヤー | 採用技術 | 役割と選定理由 |
|---|---|---|
| 情報収集 | Python urllib / xml.etree | 外部依存ライブラリを最小限に抑え、ITmediaやZennのRSSを高速取得 |
| AI要約エンジン | Gemini 3.1 Flash-Lite | 高速・超低コストで文脈を理解し、構造化JSONでトピックを抽出 |
| プッシュ通知 | Slack Incoming Webhook | 毎朝起きた瞬間にスマホで読めるよう最適化されたフォーマットで通知 |
| ナレッジ保管庫 | Obsidian (Markdown) | 「第二の脳」としての永続保存・検索・記事ネタへの引用 |
| 定期実行 | macOS launchd | サーバー起動不要。MacのOS機能で毎朝7:00に完全自律実行 |
| UIビューア | Vanilla HTML / CSS (daily_brief.html) | 直近ログの展開とアコーディオン開閉、リアルタイム検索 |
3. 実装のキモ:Pythonスクリプトの設計
A. Gemini 3.1 Flash-Liteによる「実務直結」プロンプト
ただ記事を要約するだけでなく、「自分の開発や発信にどう役立つか」を出力させるプロンプト設計が最大のポイントです。
prompt = f"""あなたは専属のAIアシスタントです。
以下の最新テック・AI記事リストから、個人開発・AI活用・Obsidianを重視するクリエイターにとって価値の高い重要トピックを最大3件厳選し、ブリーフィングを作成してください。
【記事リスト】
{article_text}
【出力フォーマット(JSON形式)】
{{
"headline": "今朝の一言サマリー(20文字前後)",
"topics": [
{{
"title": "トピック見出し",
"summary": "何が起きたか・発表されたかの簡潔な要約(60〜80字)",
"impact": "自身への影響や活用ポイント(40〜60字)",
"source_url": "元記事URL"
}}
],
"ann_advice": "本日のSNS・ブログ発信や制作活動への具体的提案(80字前後)"
}}
"""
B. Obsidianノート(Markdown)への直接保存ロジック
パースしやすいFrontmatter付きのMarkdownとして出力します。
def save_to_obsidian(brief_data):
now = datetime.now()
md_filename = f"Daily_Tech_Brief_{now.strftime('%Y%m%d')}.md"
md_path = OBSIDIAN_INBOX / md_filename
headline = brief_data.get("headline", "")
md_content = f"""---
title: "毎朝AI・テック速報 {now.strftime('%Y-%m-%d')}"
date: {now.strftime('%Y-%m-%d %H:%M')}
headline: "{headline}"
tags: [daily_brief, ai_news, tech_trend]
---
# ☀️ 毎朝AI・テック速報({now.strftime('%Y年%m月%d日')})
## 📌 ヘッドライン
> {headline}
## ⚡ 厳選トピック
"""
for i, t in enumerate(brief_data.get("topics", []), 1):
md_content += f"\n### {i}. {t.get('title')}\n"
md_content += f"- **概要:** {t.get('summary')}\n"
md_content += f"- **活用・影響:** {t.get('impact')}\n"
if t.get("source_url"):
md_content += f"- **出典:** [{t.get('title')}]({t.get('source_url')})\n"
md_content += f"""
---
## 💡 Annの本日の提案
> {brief_data.get('ann_advice')}
"""
with open(md_path, "w", encoding="utf-8") as f:
f.write(md_content)
4. 1年後も0.005秒で動くダッシュボードAPIの設計
A. オンデマンド・スライス読み込み
1年分(365ファイル)あっても、サーバー側で最新30ファイルのみを glob してパースするため、通信量もCPU負荷も初日と全く変わりません。
# dashboard_server.py での処理例
obsidian_inbox = PROJECT_ROOT / "Obsidian_Notes/00_Inbox"
# ファイル名降順(最新日付順)でソートし、最新30件のみを抽出
brief_files = sorted(list(obsidian_inbox.glob("Daily_Tech_Brief_*.md")), reverse=True)[:30]
logs = []
for bf in brief_files:
with open(bf, "r", encoding="utf-8") as f:
content = f.read()
# 正規表現でFrontmatter、トピック、提案を高速抽出してJSON化
...
5. よくある質問(FAQ)
Q1. なぜ外部のニュース要約SaaSを使わずに自作したのですか?
A. 汎用的なニュース配信サービスだと、不要なノイズ情報が多く、「自分の開発環境(ObsidianやPython、Geminiエコシステム)にどう活かせるか」という個別最適化された示唆が得られないためです。自作システムであれば、プロンプトひとつで自分の関心領域に100%フォーカスした情報だけを抽出できます。
Q2. Macがスリープしている場合は実行されますか?
A. macOSの launchd は、指定時刻にMacがスリープしていた場合、スリープ復帰時に即座にジョブを実行する設計になっています。そのため、朝起きてMacを開いた瞬間に自動でリサーチが走り、Slackに通知が届きます。
Q3. API料金はどれくらいかかりますか?
A. 本システムで使用している gemini-3.1-flash-lite は、極めて低コスト(数トークンあたり数銭レベル)です。毎朝1回の実行であれば、1ヶ月運用しても数円〜数十円程度で収まります。
6. まとめ:情報を「消費」から「資産」へ
情報収集を「ただニュースを読むだけ」で終わらせず、「第二の脳(Obsidian)に蓄積し、ブログやSNSの制作ネタへ即座に転換する仕組み」 を構築することで、毎日のインプット効率は劇的に向上します。
ぜひ本記事の設計を参考に、あなた専用の自律型リサーチ環境を構築してみてください。