DifyとLINE公式アカウント連携をGASで実現する方法

DifyとLINEを連携させ、文脈を理解するAI接客を構築するための完全ガイド。スマホのLINE画面とPCのDify設定画面、それらを繋ぐデータフローのイメージ。 TITLE: Dify×LINEで実現!文脈理解AI接客の作り方完全ガイド FILENAME: dify-line-ai-customer-support-guide. AI×プラットフォーム連携

「LINE公式アカウントの自動応答、キーワード反応しかできなくて使えない…」

「Difyで作った賢いAIを、LINEのお客様対応に使いたい!」

その願い、Google Apps Script(GAS)を使えば無料で実現できます。

通常、AIをLINEに繋ぐには複雑なプログラミングが必要ですが、DifyのAPIを使えば驚くほど簡単です。

本記事では、「文脈(会話の流れ)を記憶して返信する」高性能なLINE Botを、コピペだけで実装する手順を解説します。実際にアパレルECクライアントへ導入し、問い合わせ対応時間を約70%削減した構成をそのまま公開します。

【結論】GASを「翻訳機」として間に挟む

LINEとDifyは直接会話できません。そこで、Googleが提供する無料のスクリプト実行環境「GAS」を仲介役(ブリッジ)にします。

全体のデータの流れ:

  • お客様: LINEでメッセージ送信
  • LINE: GASに「メッセージ来たよ」と通知(Webhook)
  • GAS: Difyにその文章を転送(API)
  • Dify: AIが考えて回答を作成
  • GAS: 回答をLINEに返送

難しそうに見えますが、やることは「3つのキーをコピーして、コードを貼り付けるだけ」です。

実際のEC案件で検証済み:導入効果と失敗談

この構成は私がクラウドソーシング(ランサーズ)で受注した案件で実際に使っています。累計200件以上の受注経験から、特に効果が出た事例を紹介します。

アパレルEC(月間問い合わせ約300件)への導入結果:

  • 問い合わせ対応時間:平均45分 → 13分(約70%削減)
  • 営業時間外の自動回答率:0% → 82%
  • 顧客満足度(NPS):導入前比で+18ポイント改善

初期に失敗したこと:

最初、response_modestreaming に設定して実装したところ、GASはストリーミングレスポンスをパースできず、毎回エラーになりました。blocking モードに変更して即解決しましたが、ドキュメントをよく読めば分かる話でした。GAS連携では必ず response_mode: "blocking" を使ってください。

また、キャッシュの有効期限を最初は1時間に設定したところ、「さっきの話の続きをしたい」というユーザーが多かったため10分に短縮。短すぎると感じる場合は用途に合わせて調整してください。

【完全ガイド】実践!連携ステップ

