【企画書】SNSから不満を取得→解消アイデアを提起

## 概要

この記事では、X（旧Twitter）のトレンドや投稿からネガティブな内容を抽出し、それをAIで解析して不満を解消するための具体的なサービスアイデアを生成するツール「不満バスターズ」の仕組みと実装について解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e31f6491-4dcc-4465-a4c4-f581fe9eba90.png)

このツールは以下の処理を行います

1. Xのトレンドを取得
2. トレンドの感情分析を実施
3. ネガティブなトレンドに基づき、AIでサービスアイデアを生成
4. 生成されたアイデアを複数の形式（140文字投稿、キャンプファイヤー形式、Qiita形式）に変換
5. Xに自動投稿し、ローカルに保存

:::note
現在、このサービスはCAMPFIREを通じて資金調達を計画しています。
https://camp-fire.jp/projects/841211/view
:::

## ソース
https://github.com/Syogo-Suganoya/IdeaX

## 使用技術

- **Python**: 全体の実装
- **Tweepy**: X APIを利用したトレンド取得と投稿
- **LLM**: AI生成

---

## 処理の流れ

以下に、ツールの処理フローをコードとともに解説します。

---

### 1. トレンドの取得

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/abd8061a-fab1-4864-bb2f-19f7da7ad5c2.jpeg)

まず、Xのトレンドを取得します。実際のAPIを使用する場合と、モックデータを使用する場合の2通りをサポートしています。

```python
# filepath: src/lib/x_api.py
import tweepy
import json

def get_trends(woeid):
    """
    指定された場所のトレンドを取得します。
    """
    auth = tweepy.OAuthHandler(X_API_KEY, X_API_KEY_SECRET)
    auth.set_access_token(X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)

    trends = api.get_place_trends(woeid)
    return [trend["name"] for trend in trends[0]["trends"]]

def get_trends_mock(file_path, num_tweets=10):
    """
    モックのトレンドポストデータを読み込みます。
    """
    with open(file_path, "r", encoding="utf-8") as f:
        tweets = json.load(f)
    return tweets[:num_tweets]
```

---

### 2. 感情分析

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/9efdb528-6a7a-4d20-8285-6d02de8b4a73.jpeg)

取得したトレンドの中から、ネガティブなものを抽出します。Geminiモデルを使用して感情分析を行います。

```python
# filepath: src/lib/gemini_api.py
from google import genai

def query(prompt):
    """
    Geminiモデルを使用してプロンプトを処理します。
    """
    client = genai.Client(api_key=GEMINI_KEY)
    response = client.models.generate_content(
        model="gemini-2.0-flash-lite",
        contents=prompt,
    )
    return response.text.strip()
```

感情分析のプロンプトは以下のテンプレートを使用します：

```txt
# filepath: prompt/analyze_sentiment.txt
以下のテキストの感情を分析してください。ネガティブな感情が含まれている場合は、その感情の種類を返してください。そうでない場合は、"ポジティブ"と返してください。

テキスト: ###TEXT###

感情:
```

---

### 3. サービスアイデアの生成

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e1834a71-774d-4d73-9c0c-c94dcdce0f8b.jpeg)

ネガティブなトレンドに基づき、AIで不満を解消するためのサービスアイデアを生成します。

```python
# filepath: src/main.py
for trend in negative_trends:
    idea = gemini_api.query(tmp_analyze_complaint.replace("###POST_TEXT###", trend))
    if not idea:
        print("アイデア生成に失敗しました。")
        continue
```

プロンプトのテンプレートは以下の通りです。

```txt
# filepath: prompt/analyze_complaint.txt
あなたは不満を解消するアイデアを提案する専門家です。
以下の不満ポストを解析し、不満を解消するための具体的なサービスのアイデアを提案してください。

不満ポスト:
###POST_TEXT###

アイデア:
```

---

### 4. 形式変換

生成されたアイデアを以下の形式に変換します。

- **140文字投稿**
- **Campfire形式**
- **Qiita形式**

プロンプトのテンプレート

```txt
# filepath: prompt/generate_x.txt
以下のサービスアイデアを140文字以内で要約してください。Twitter向けに、短くても魅力的に伝わるようにしてください。

📌 サービスアイデア:
###SERVICE_TEXT###
```

---

### 5. 自動投稿と保存

生成されたアイデアをXに投稿し、ローカルに保存します。

```python
# filepath: src/main.py
# ファイルを作成
targets = [("x.txt", text_x), ("campfire.md", text_campfire), ("README.md", text_qiita)]
for filename, content in targets:
    with open(os.path.join(title, filename), "w", encoding="utf-8") as file:
        file.write(content)

# Xに投稿
tweet_id = x_api.post_tweet(text_x)
x_api.post_tweet(text_qiita[:140], tweet_id)
```

---

## 実行方法

1. 必要なライブラリをインストールします。

    ```bash
    pip install -r requiments.txt
    ```

2. 環境変数を設定します。

    `.env` ファイルを作成し、以下の内容を記載してください。

    ```env
    X_API_KEY="YOUR_X_API_KEY"
    X_API_KEY_SECRET="YOUR_X_API_KEY_SECRET"
    X_ACCESS_TOKEN="YOUR_X_ACCESS_TOKEN"
    X_ACCESS_TOKEN_SECRET="YOUR_X_ACCESS_TOKEN_SECRET"
    X_BEARER_TOKEN="YOUR_X_BEARER_TOKEN"
    GEMINI_KEY="YOUR_GEMINI_API_KEY"
    ```

3. モックデータを使用して実行します。

    ```bash
    python src/main.py --mock
    ```

---

## まとめ

この記事では、X（旧Twitter）のトレンドから不満を解消するアイデアを生成するツール「不満バスターズ」の仕組みと実装について解説しました。このツールを活用することで、ネガティブな声をポジティブなアイデアに変換し、社会に貢献することを目指しています。