2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LINEミニアプリAdvent Calendar 2024

Day 13

24日目にLINEミニアプリが完成する初心者 ── Day13. 問い合わせ機能の実装

Last updated at Posted at 2024-12-12

はじめに

前回は「24 日目に LINE ミニアプリが完成する初心者 ── Day12. リッチメニューの作成」と題して、LINE 公式アカウントにリッチメニューを設置しました。


今回はリッチメニューから「問い合わせ」が選択された時に、問い合わせ種別の選択が行えるようにしていきたいと思います。

Flex Message の作成

はじめに問い合わせ種別の選択が行えるメッセージを作成します。

メッセージのレイアウトは LINE 側で用意している Flex Message Simulator を使ってカスタマイズを行うことができます。


私は以下のように作成しました。

image.png

今回button 要素の type は message を選択しています。

送信機能を実装

Flex Message の作成が完了したら送信機能の実装を行っていきます。

pages/api配下に新しくwebhook.tsを作成していきます。

今回はリッチメニューのお問い合わせを押した時に投稿される「>お問い合わせ」というメッセージに反応して、問い合わせ種別を問うメッセージを送っていきます。

src/nextjs/pages/api/webhook.ts
export default async function handler(req, res) {
  if (req.method === "POST") {
    const { events } = req.body;

    // LINE Webhookからのリクエストがない場合は終了
    if (!events || events.length === 0) {
      return res.status(200).json({ message: "No events" });
    }

    // メッセージイベントを処理
    const event = events[0]; // 最初のイベントを取得
    if (event.type === "message" && event.message.type === "text") {
      const userMessage = event.message.text;

      // ">お問い合わせ"の場合にFlex Messageを返信
      if (userMessage === ">お問い合わせ") {
        const flexMessage = {
          type: "flex",
          altText: "質問メニュー",
          contents: {
            type: "bubble",
            body: {
              type: "box",
              layout: "vertical",
              contents: [
                {
                  type: "box",
                  layout: "vertical",
                  contents: [
                    {
                      type: "text",
                      text: "ご質問内容を選択してください",
                      weight: "regular",
                      offsetStart: "xxl",
                      margin: "sm",
                      offsetTop: "md",
                    },
                    {
                      type: "separator",
                      margin: "xxl",
                      color: "#e5e5e5",
                    },
                  ],
                  backgroundColor: "#fafafa",
                },
                {
                  type: "box",
                  layout: "vertical",
                  contents: [
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "物件情報の問い合わせ",
                        text: "物件情報の問い合わせ",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "お家探しの情報収集のやり方",
                        text: "お家探しの情報収集のやり方",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "住宅購入資金の考え方・予算について",
                        text: "住宅購入資金の考え方・予算について",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "新築と中古どちらを買うべきか?",
                        text: "新築と中古どちらを買うべきか?",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "リノベーションの流れについて",
                        text: "リノベーションの流れについて",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "湘南エリアの魅力",
                        text: "湘南エリアの魅力",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "リノベ不動産辻堂羽鳥店について",
                        text: "リノベ不動産辻堂羽鳥店について",
                      },
                    },
                    {
                      type: "button",
                      action: {
                        type: "message",
                        label: "その他",
                        text: "その他",
                      },
                    },
                  ],
                  paddingTop: "md",
                  paddingBottom: "md",
                },
              ],
              paddingAll: "none",
            },
            styles: {
              footer: {
                separator: true,
              },
            },
          },
        };

        try {
          const url = "https://api.line.me/v2/bot/message/reply";

          const response = await fetch(url, {
            method: "POST",
            headers: {
              "Content-Type": "application/json",
              Authorization: `Bearer ${process.env.NEXT_PUBLIC_LINE_ACCESS_TOKEN}`,
            },
            body: JSON.stringify({
              replyToken: event.replyToken,
              messages: [flexMessage],
            }),
          });

          const result = await response.json();
          res.status(200).json(result);
        } catch (err) {
          res.status(500).json({ error: "Internal Server Error" });
        }
      }
    }

    // 他のイベントは無視
    return res.status(200).json({ message: "Event not processed" });
  } else {
    // POST以外のリクエストを拒否
    res.setHeader("Allow", ["POST"]);
    return res.status(405).json({ error: `Method ${req.method} Not Allowed` });
  }
}

デプロイ

送信機能の実装が完了したら、いつも通り以下のコマンドでデプロイを行います。

netlify deploy --build --prod

Webhook の設定

先ほどのメッセージを送信するには Webhook の設定が必要になります。

LINE Developers コンソールのトップ画面から Messaging API のチャネルを選択します。

image.png


タブから「Messaging API 設定」を開いていきます。

image.png


ここに Webhook 設定という項目があるので「編集」をクリックしましょう。

image.png


ここでデプロイした URL に`/api/webhook`を追加した URL を設定して「更新」を行います。

image.png

検証

更新ができたら正しく設定ができているか「検証」ボタンを押して確認を行いましょう。

image.png


正しく設定ができていると成功モーダルが表示されます。

image.png


最後に「Webhook の利用」というトグルボタンをオンにしておきましょう。

ここがオフになっていると Webhook は使えないので注意してください。

image.png

動作確認

最後にいつも通り動作確認を行っていきましょう。

LINE の画面からリッチメニューの問い合わせを押してみます。

正しく選択肢が表示されました!



勿論それぞれの選択肢を押すとメッセージが入力されるのが確認できました。

まとめ

ここまでで前回実装したリッチメニューの問い合わせを選択した際に、問い合わせ種別を選択するメッセージが返信される機能実装してきました。

次回は、問い合わせ内容をスプレッドシートへ出力する機能を実装していきたいと思います。

残りは 11 日!
気になる方は是非フォローやカレンダー購読をお願いします:star:

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?