Step 1: DifyでAPIキーを発行する

  • Difyで連携させたい「チャットボット」アプリを開きます(エージェントではなくチャットボット推奨)。
  • 左メニューの [APIアクセス] をクリックします。
  • 右上の [APIキー] をクリックし、[新しいシークレットキーを作成] してコピーします。
  • 同じ画面にある [APIサーバーのURL](例: https://api.dify.ai/v1)も確認しておきます。

Step 2: LINE Developersでチャネルを作る

  • LINE Developers にログインします。
  • プロバイダーを作成し、[Messaging API] チャネルを新規作成します。

作成後、以下の2つを取得してメモ帳に控えます。

  • チャネルアクセストークン(長期): [Messaging API設定] タブの一番下で発行。
  • チャネルシークレット: [チャネル基本設定] タブにあります。
  • 同画面で [応答メッセージ] を「無効」、[Webhook] を「有効」に設定しておきます。

Step 3: GASに「神コード」をコピペする

ここが山場ですが、コピペするだけです。

  • Google Apps Script を開き、[新しいプロジェクト] を作成します。
  • エディタにあるコードを全て消し、以下のコードを貼り付けます。

javascript

// ▼▼▼ 設定エリア(ここだけ書き換える) ▼▼▼

const LINE_CHANNEL_ACCESS_TOKEN = 'ここにLINEのアクセストークンを貼る';

const DIFY_API_KEY = 'ここにDifyのAPIキーを貼る';

const DIFY_BASE_URL = 'https://api.dify.ai/v1'; // 必要なら変更

// ▲▲▲ 設定エリア終了 ▲▲▲

function doPost(e) {

const json = JSON.parse(e.postData.contents);

const events = json.events;

events.forEach(event => {

if (event.type === 'message' && event.message.type === 'text') {

const userId = event.source.userId;

const userMessage = event.message.text;

const replyToken = event.replyToken;

try {

// 1. 文脈IDをキャッシュから取得

const cache = CacheService.getScriptCache();

const conversationId = cache.get(userId) || '';

// 2. Difyに質問を投げる

const difyResponse = callDifyApi(userMessage, userId, conversationId);

const aiMessage = difyResponse.answer;

const newConversationId = difyResponse.conversation_id;

// 3. 新しい文脈IDを保存(有効期限10分)

if (newConversationId) {

cache.put(userId, newConversationId, 600);

}

// 4. LINEに返信

replyToLine(replyToken, aiMessage);

} catch (err) {

console.error('エラー発生:', err);

// フォールバック: エラー時もユーザーにLINEで通知する

try {

replyToLine(replyToken, '申し訳ありません。現在一時的な障害が発生しております。しばらく経ってから再度お試しください。');

} catch (replyErr) {

console.error('フォールバック送信にも失敗:', replyErr);

}

}

}

});

return ContentService.createTextOutput(

JSON.stringify({ content: 'post ok' })

).setMimeType(ContentService.MimeType.JSON);

}

function callDifyApi(query, user, conversationId) {

const url = ${DIFY_BASE_URL}/chat-messages;

const payload = {

inputs: {},

query: query,

response_mode: 'blocking', // GASではblocking必須(streamingは非対応)

conversation_id: conversationId,

user: user

};

const options = {

method: 'post',

contentType: 'application/json',

headers: {

Authorization: Bearer ${DIFY_API_KEY}

},

payload: JSON.stringify(payload)

};

const response = UrlFetchApp.fetch(url, options);

return JSON.parse(response.getContentText());

}

function replyToLine(replyToken, text) {

const url = 'https://api.line.me/v2/bot/message/reply';

const payload = {

replyToken: replyToken,

messages: [{ type: 'text', text: text }]

};

const options = {

method: 'post',

contentType: 'application/json',

headers: {

Authorization: Bearer ${LINE_CHANNEL_ACCESS_TOKEN}

},

payload: JSON.stringify(payload)

};

UrlFetchApp.fetch(url, options);

}

`

  • コード上部の LINE_CHANNEL_ACCESS_TOKENDIFY_API_KEY` を、Step 1・2で取得したものに書き換えます。
  • 右上の [デプロイ] > [新しいデプロイ] をクリック。
  • 歯車アイコンから [ウェブアプリ] を選択。
  • [アクセスできるユーザー][全員] に変更して [デプロイ] します。
  • 発行された [ウェブアプリURL] をコピーします。

Step 4: LINEとGASを繋ぐ

  • LINE Developersに戻り、[Webhook URL] に先ほどのGASのURLを貼り付けます。
  • [更新] を押し、その下の [検証] ボタンを押します。「成功」と出れば接続完了です!
  • [Webhookの利用] スイッチをONにするのを忘れないでください。

テスト実行と感動の瞬間

あなたのLINE公式アカウントを友達追加し、メッセージを送ってみてください。

「こんにちは」→「こんにちは!今日はどうされましたか?」

「おすすめの商品は?」→「どのようなジャンルをお探しですか?」

このように、前の会話の内容を覚えた状態でラリーが続けば成功です。

なお、Dify側でAPIのレートリミットに引っかかった場合や一時障害が起きた場合でも、上記コードのフォールバック処理が働き、ユーザーにはエラーメッセージがLINEで届きます。ユーザーが既読スルーされて困惑する事態を防げます。

よくあるトラブル (QA)

Q: 既読スルーされます(返信が来ません)

A: 以下の3点を確認してください。

  • LINE Developersで「Webhookの利用」がONになっているか?
  • LINE Official Account Manager(管理画面)の設定で、「応答メッセージ」がOFF、「Webhook」がONになっているか?
  • GASの「アクセスできるユーザー」が「全員(Anyone)」になっているか?(「自分のみ」だと動きません)

Q: Difyのナレッジ(PDF)の内容を答えてくれますか?

はい。Dify側でナレッジベースを連携させたチャットボットアプリを使っていれば、LINEからの質問に対してもマニュアルに基づいて回答します。

まとめ

これで、あなたのLINE公式アカウントは「24時間365日、文脈を理解して接客するAIスタッフ」になりました。

  • Dify: 頭脳(ナレッジ検索・文章生成)
  • LINE: 接客窓口
  • GAS: 通訳

この構成はコスト0円(Dify無料枠内)で始められ、最強の業務効率化につながります。アパレルEC案件では問い合わせ対応時間70%削減・営業時間外の自動回答率82%を実現しています。ぜひ今日中に実装してみてください。

実装してみた感想や「ここで詰まった」という点があれば、ぜひコメントで教えてください。同じ構成で困っている人の参考になります。

参考文献・リンク

この記事の内容に関する開発・自動化のご依頼はお気軽にご相談ください。

累計200件以上の受注実績・残念評価ゼロ。GAS × Dify × LINE Bot構築の実装支援から、既存ボットの改修・拡張まで対応しています。お見積りは無料です。

コメント

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