【Grok 4活用術】X(Twitter)から必要な情報だけを自動収集・整形して報告するプロンプトを作ってみた

完了
開始日
2025年8月18日
終了日
2025年8月18日
期間
1日間
担当者
最終更新日
2025年8月18日
タグ
ai , grok

生成AIツール「Grok 4」を使って、X(旧Twitter)で特定のアカウントや投稿内容から条件に合致する情報を自動で抽出・整理して報告する仕組みを作ってみました。

なぜXの自動監視が必要なの?

Xでは毎日膨大な数の投稿が行われています。特定の業界ニュース、顧客の声、競合の動きなど、有益な情報をリアルタイムでキャッチすることがビジネス上の強みになります。

しかし、手動でチェックするのは非効率。そこで今回は、Grok 4の能力を活用して次のような自動化を実現しました。


💡 この記事でわかること

  • Grok 4を使ったX(Twitter)投稿の自動収集プロンプト例
  • 指定アカウントやキーワードベースでの情報抽出方法
  • 投稿を整形してレポート形式で出力する方法
  • 定期実行の仕組み(タスク設定)

Grok 4とは?

Grokは、xAI(Elon Muskが設立したAI企業)が開発した高度な生成AIで、自然言語による命令に非常に高い理解力を持っています。Grok 4はその最新バージョンで、情報の要約、整形、分類などのタスク処理が得意です。


作成したプロンプトの概要

  • Yahooニュースなどの複数アカウントの投稿を整理する。
  • SNS投稿の内容に記載がある複数キーワードを元に整理する。

このプロンプトをGrokに投げることで、毎日定期的に情報を収集→整理→レポート化することができます。


🛠 具体的なプロンプト例(複数アカウント指定)

あなたはX(旧Twitter)の公開データにアクセスできるGrokです。以下を厳守して、毎回の実行時点で最新の結果を日本語で出力してください。

########################
# 実行・時刻の厳格化(STRICT CLOCK)
########################
# - 実行時の"現在時刻"はシステム時刻から取得すること。推測や事前計算は禁止。
# - タイムゾーンは常に Asia/Tokyo(JST)。Olson ID "Asia/Tokyo" を使用。
# - now_jst = now_utc を JST へ変換した値。
# - today_start_jst = now_jst の日付 00:00:00
# - today_end_jst   = now_jst の日付 23:59:59
# - 見出しと JSON の run_datetime_jst は now_jst を ISO 拡張形式で出力(YYYY-MM-DDTHH:mm:ss)。

########################
# 収集範囲・ランキングの基準
########################
# - 「今日の投稿」: created_at(JST換算)が [today_start_jst, today_end_jst] に入るもののみ。
# - 「直近N日トップK」: window の終端は下記設定による。
TOP_INCLUDE_TODAY = true   # true: 終端は now_jst、false: 昨日 23:59:59 JST
# - window_start_jst = (TOP_WINDOW_DAYS-1)日前の 00:00:00
# - window_end_jst   = (TOP_INCLUDE_TODAY ? now_jst : 昨日 23:59:59)
# - ランキングは views 降順、同点は新しい順。views 不明時は fallback_score = likes*2 + reposts*3 + replies*1 を用いる。

########################
# 実在検証(VERIFIED ONLY)
########################
# - 候補取得後、各投稿は必ず「検証」してから出力。検証できないものは出力禁止。
# - 検証要件(いずれか満たせばOK。両方あれば better):
#   (A) API/検索で post_id(数値ID)と created_at を取得し、本文とURLの突合で一致。
#   (B) 正規URL https://x.com/{handle}/status/{post_id} を解決し、アクセス可能(鍵/削除/凍結/年齢制限でない)であること。
# - 取得不能・不一致・404・非公開等は除外し、notes に理由・件数を記載。
# - 生成・推測・要約のみで実在が確定できないものは出力不可(NO HALLUCINATION)。
# - 出力する各アイテムに post_id と verification_method("api"|"url"|"both")を必ず付与。

########################
# 取得ポリシー
########################
DEFAULT_INCLUDE_QUOTES    = true    # 引用は含む
DEFAULT_EXCLUDE_RETWEETS  = true    # RT/リポストは除外
DEFAULT_INCLUDE_REPLIES   = false   # リプライ含有(バンドルで個別上書き可)
TRANSLATE = {                      # 翻訳ポリシー(バンドルで個別上書き可)
  "translate_non_target": false,   # 非日本語のみ翻訳
  "target_lang": "ja",
  "show_original_text": false
}

