導入:ライバルの値下げを「完全自動」で検知・迎撃せよ!
現場仕事お疲れ様です! 横浜で清掃業を営む、49歳・IT未経験の個人事業主、Yasuです。
前回はブログのアイキャッチ画像プロンプト全自動作成ツールを作りましたね。
個人事業主にとって、近隣のライバル業者の料金設定は常に気になりますよね。「あれ、いつの間にかエアコン清掃を値下げしてる!」と後から気づいて焦った経験、ありませんか?毎日ライバルのホームページをチェックするのは時間の無駄です。
そこで今回は、GASとDifyを連携させて「毎日自動でライバルのサイトを監視し、料金が変わった瞬間に検知。Dify(AI戦略家)が対抗キャンペーンのアイデアを考え、即座に自分のLINEに通知してくるスナイパーアプリ」を作りました!
今回は「スクレイピング(Webサイトの情報抽出)」や「API連携」という高度な技術を使うため、私自身も数々の絶望的なエラー(正規表現の罠、400エラーなど)に直面しました。しかし安心してください!この記事では、私が踏み抜いたすべての地雷の「回避方法」を中学生でもわかるレベルで完全解説します。同世代の皆さん、気合を入れて一緒に挑戦しましょう!
結論:GASが24時間監視し、Difyが作戦をLINEに届ける
今回のスナイパーアプリは、以下のシンプルな「3段バケツリレー」で動きます。
- GAS(監視兵): 毎日夜中にライバルのホームページをパトロールし、「料金」の数字を読み取る。昨日と料金が変わっていたら、Difyのスイッチを押す。
- Dify(AI戦略家): GASから通報を受け取り、「ライバルが値下げしました!当店は『付加価値』で勝負するゲリラキャンペーンで対抗しましょう」という作戦を練る。
- LINE(伝令): AIが考えた作戦を、社長(あなた)のスマホに即座に通知する。
この仕組みさえ作ってしまえば、あなたは二度とライバルのサイトを巡回する必要はありません。
手順:自動監視スナイパーAIの作り方
STEP 1:LINEの「2つの鍵」を用意する
まずは、DifyからあなたのLINEにメッセージを送るための準備です。※昔使われていた「LINE Notify」は終了したため、現在は公式の「LINE Messaging API」を使います。
LINE Developers(開発者向けサイト)にログインし、自分専用の通知ボット(チャネル)を作成して、以下の2つの鍵をコピーしてメモしておいてください。
- ユーザーID(宛先の鍵):
Uから始まる文字列 - アクセストークン(許可証): 非常に長い英数字の暗号
- LINEの設定についてはこちらでより詳しく説明してます
STEP 2:Difyで「AI戦略家&伝令」を作る
Difyを開き、ワークフローを新規作成して以下の4つのブロックを繋ぎます。今回はエラー回避のための「プロの裏技」を使います!
① 開始ノード
GASから「昔の料金」と「今の料金」を受け取る箱(変数)を作ります。
- 変数1:
old_price(テキスト型) - 変数2:
new_price(テキスト型)
② LLMブロック(プロのマーケター)
開始ノードの右に「LLM」を繋ぎ、以下の指示書をコピペします。
あなたは地域密着型の清掃業を支える、超優秀なAIマーケティング戦略家です。
たった今、監視システムから「近隣の強力なライバル業者が料金を変更した」というアラートが入りました。
【ライバルの料金変化】
変更前:{{#開始.old_price#}} 円
変更後:{{#開始.new_price#}} 円
社長のLINE宛てに、以下の構成で緊急報告と「対抗キャンペーンのアイデア」を提案するメッセージを作成してください。
1. 【緊急アラート】:料金がどう変わったかを端的に報告。
2. 【顧客心理の分析】:この変更で、お客さんはどう動くか。
3. 【当店の対抗策】:単なる値下げ合戦にならない、清掃業ならではの付加価値で勝負するゲリラキャンペーンを1つ提案。
※LINEで読みやすいように、絵文字を使い、箇条書きで簡潔にまとめてください。

③ HTTPリクエスト(LINEへ送信)
- メソッド:
POST - URL:
https://api.line.me/v2/bot/message/push - ヘッダー:
Authorization:Bearer 【ここにSTEP1のアクセストークンを貼る】Content-Type:application/json
- ボディ: 種類を「テキスト」にして
{{#コード.json_body#}}を設定。
最後に終了ブロックを繋ぎ、右上の「公開」を押します。また、GASから遠隔起動させるために、左メニューの「APIアクセス」からDifyのAPIキー(app-から始まる文字列)を取得しておきましょう。
![Difyワークフローの「HTTPリクエスト」ノード設定画面。 LINE Messaging APIのエンドポイント(/v2/bot/message/push)に対し、POSTメソッドでAI生成メッセージを送信するための設定。 ヘッダーに「Authorization: Bearer [アクセストークン]」と「Content-Type: application/json」を指定し、ボディ部で送信先IDとLLMが生成したテキスト((x) text)をJSON形式で構成している。 第100話の「ライバル監視AI」において、自動収集・分析された結果をLINEへプッシュ通知するための核心的なプロセス。](https://ai-shoshinsha-49.com/wp-content/uploads/2026/04/dif100-2-1.png)

STEP 3:GASで「24時間監視スナイパー」を作る
Googleドライブから「Google Apps Script」を新規作成し、以下のコードをまるごとコピペします。中学生でも分かるように全行に日本語の解説を入れています!
▼ コピペ用:ライバル監視スナイパーのGASコード
// ライバルの料金ページを毎日パトロールするプログラムです
function monitorCompetitorPrice() {
// ① 監視したいライバルのホームページURLを入れます
const targetUrl = "[https://ライバルのURL.com/price](https://ライバルのURL.com/price)";
// ② 狙い撃ちする文字です。この文字の直後にある「数字」を引っこ抜きます
const searchKeyword = '1台の価格';
// ③ DifyのAPIキー(app-から始まるパスワード)を入れます
const difyApiKey = "app-ここにDifyのAPIキーを貼る";
const difyApiUrl = "[https://api.dify.ai/v1/workflows/run](https://api.dify.ai/v1/workflows/run)"; // 変更不要
// ライバルのサイトを見に行き、中身の文字(HTML)を全部コピーしてきます
const response = UrlFetchApp.fetch(targetUrl);
const html = response.getContentText();
// 【超重要】HTMLの邪魔なタグを無視して、数字だけを引っこ抜く魔法の呪文(正規表現)
const regex = new RegExp(searchKeyword + "[^0-9]*?([0-9,]+)");
const match = html.match(regex);
if (!match) {
console.log("エラー:料金が見つかりません。");
return;
}
// 見つかった「今の料金」を箱に入れます
const currentPrice = match[1];
// GASの「隠し金庫」から、昨日の料金を取り出します
const props = PropertiesService.getScriptProperties();
const lastPrice = props.getProperty("LAST_PRICE");
// 初回起動時は、比較できないので今の料金を金庫にしまって終わります
if (!lastPrice) {
props.setProperty("LAST_PRICE", currentPrice);
console.log("初回起動:現在の料金「" + currentPrice + "円」を監視対象に設定しました。");
return;
}
// 昨日の料金と今日の料金が「違う」場合の処理です!
if (currentPrice !== lastPrice) {
console.log("緊急事態!料金が " + lastPrice + "円 から " + currentPrice + "円 に変わっています!Difyを起動します。");
// Difyに渡すための手紙(JSON)を作ります
const payload = {
"inputs": {
"old_price": lastPrice,
"new_price": currentPrice
},
"response_mode": "blocking",
"user": "yasu-sniper"
};
const options = {
"method": "post",
"headers": {
"Authorization": "Bearer " + difyApiKey,
"Content-Type": "application/json"
},
"payload": JSON.stringify(payload)
};
// DifyのAPIを叩いて、遠隔起動のスイッチを押します!
UrlFetchApp.fetch(difyApiUrl, options);
// 次回比較のために「新しい料金」を金庫に上書き保存します
props.setProperty("LAST_PRICE", currentPrice);
} else {
console.log("異常なし。ライバルの料金は " + currentPrice + "円 のままです。");
}
}
設定を自分のものに書き換えたら「保存」し、時計マーク(トリガー)から「毎日 午前1時〜2時」に自動実行されるようにセットすれば完成です!
まとめ:エラーとの死闘こそが、最高の資産になる
同世代の皆さん、本当にお疲れ様でした!このアプリ、一発で動きましたか?
おそらく最初は、ライバルのサイトの裏側に隠れたHTMLタグのせいで数字が抜けなかったり(正規表現の罠)、AIの改行でAPIが弾かれたり(400エラー)と、絶望的な赤文字を何度も見たはずです。私もそうでした。
しかし、その「なぜ動かないんだ!」と頭を抱え、コードと睨み合う時間こそが、私たちのITスキルを圧倒的に伸ばしてくれます。
すんなり作れた事はまだほとんどないですが、一つ一つエラーのパターンを
経験してるので修正作業が速くなってきました。
次回もまだ未定ですが、アプリチャレンジしようと思います。
是非お楽しみに!


コメント