【Dify×GAS】競合サイトを自動監視!AIが価格変動をLINE通知するスナイパーの作り方

DifyとLINE Messaging APIを連携させ、競合他社の価格変動を24時間監視する「ライバル監視AI」の完成を祝うブログ第100話のアイキャッチ画像。笑顔のベテラン技術者(Yasu)の背後で、数々のエラー(ERROR 400、JSON崩壊、正規表現の罠)を突破し、ターゲットの価格を捉えたレーダーとLINEへの通知成功(MISSION COMPLETE)が描かれた近未来的なサイバー空間のイメージ図。 Uncategorized

導入:ライバルの値下げを「完全自動」で検知・迎撃せよ!

現場仕事お疲れ様です! 横浜で清掃業を営む、49歳・IT未経験の個人事業主、Yasuです。

前回はブログのアイキャッチ画像プロンプト全自動作成ツールを作りましたね。

個人事業主にとって、近隣のライバル業者の料金設定は常に気になりますよね。「あれ、いつの間にかエアコン清掃を値下げしてる!」と後から気づいて焦った経験、ありませんか?毎日ライバルのホームページをチェックするのは時間の無駄です。

そこで今回は、GASとDifyを連携させて「毎日自動でライバルのサイトを監視し、料金が変わった瞬間に検知。Dify(AI戦略家)が対抗キャンペーンのアイデアを考え、即座に自分のLINEに通知してくるスナイパーアプリ」を作りました!

今回は「スクレイピング(Webサイトの情報抽出)」や「API連携」という高度な技術を使うため、私自身も数々の絶望的なエラー(正規表現の罠、400エラーなど)に直面しました。しかし安心してください!この記事では、私が踏み抜いたすべての地雷の「回避方法」を中学生でもわかるレベルで完全解説します。同世代の皆さん、気合を入れて一緒に挑戦しましょう!

結論:GASが24時間監視し、Difyが作戦をLINEに届ける

今回のスナイパーアプリは、以下のシンプルな「3段バケツリレー」で動きます。

  1. GAS(監視兵): 毎日夜中にライバルのホームページをパトロールし、「料金」の数字を読み取る。昨日と料金が変わっていたら、Difyのスイッチを押す。
  2. Dify(AI戦略家): GASから通報を受け取り、「ライバルが値下げしました!当店は『付加価値』で勝負するゲリラキャンペーンで対抗しましょう」という作戦を練る。
  3. LINE(伝令): AIが考えた作戦を、社長(あなた)のスマホに即座に通知する。

この仕組みさえ作ってしまえば、あなたは二度とライバルのサイトを巡回する必要はありません。

手順:自動監視スナイパーAIの作り方

STEP 1:LINEの「2つの鍵」を用意する

まずは、DifyからあなたのLINEにメッセージを送るための準備です。※昔使われていた「LINE Notify」は終了したため、現在は公式の「LINE Messaging API」を使います。

LINE Developers(開発者向けサイト)にログインし、自分専用の通知ボット(チャネル)を作成して、以下の2つの鍵をコピーしてメモしておいてください。

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で読みやすいように、絵文字を使い、箇条書きで簡潔にまとめてください。
DifyワークフローのLLMノード(gpt-4o)設定画面。AIに「地域密着型の清掃業を支える、超優秀なAIマーケティング戦略家」の役割を与え、競合他社の価格変更データ(旧価格:(x) old_price、新価格:(x) new_price)をもとに、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へプッシュ通知するための核心的なプロセス。
Difyで構築した「ライバル監視AI」のテスト実行(Test Run)結果画面。競合の価格変動データ入力から、LLM(gpt-4o)による戦略メッセージ生成、そしてHTTPリクエストによるLINE Messaging API経由でのプッシュ通知送信までがすべて正常に完了。右側のコンソールには、LINEサーバーから返されたメッセージ送信成功を示すJSON形式のレスポンスログ(sentMessages)が表示されている。

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スキルを圧倒的に伸ばしてくれます。

すんなり作れた事はまだほとんどないですが、一つ一つエラーのパターンを

経験してるので修正作業が速くなってきました。

次回もまだ未定ですが、アプリチャレンジしようと思います。

是非お楽しみに!

コメント

タイトルとURLをコピーしました