はじめに
2026年10月、昨今のサイバー空間に関して物騒なニュースが注目を浴びるようになりました。
SNSをほぼ活用していないため話題のトピックスを把握しづらく、自分にだけこっそり教えてくれるBot的なものが欲しくて作りました。
今回はChatGPT Plusの無料オファー期間中でしたのでこれを活用して実装してみました。
作ったもの・出来たもの
日次で以下の情報を収集し、国内/国外かを表記させつつ Discord で連絡してくれます。
・SNSで話題だったセキュリティの話
・セキュリティ機関などから公表されたセキュリティ情報
■投稿フォーマット
以下の通知をしてもらっています。
- 対象年月日 | その日のホットトピックス
- 1投稿目
- 対象期間
- 目次
- 概況(その日のトピック全体を通した考察)
- トークン消費量と費用概算
- 2投稿目以降
- タイトル
- 概要
- 影響範囲
- 手法・脆弱性情報
- 注目された根拠
- 情報源
1週間動かしてみて思ったこと
ネットを見ているとつい目に入ってくる情報に振り回される事があり、自分の欲しい粒度で情報を入手し続けられることに感動しました。地道に調査して記事にしてくれる方のお陰です。
また、今回 ChatGPT Plus の力を借りましたが、ほぼ会話しているだけで実装が終わりましたし、トータル1日かからない程度で今回の仕組みを作り、Discord上の細かいレイアウトも整えてくれて何でもこなしてくれました。有料プランにする人の気持ちが分かりました。
1日5円と書いていますが、概ね5円から10円の範囲内で動作してるように見えます。実際には平均7円/日ぐらいに落ち着きそうです。より安いAIプラットフォームも検討しましたが、AIに検索させるのに費用がかかってしまうため継続利用する場合は Google AI Studio で良いかなと思っています。
システム構成
- Google Apps Script
- Google AI Studio
- Gemini 3.8 Flash
- Discord フォーラム
- GhatGPT Plus (おそらくGPT-6) ※相談役
構成の選定理由
| # | システム | 費用 | 選定理由 |
|---|---|---|---|
| 1 | GhatGPT Plus | 有料 | 無料オファー中だったため。また、最近(2026/10) ChatGPT の評判が良いため。 |
| 2 | Google Apps Script | 無料 | Google AI Studio や Gemini との相性が良いと思っていた。実際には過分に相性が良い訳ではなかったが、クラウド上で定期的にスクリプトを起動する分としては良い選定だった。 |
| 3 | Google AI Studio | 有料(前払い) | 誤って課金した残額を使うため。 |
| 4 | Gemini 3.8 Flash | AI Studio内 | Google AI Studio の中でコスパが良かったため。 |
| 5 | Discord | 無料 | 普段見ているチャットツールで、ボットは作りやすいと考えていたため。 |
それぞれの製品に感じた点
- ChatGPT Plus
- 製品名とやりたい事を伝えると大体対処法やコードを出してくれる
- 5時間ごとの利用量を人力で使い切る事など不可能
- 本記事のシステム構成図のような図化もチャットでの微修正が可能
- 夜23時ごろに急にレスポンスの悪くなるタイミングがあった(たまたま?)
- ⇨ この子の言うがままに操作しました
- Google Apps Script
- 個人ではトリガーによる実行時間は1日90分しかないが個人利用なら十分
- GhatGPT Plus が GAS で動作するコードを書くのでストレスなく利用できる
- 環境変数が設定でき、API情報などをハードコードしなくて済む
- Discord Webhook は 429 エラーになりがち(皆使っているからなのか)
- ⇨ クラウド上で(プログラマブルな)細かい制御をするなら GAS が楽でいい
- Google AI Studio + Gemini 3.8 Flash
- 少額の課金から使えるのでお試しに便利であり、前払い制にすることで過剰請求のリスクを抑えられる
- 初めてでも無料枠(Free Tier)として API キーが発行できるので、まず動作するか検証しやすい
- Gemini による Google Search は 5000クエリ/月 まで無料 ※Tier1プラン以上
- 出力フォーマット(responseFormat) を定義できるのはありがたい
- プロジェクトやAPIキーを細かく発行、分離できるので管理しやすい
- 利用状況がグラフで可視化されてるので使用量を見るのが楽しい
- ⇨ 初めて課金AIを触るなら Google AI Studio は安心して使える
- Discord
- API / Webhook など、普段触らない部分も無料で使える(おかしい)
- 「フォーラム」機能は初めて知りましたが、Webhook でスレッドの作成とそのスレッド配下に投稿できるのは極めて便利
注意点
以下、少し躓いた点です。
- GAS から直接 Google 検索はできず、Gemini の応答内容を再検索させようとしたが諦めました
- Google AI Studio の無料枠(Free Tier) では API 経由で Google Search (グラウンディング) が使えない
- Gemini が Google Search (グラウンディング) で取得した URL を、リダイレクト先の URL として出力させると末尾が欠損する場合があった。そのため、リダイレクト前の URL をそのまま出力させ、GASでリダイレクト先を取得した
- Gemini 3.8 Flash に responseFormat を指定しても出力時には
[{...}]のように最上位を配列で囲って返す場合がある - プロンプトでの制約が悪い方向に働く場合がある
- 例えば以下の条件が組み合わさり、トピックの採用数を減少させた可能性があった
- 一次情報(URL)を確認できない場合はトピックに採用しない
- 出力時にはリダイレクトを解消する
- Geminiは不完全なURL(末尾欠如)を出力する場合がある
- 例えば以下の条件が組み合わさり、トピックの採用数を減少させた可能性があった
- Discord の Webhook でエラーになった場合の対処方を決めておくといい(遅延再投稿、Logger.logにシリアライズ退避など)
今後の課題
- RSS の活用による費用・品質への影響を検証する
- セキュリティトピックス以外にも使えそう
- 日刊を総括し、月刊として出力する。かつ、日刊時と評価が大きく変動したトピックを取り出す
以下おまけです。
ボツ案
実装中にこのあたりを検討しましたが採用しませんでした。
- Discord のチャネルへの Webhook投稿:横に長くなりすぎてしまい、読みづらかったため
- Discord APIの利用:(細かく調査していませんが恐らく)Cloudflare に弾かれた
- Gemini スケジュール実行:トピックス数が非常に少なく連日同様の情報を出力したため
Appendix
実装に利用しているプロンプト等を置いておきます。
プロンプト
${targetdate} は yyyy/mm/dd 形式で事前に変数定義してます。
対象日:${targetdate}(日本時間00:00~23:59)
国内外の重要なサイバーセキュリティニュースを調査し報告してください。
【1. 調査対象】
・国内・国外それぞれについて、「SNS上の注目情報」と、「政府機関・CSIRT・セキュリティ企業・研究機関・専門メディアによる報告」を別々の観点から調査してください。
・脆弱性、攻撃活動、情報漏えい、マルウェア、サプライチェーン攻撃、政策・制度、法執行活動など、複数の分野について検索し、特定分野に偏らないようにしてください。
【2. 採用・重大度判定】
・1記事につき1つの出来事を扱い、直接関連する情報のみ統合してください。独立した事件や脆弱性は分けてください。
・確認できた重要なニュースは漏れなく採用し、件数を恣意的に制限しないでください。ただし、件数を増やすために重要性の低い情報を追加しないでください。
・重大度は被害、悪用状況、影響範囲、対応の緊急性から判定してください。
緊急:広範な被害や現実の悪用が確認され、迅速な対応が必要
高:重大な被害や脆弱性が確認され、優先的な対応が必要
中:重要だが緊急性や影響が限定的
低:参考情報、研究成果、制度変更など、直ちに対応を要しない
・SNSの話題性だけで重大度を引き上げないでください。
【3. 情報の検証】
・検索結果の見出しや抜粋だけで断定せず、信頼できる情報源を照合して事実を確認してください。
・出来事の存在と主要な事実を確認できれば採用候補としてください。個別の技術情報や被害規模が不明でも、それだけを理由に記事を除外しないでください。
・CVE番号、CVSSスコア、影響バージョン、攻撃成立条件、PoCの公開状況、被害件数、攻撃者の特定などは、可能な限り公式情報や一次情報と照合してください。確認できない情報は推測せず、「不明」「未公表」などとしてください。
・対象日に公開された情報、または対象日に重要な新事実が公表された情報を採用してください。事件の発生日と情報の公開日を区別し、実質的な新情報を伴わない再報道や日付更新は除外してください。海外の情報については時差も考慮してください。
・SNSでの注目は、実際の投稿や反応を確認できた場合のみ記載してください。話題性を推測で補わないでください。
・出典は一次情報を優先し、Google Search Groundingで取得したURL(vertexaisearchのリダイレクトURLを含む)を加工せず、そのまま出力してください。
・URLの不備だけを理由にトピックを除外せず、情報の正確性と重要ニュースの網羅性を優先してください。
【4. 出力内容】
・date:${targetdate}をそのまま使用してください。
・hot_topic:articlesから最も注目度の高いニュースを1件選び、その内容が具体的に伝わる見出しを20文字以内で記述してください。複数のニュースを組み合わせないでください。
・articles:重大度の高い順に並べ、件数に固定の上限・下限は設けません。
・title:出来事の核心を50文字以内。記事番号、重大度、地域区分は含めないでください。
・summary:出来事の要点と対象日の新情報を200文字程度以下で説明。内容の切り替わりで必要に応じて1回改行し、空白行は入れないでください。
・impact:影響を受ける製品、組織、利用者など。100文字程度以下。
・technical:確認された重要な技術情報。100文字程度以下。該当しない場合は「該当なし」、未公表の場合は「未公表」。
・attention:公式注意喚起、専門機関の報告、専門媒体の報道、確認できたSNS反応など、注目された根拠。100文字程度以下。
・sources:記事内容を直接裏付けるURLを1件以上記載してください。
・daily_comment:採用した記事を横断し、共通点や相違点、注目すべき変化から、その日の全体的な傾向や特徴を150文字程度で説明してください。個別記事の列挙や要約の繰り返し、根拠のない推測は避けてください。
正確性に必要な説明は文字数の目安より優先してください。
スキーマ
Google API から応答する際のフォーマットの定義
const reportSchema = {
type: "object",
properties: {
date: {
type: "string"
},
hot_topic: {
type: "string"
},
articles: {
type: "array",
items: {
type: "object",
properties: {
severity: {
type: "string",
enum: ["緊急", "高", "中", "低"]
},
region: {
type: "string",
enum: ["国内", "国外"]
},
title: { type: "string" },
summary: { type: "string" },
impact: { type: "string" },
technical: { type: "string" },
attention: { type: "string" },
sources: {
type: "array",
items: { type: "string" }
}
},
required: [
"severity", "region", "title", "summary",
"impact", "technical", "attention", "sources"
],
additionalProperties: false
}
},
daily_comment: {
type: "string"
}
},
required: ["date", "hot_topic", "articles", "daily_comment"],
additionalProperties: false
};
リクエスト payload
Google AI Studio に送信するデータ
const payload = {
contents: [{
parts: [{ text: promptText }]
}],
tools: [
{ google_search: {} }
],
generationConfig: {
temperature: 0.2,
thinkingConfig: {
thinkingLevel: "medium"
},
responseFormat: {
text: {
mimeType: "APPLICATION_JSON",
schema: reportSchema
}
}
}
};
