Gemini APIで情報収集・要約・通知を自動化！パーソナルAIサポーター フレームワーク 🧠

## 📌 はじめに

「毎日特定のWebサイトをチェックして情報をまとめるのが大変...」
「気になるニュースや求人情報を自動で収集して、LINEやSlackに通知してくれたら便利なのに...」

そんな課題を解決するために、Google Gemini API を活用した情報収集・要約・通知フレームワーク「**Gemini Notifier Framework**」を開発しました！

このフレームワークを使えば、プロンプトファイルと設定値を変更するだけで、**求人情報、美術館の展示情報、特定の分野のニュース要約、日替わり知識の提供**など、様々な情報を自動で収集・要約し、指定した通知媒体（LINE, Slack）へ投稿できます。

本記事では、このフレームワークの概要、使い方、応用例についてご紹介します。

## ✨ フレームワークの特徴

*   **🔄 自動化:** Web上の情報収集 → Geminiによる要約 → 通知媒体への投稿 → 結果の保存まで、一連のフローを自動化します。
*   **🔧 簡単カスタマイズ:** `config` 配下のプロンプトファイル (`summary_prompt.txt`, `detail_prompt.txt`) を編集するだけで、収集したい情報の内容や要約の指示を自由に変更できます。
*   **⏱️ 定期実行:** GitHub Actions を使って、毎日・毎時など、設定したスケジュールで自動実行できます。
*   **📁 結果の保存:** 最新の要約結果だけでなく、過去の要約結果も日付ごとにJSON形式でアーカイブされるため、後から振り返ったり、時系列での分析にも活用できます。
*   **🚀 応用範囲:** 求人、イベント情報、ニュース、学習コンテンツなど、アイデア次第で様々な分野の情報収集・通知ボットを作成可能です。

## 🛠️ 技術スタック

*   プログラミング言語: Python 3.x
*   AIモデル: Google Gemini API
*   通知: LINE Notify API, Slack API
*   自動実行: GitHub Actions
*   その他: python-dotenv など

## 📂 ディレクトリ構成

プロジェクトの構成は以下のようになっています。

```
project-root/
├── config/
│   ├── summary_prompt.txt        # 要約投稿用プロンプト（必須）
│   └── detail_prompt.txt         # 詳細投稿用プロンプト（任意）
├── data/
│   ├── summary_result.txt        # Geminiの直近summary出力（通知用）
│   └── archive.json              # summaryのアーカイブ（日付キー）
├── src/
│   ├── main.py                   # CLI引数に応じた制御
│   ├── summary.py                # summaryモジュール（検索 + 要約 + 保存 + 通知）
│   └── detail.py                 # detailモジュール（深掘り + 要約 + 通知）
├── .github/workflows/
│   ├── summary.yml               # GitHub Actions - 毎朝 summary 実行
│   └── detail.yml                # GitHub Actions - detailを毎時実行
├── .env                          # 環境変数定義（GitHub Secretsに対応）
└── README.md
```

*   `config/`: Geminiに与える指示（プロンプト）を格納します。
*   `data/`: Geminiの出力結果やアーカイブデータを保存します。
*   `src/`: メインの処理を行うPythonスクリプト群です。
*   `.github/workflows/`: GitHub Actionsによる自動実行設定ファイルです。
*   `.env`: APIキーなどの機密情報を管理します（リポジトリには含めません）。

## 🚀 使い方

### 1. 環境変数の設定

プロジェクトルートに `.env` ファイルを作成し、必要なAPIキーやトークンを設定します。GitHub Actions で実行する場合は、リポジトリの Secrets に同様のキーで設定してください。

```dotenv:.env
# .env ファイル または GitHub Secrets
GEMINI_API_KEY=your_gemini_api_key
LINE_CHANNEL_ACCESS_TOKEN=your_line_channel_access_token
LINE_GROUP_ID=your_line_group_id_or_user_id
SLACK_BOT_TOKEN=your_slack_bot_token
SLACK_CHANNEL_ID=your_slack_channel_id
```