########################
# バンドル設定(ここだけ編集してください)
########################
# - 各バンドル = 1ユーザー。期間/リプライ/翻訳を個別に設定可能。
BUNDLES = [
  {
    "name": "Yahooニュース",
    "user": { "handle": "@YahooNewsTopics" },
    "top_window_days": 30,
    "include_replies": true,
    "translate": {
      "translate_non_target": false,
      "target_lang": "ja",
      "show_original_text": false
    }
  },
  {
    "name": "日経電子版ビジネス",
    "user": { "handle": "@nikkei_business" },
    "top_window_days": 14,
    "include_replies": false,
    "translate": {
      "translate_non_target": false,
      "target_lang": "ja",
      "show_original_text": true
    }
  },
  {
    "name": "GIGAZINE(ギガジン)",
    "user": { "handle": "@gigazine" },
    "top_window_days": 2,
    "include_replies": false,
    "translate": {
      "translate_non_target": false,
      "target_lang": "ja",
      "show_original_text": true
    }
  }
]

########################
# 出力仕様(本文)
########################
# 1) ヘッダー: 実行日時(now_jst, "YYYY-MM-DD HH:mm JST")
# 2) バンドルごとに以下を出力(BUNDLES 順):
#    ◆{bundle.name}(対象: {handle})
#    — 今日の投稿(JST)
#      * 新→古。各件に下記を記載:
#        - 投稿日時(JST, YYYY-MM-DD HH:mm)
#        - 本文(先頭120文字+「…」/ 改行削除)
#        - 投稿URL(正規URL形式)
#        - post_id
#        - メトリクス: 表示数, いいね, リポスト, 返信, ブックマーク(取得できる範囲)
#        - 翻訳: 設定が有効かつ原文言語が target_lang 以外なら [訳] を先、必要なら [原文/<ISO>] を後
#      * 件数合計 + 所感(100字以内)
#      * 該当なし時は「本日の投稿はありません」
#    — 直近{top_window_days}日の閲覧数トップ5
#      * #1→#5。上記と同様の項目を記載 + fallback_used(true|false)
#      * 件数合計 + 所感(100字以内)
# 3) 最後に全体 notes(検証で除外した件数・理由など)を列挙。

########################
# 出力仕様(JSON)
########################
{
  "run_datetime_jst": "YYYY-MM-DDTHH:mm:ss",
  "bundles": [
    {
      "name": "バンドル名",
      "user": { "handle": "@example", "display_name": "取得できれば" },
      "settings": {
        "top_window_days": number,
        "include_replies": boolean,
        "include_quotes": true,
        "exclude_retweets": true,
        "top_include_today": TOP_INCLUDE_TODAY,
        "translate": {
          "translate_non_target": boolean,
          "target_lang": "ja",
          "show_original_text": boolean
        }
      },
      "today_posts": [
        {
          "datetime_jst": "YYYY-MM-DDTHH:mm",
          "url": "https://x.com/{handle}/status/{post_id}",
          "post_id": "numeric-id-as-string",
          "verification_method": "api" | "url" | "both",
          "lang_original": "ja|en|...",
          "text_head": "先頭120文字…",
          "text_translated_head": "(翻訳があれば)先頭120文字…",
          "metrics": {
            "views": number | null,
            "likes": number | null,
            "reposts": number | null,
            "replies": number | null,
            "bookmarks": number | null
          }
        }
      ],
      "top_views": [
        {
          "rank": 1,
          "date_jst": "YYYY-MM-DD",
          "url": "https://x.com/{handle}/status/{post_id}",
          "post_id": "numeric-id-as-string",
          "verification_method": "api" | "url" | "both",
          "lang_original": "ja|en|...",
          "text_head": "先頭120文字…",
          "text_translated_head": "(翻訳があれば)先頭120文字…",
          "metrics": {
            "views": number | null,
            "likes": number | null,
            "reposts": number | null,
            "replies": number | null,
            "bookmarks": number | null
          },
          "fallback_used": true | false
        }
      ],
      "counts": { "today_posts": number, "top_views": number },
      "notes": [ "検証で除外X件(404/非公開/不一致)" ]
    }
  ],
  "global_notes": [ "API/アクセス制限により除外Y件" ]
}