*   `GEMINI_API_KEY`: Google AI Studio などで取得した Gemini API キー。
*   `LINE_CHANNEL_ACCESS_TOKEN`, `LINE_GROUP_ID`: LINE Notify または Messaging API の設定。通知を送りたいグループIDやユーザーIDを指定します。
*   `SLACK_BOT_TOKEN`, `SLACK_CHANNEL_ID`: Slack Bot のトークンと通知したいチャンネルID。

### 2. プロンプトの作成・編集 (config/)

`config` ディレクトリ内のプロンプトファイルを編集して、収集・要約したい内容をGeminiに指示します。

*   **`summary_prompt.txt` (必須):**
    *   収集したい情報の種類、条件、件数などを具体的に記述します。
    *   例：「今日の東京都内で開催されている、障がい者が無料で観覧できる美術館・博物館の展示情報を5件リストアップしてください。展示名、場所、簡単な概要を含めてください。」
*   **`detail_prompt.txt` (任意):**
    *   `summary` で取得した情報の中から1件を選び、さらに深掘りするための指示を記述します。
    *   例：「summaryで取得した展示の中から1つを選び、その展示の見どころや魅力を、アートに詳しくない人にも分かるように200字程度で解説してください。」

### 3. 実行方法

ローカル環境で実行する場合は、以下のコマンドを使用します。

```bash
# 概要情報の収集・要約・通知・保存を実行
python src/main.py --mode summary

# 概要情報の中から1件を選び、詳細情報を要約・通知を実行
python src/main.py --mode detail
```

## 🔁 GitHub Actions による自動実行

`.github/workflows/` 配下のYAMLファイルをリポジトリに配置することで、GitHub Actionsによる定期実行が可能です。

### `summary.yml` (毎日の概要情報収集)

```yaml
name: Daily Summary Notification

on:
  schedule:
    # 毎日 00:00 UTC (日本時間 9:00) に実行
    - cron: '0 0 * * *'
  workflow_dispatch: # 手動実行も可能にする

jobs:
  summary:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: pip install -r requirements.txt # 必要に応じて requirements.txt を作成・管理してください
    - name: Run summary script
      env:
        GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        LINE_CHANNEL_ACCESS_TOKEN: ${{ secrets.LINE_CHANNEL_ACCESS_TOKEN }}
        LINE_GROUP_ID: ${{ secrets.LINE_GROUP_ID }}
        SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
        SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
      run: python src/main.py --mode summary
    # 必要に応じて data/summary_result.txt や data/archive.json をコミットする処理を追加
    # - name: Commit results
    #   run: |
    #     git config --local user.email "action@github.com"
    #     git config --local user.name "GitHub Action"
    #     git add data/
    #     git commit -m "Update summary results" || echo "No changes to commit"
    #     git push || echo "No changes to push"
```

### `detail.yml` (毎時の詳細情報通知)

```yaml
name: Hourly Detail Notification

on:
  schedule:
    # 毎時 01:00 から 05:00 UTC (日本時間 10:00 から 14:00) の 0分に実行
    - cron: '0 1-5 * * *'
  workflow_dispatch:

jobs:
  detail:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: pip install -r requirements.txt # 必要に応じて
    - name: Run detail script
      env:
        GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
        LINE_CHANNEL_ACCESS_TOKEN: ${{ secrets.LINE_CHANNEL_ACCESS_TOKEN }}
        LINE_GROUP_ID: ${{ secrets.LINE_GROUP_ID }}
        SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
        SLACK_CHANNEL_ID: ${{ secrets.SLACK_CHANNEL_ID }}
      run: python src/main.py --mode detail
```
*(注意: 上記のGitHub ActionsのYAMLファイルは基本的な例です。リポジトリの構成やPythonの依存関係に応じて `requirements.txt` のインストールなど、適宜修正してください。また、`data/` ディレクトリの変更をコミット・プッシュする処理はオプションです。)*

## 💾 保存機能について

Geminiによる要約結果は、以下のファイルに保存されます。

*   `data/summary_result.txt`:
    *   `summary` モードで実行された際の、最新の要約結果がプレーンテキストで保存されます。
    *   主にLINEやSlackへの通知メッセージとして利用されることを想定しています。
*   `data/archive.json`:
    *   `summary` モードで実行されるたびに、その日の日付をキーとして要約結果がJSON形式で追記・保存されます。
    *   過去の要約結果を時系列で確認したり、分析したりするのに役立ちます。

```json:data/archive.json Example
{
  "2023-12-01": "今日の無料展示情報：\n1. ○○美術館「△△展」 - 場所：××区、概要：現代アート...\n2. ...",
  "2023-12-02": "今日の無料展示情報：\n1. □□博物館「◇◇展」 - 場所：◎◎市、概要：歴史資料...\n2. ..."
}
```

## 💡 応用例

プロンプトファイル (`config/*.txt`) を変更するだけで、様々な用途に応用できます。

### ✅ 求人通知ボット

*   `summary_prompt.txt`: 「データサイエンティスト」や「Webエンジニア」など、特定の職種に関する最新の求人情報を、勤務地、給与、必須スキルを含めて5件要約してください。障がい者採用枠の情報があれば優先してください。
*   `detail_prompt.txt`: `summary` で見つかった求人の中から1件を選び、その企業の事業内容や、募集職種のチーム文化について200字で解説してください。
*   通知先: Slack の就職活動用チャンネル

### ✅ 美術館・イベント展示ガイド

*   `summary_prompt.txt`: 今日、東京都内で開催されている入場無料の美術展または特別展の情報を5件リストアップしてください。展示名、会場、簡単な見どころを含めてください。
*   `detail_prompt.txt`: `summary` のリストから1件を選び、その展示の時代背景や、代表的な作品について、子供にもわかるように200字で説明してください。
*   通知先: LINE の家族グループ

### ✅ ニュース要約・学習支援ボット

*   `summary_prompt.txt`: 最新の「量子コンピュータ」に関する技術ニュースを3つ要約してください。専門用語は避け、中学生にも理解できるように説明してください。
*   `detail_prompt.txt`: `summary` のニュースの中から1つを選び、その技術が将来私たちの生活にどのような影響を与える可能性があるか、具体的な例を挙げて200字で説明してください。
*   通知先: 個人の LINE Notify

## 🌍 このフレームワークの意義

Gemini Notifier Framework は、単なる情報収集ツールではありません。**毎日自動で情報を収集・要約・通知することで、私たちの「知る」体験を拡張するパーソナルAIサポーター**となることを目指しています。

*   **情報アクセシビリティの向上:** Webサイトの閲覧や情報収集が困難な方々（例：視覚障がいのある方）にとって、要約された情報を音声読み上げ等で利用しやすい形で提供できます。
*   **学習効率の向上:** 特定分野の最新動向やニュースを毎日自動で要約・通知することで、効率的な情報収集と学習をサポートします。
*   **業務効率化:** 企業内での特定分野のニュースクリッピングや競合動向調査などを自動化し、情報収集にかかる時間を削減します。

## 🔧 今後の拡張案

*   **多言語対応:** プロンプトや設定を調整し、英語、中国語など多言語の情報を扱えるようにする。
*   **トピック分類・クラスタリング:** 収集した情報を自動でカテゴリ分類したり、関連性の高いトピックをグループ化したりする機能を追加する。
*   **対話的な改善:** 通知結果に対してユーザーが「良い」「悪い」といったフィードバックを与え、それを基にGeminiのプロンプトや要約精度を改善する仕組み（強化学習的なアプローチ）を導入する。
*   **対応通知媒体の追加:** Discord, Microsoft Teams など、他の通知プラットフォームへの対応を追加する。

## 🎉 おわりに

Gemini Notifier Framework は、Gemini API の強力な言語能力と自動化技術を組み合わせることで、情報収集のあり方をパーソナライズし、より豊かにする可能性を秘めています。

ぜひ、あなたのアイデアでこのフレームワークをカスタマイズし、日々の情報収集や学習、業務に役立ててみてください。

ご意見、ご感想、改善提案など、お気軽にコメントいただけると嬉しいです！

---