########################
# 実行時の厳守事項(再掲)
########################
# - 時刻は必ず now_jst ベース。ヘッダー/JSONのrun_datetime_jstも now_jst を出力。
# - 今日の範囲・ランキング範囲ともに JST へ正規化してからフィルタ。
# - 実在検証を満たさない投稿は出力禁止。推測・生成・未検証の投稿はゼロ件として扱う。
# - メトリクスが取得不能でも項目は保持し値は null。views 無し時のみ fallback スコアで順位付けし fallback_used=true。
# - 文字列は改行除去、絵文字は保持可、数値はカンマ無し。

🛠 具体的なプロンプト例(複数キーワード指定)

あなたはX(旧Twitter)の公開データにアクセスできるGrokです。以下を厳守し、毎回の実行時点で最新の結果を日本語で出力してください。

========================
STRICT CLOCK(時刻の厳格化)
========================
- 現在時刻は実行時のシステム時刻から取得(推測・固定値の使用禁止)。
- タイムゾーンは常に Asia/Tokyo(JST)。UTC→JSTに変換して用いる。
- ヘッダーとJSONの run_datetime_jst は上記JST時刻を ISO 拡張(YYYY-MM-DDTHH:mm:ss)で出力。
- すべての並び替え・期間判定はJSTへ正規化後に実施。

========================
収集対象・件数・並び(定数)
========================
- MAX_PER_THEME = 5
- INCLUDE_REPLIES = false        (trueでリプライも対象)
- INCLUDE_QUOTES  = true          (引用ポストを対象)
- EXCLUDE_RETWEETS = true         (RT/リポストは除外)
- USE_WINDOW = false              (trueで時間窓を使う)
- WINDOW_DAYS = 7                 (USE_WINDOW=trueのときの直近日数)
- TRANSLATE_TARGET_LANG = "ja"
- TRANSLATE_NON_TARGET = true     (原文がja以外なら翻訳)
- SHOW_ORIGINAL_TEXT = true       (原文併記)
- QUERY_EXPANSION_LANGS = ["en"]  (必要に応じ "es","ko","zh" 等を追加)
- REQUIRE_LITERAL_HIT = true      (本文/ハッシュタグに少なくとも1つのinclude語が文字列一致)

========================
テーマ定義(編集)
========================
THEMES = [
  {
    name: "生成AIトレンド",
    include: ["生成AI","GenAI","\"generative AI\"","#生成AI","ChatGPT","GPT","Gemini","Claude","Grok"],
    exclude: ["求人","採用","広告"]
  },
  {
    name: "PMO",
    include: ["PMO","プロジェクトマネジメント","Project Management Office","#PMO"],
    exclude: []
  },
  {
    name: "SEOアルゴリズム",
    include: ["検索アルゴリズム","MUVERA","\"search algorithm\"","#SEO"],
    exclude: ["ツール販売","スパム"]
  }
]

========================
収集・フィルタ規則
========================
1) 候補収集:
   - 公開ポストのみ(鍵/削除/年齢制限等は除外)。
   - EXCLUDE_RETWEETS=trueならRT除外。INCLUDE_QUOTES/INCLUDE_REPLIESに従う。
   - USE_WINDOW=true の場合、created_at(JST) が [now_jst - (WINDOW_DAYS-1)日 00:00:00, now_jst] のみ。
2) マッチ判定(厳格):
   - include のいずれかに一致 かつ exclude のいずれにも一致しない。
   - 大小文字は無視可。REQUIRE_LITERAL_HIT=true のとき、本文/ハッシュタグで原語または展開語の部分一致を最低1つ必須。
   - include語は QUERY_EXPANSION_LANGS に翻訳・同義展開して多言語検索(例:ja→en)。
3) 実在検証(VERIFIED ONLY):
   - 出力前に必ず検証。以下のいずれかを満たすものだけ出力(両方満たせば better)。
     A) API/検索で post_id(数値)と created_at を取得し、著者・URL・本文要約と突合一致。
     B) 正規URL https://x.com/{ハンドル(@なし)}/status/{post_id} を解決でき、アクセス可能。
   - 404/非公開/不一致/取得不能は除外。除外件数と理由を notes に記録。
   - 各アイテムに post_id と verification_method("api" または "url" または "both")を必須付与。
4) 整形:
   - JSTの created_at の新しい順に並べ、各テーマ MAX_PER_THEME 件まで。
   - メトリクス(views/likes/reposts/replies/bookmarks)は取得できた範囲で付与(不明は null)。
   - TRANSLATE_NON_TARGET が true かつ原文言語が "ja" 以外なら翻訳。
   - SHOW_ORIGINAL_TEXT が true のときは、訳文の下に [原文/<ISO言語コード>] を1行で併記(改行削除)。

========================
出力フォーマット(本文)
========================
1) ヘッダー:"実行日時: YYYY-MM-DD HH:mm JST"
2) テーマ毎:
   - 見出し:「◆{テーマ名}(最大5件)」+ 抽出ポリシーの簡記(リプライ/引用/RT)
   - 各項目(新→古):
     * 投稿日:"JST, YYYY-MM-DD HH:mm"
     * 投稿者:@handle(表示名)
     * [訳]訳文120字要約(…で省略、改行削除)
     * [原文/<lang>]原文120字要約(SHOW_ORIGINAL_TEXT=true のとき)
     * URL:"正規URL"
     * post_id, verification_method("api"|"url"|"both")
     * メトリクス:views/likes/reposts/replies/bookmarks(取得できたもののみ)
   - 末尾:件数合計 + 所感(50〜100字)
   - 該当0件でも「該当なし」と明記(ダミー生成禁止)
3) 末尾:全体 notes(検証で除外した件数・理由、API/レート制限など)

========================
出力フォーマット(JSON:例:有効なJSON)
========================
以下は形式サンプル(有効なJSON)。値は実際の取得結果に置き換えて出力すること。
{
  "run_datetime_jst": "2025-08-14T09:00:00",
  "settings": {
    "max_per_theme": 5,
    "include_replies": false,
    "include_quotes": true,
    "exclude_retweets": true,
    "use_window": false,
    "window_days": 7,
    "translate_target_lang": "ja",
    "translate_non_target": true,
    "show_original_text": true,
    "query_expansion_langs": ["en"],
    "require_literal_hit": true
  },
  "themes": [
    {
      "name": "生成AIトレンド",
      "query_used": {
        "include": ["生成AI","GenAI","generative AI","#生成AI","ChatGPT","GPT","Gemini","Claude","Grok"],
        "exclude": ["求人","採用","広告"],
        "expanded_langs": ["en"]
      },
      "items": [
        {
          "datetime_jst": "2025-08-14T08:43",
          "author": { "handle": "@example", "display_name": "Example User" },
          "url": "https://x.com/example/status/1234567890123456789",
          "post_id": "1234567890123456789",
          "verification_method": "both",
          "lang_original": "en",
          "text_original_head": "Original text head…",
          "text_translated_head": "日本語訳の先頭120文字…",
          "metrics": {
            "views": 12345,
            "likes": 67,
            "reposts": 8,
            "replies": 2,
            "bookmarks": null
          }
        }
      ],
      "count": 1,
      "dropped_count": 0,
      "drop_reasons_sample": []
    }
  ],
  "cross_theme_duplicates": [],
  "notes": ["404や非公開のため除外0件"]
}

🧪 活用例

以下のような業務に活用できます:

  • 競合調査:競合他社のSNS発信を自動収集
  • ニュース収集:AIやテクノロジー関連の話題をキュレーション
  • ブランディング監視:自社に言及されたポストを可視化
  • トレンド分析:特定のキーワードが使われた頻度や投稿内容の傾向を把握

🔁 定期実行のアイデア

現在、Grokにタスク機能が実装されていたんで、以下の方法で定期実行が可能です:

  1. タスク機能で新規追加をクリック
  2. 任意の内容を設定(頻度、時刻)と説明を記載して登録
  3. 「上級者(2025/8/18時点)」をクリック

✍️ まとめ

Grok 4は、ただのチャットAIではなく高度な情報収集・整形ツールとしても使えます。特にX(旧Twitter)のようなリアルタイム性の高いSNSの監視や分析に強力な力を発揮します。

Grokを使いこなせば、情報収集にかかる時間と手間を大幅にカットし、必要な情報だけを効率よく得ることが可能になります。