DIVX テックブログ

catch-img

LINE自動応答ボットの仕組みを紐解いてみた

目次[非表示]

  1. 1.はじめに
  2. 2.MessagingAPIとは
  3. 3.MessagingAPIの種類
    1. 3.1.#応答メッセージを送る
    2. 3.2.#任意のタイミングでメッセージを送る
    3. 3.3.#さまざまなタイプのメッセージを送る
  4. 4.Webhookとは
    1. 4.1.Webhookを通じて受け取れるイベントタイプ
  5. 5.LINE自動応答ボットの動作原理
  6. 6.実際にLINE自動応答ボットを作ってみた
  7. 7.検証してみた
    1. 7.1.友達登録時の挙動
    2. 7.2.メッセージ送信時の挙動
  8. 8.おわりに

こちらの記事はDIVXアドベントカレンダー2023の20日目の記事です。

はじめに

こんにちは。株式会社divxエンジニアの武田です。

今日は、公式LINEで友達登録したり特定のメッセージを送ると自動で返信してくれるLINE自動応答ボットの裏側にある仕組みについて、LINEのMessagingAPIとWebhookを使用してどのように動作しているのかを解説していきたいと思います。

MessagingAPIとは

LINEのMessagingAPIは、開発者がLINEプラットフォーム上で独自のコミュニケーション体験を作り出せるようにするためのインターフェースです。これを利用することで、ユーザーがLINE上で行う特定のアクションに対して自動的に応答を行うことができます。

LINEのMessaging APIの公式ドキュメント

https://developers.line.biz/ja/docs/messaging-api/overview/

MessagingAPIの種類

以下はMessagingAPIの種類の一部抜粋です。

#応答メッセージを送る

Messaging APIを利用すると、LINE公式アカウントと対話するユーザーに対して、メッセージを返信できます。

#任意のタイミングでメッセージを送る

Messaging APIを利用すると、いつでもユーザーに直接メッセージを送ることができます。

#さまざまなタイプのメッセージを送る

Messaging APIでは、以下のようなさまざまなタイプのメッセージをユーザーに送信できます。

送信方法

• 応答メッセージ

• プッシュメッセージ(1対1)

• マルチキャストメッセージ(1対多:ユーザーID指定)

• ナローキャストメッセージ(1対多:絞り込み配信)

• ブロードキャストメッセージ(1対多:すべての友だち)

メッセージタイプ

• テキストメッセージ

• スタンプメッセージ

• 画像メッセージ

• 動画メッセージ

• 音声メッセージ

• 位置情報メッセージ

• イメージマップメッセージ

• テンプレートメッセージ

• Flex Message

Webhookとは

Webhookは、特定のイベントが発生した際にHTTP POSTリクエストを登録してあるURLに送信する仕組みです。LINEプラットフォームでは、ユーザーがメッセージを送信したときにこのWebhookが作動し、開発者が指定したサーバーに情報を送ります。

LINEのWebhookの公式ドキュメント

https://developers.line.biz/ja/docs/messaging-api/receiving-messages/

Webhookを通じて受け取れるイベントタイプ

以下はWebhookを通じて受け取れるイベントタイプの一部抜粋です。


イベント発生源

説明

source-user

ユーザーによるイベント

イベントの種類

説明

message-event

メッセージイベント(テキスト、画像、動画、オーディオ、ファイル、位置情報、ステッカー)

follow-event

フォローイベント(友達追加)

unfollow-event

アンフォローイベント(ブロック)

https://developers.line.biz/ja/docs/messaging-api/receiving-messages/#webhook-event-types

LINE自動応答ボットの動作原理

LINE自動応答ボットは、Messaging APIとWebhookを連携させることで動作します。

例えば、ユーザーがメッセージを送ると、LINEプラットフォームはそのイベント情報をWebhookを介して指定されたサーバーに送信します。サーバーはその情報を受け取り、適切な応答を生成してMessaging APIを通じてLINEプラットフォームに返信します。こうすることで、ユーザーはあたかも人間が返信しているかのような体験をすることができます。

実際にLINE自動応答ボットを作ってみた

1. MessagingAPIを作成

 a. はじめにLINE DevelopersコンソールでMessagingAPIを作成します。

  i. 今回は『テストアカウント』という名前で作成します。

 ・詳しい作成手順は今回のテックブログとは趣旨が違う為、割愛します。

   ⚪︎以下のページを読めば簡単に作成できました。https://developers.line.biz/ja/docs/messaging-api/getting-started/#page-title

 ・公式LINEアカウントが自動的に作成されます。

2. Flaskアプリケーションの作成

 ・PythonとFlaskを使用して、Webhookを受け取り、MessagingAPIを送信するための基本的なFlaskアプリケーションを作成します。

from flask import Flask, request, abort

app = Flask(_name_)

# Webhookからのリクエストを受け取るルーティングを設定
@app.route("/callback", methods=['POST'])
def callback():
       # LINEからのリクエストを確認
       if request.method == 'POST':
            # LINEのイベント処理
            # (ここにロジックを実装)
            return 'OK', 200
       else:
            abort(400)
   if _name_ == "_main_":
     app.run()

 ・flask runコマンドを実行し、アプリケーションをローカルで起動させます。

3. ngrokのセットアップ

 ・今回は検証なのでデプロイはせずに、ngrokを使用してローカルに実行されているFlaskアプリケーションをインターネット上に公開します。

 ・ngrokとは

  ⚪︎ローカルPC上で稼働しているネットワーク(TCP)サービスを外部公開できるサービスです。   例えば、ローカルPCのWebサーバを外部公開することができます。

  ⚪︎https://ngrok.com/

 ・ngrok HTTP 5000とコマンドを実行して、生成されたURLを取得します。

4. Webhook URLの設定

 ・LINE Developersコンソールに戻り、取得したngrokのURLの末尾に/callbackを加えてWebhook URLとして設定します。

5. メッセージ応答の実装

 ・FlaskアプリケーションにLINEのMessaging APIと通信するためのロジックを追加します。

 ・pip install flask line-bot-sdkコマンドを実行し、LINE Messaging APIを利用するために必要なライブラリをインストールします。line-bot-sdk はLINEから公式に提供されているSDKです。

 ・FlaskアプリケーションにLINEのMessaging APIを使用するためのロジックを追加します。

  ⚪︎以下画像3枚ともapp.py上のコードです。

from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.models import FollowEvent, TextSendMessage, MessageEvent, TextMessage

app = Flask(name)

アクセストークンとシークレットを設定
※YOUR_CHANNEL_ACCESS_TOKEN と YOUR_CHANNEL_SECRET は、LINE Developersコンソールから取得できます。
line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)
# Webhookからのリクエストを受け取るルーティングを設定
@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    # Webhookからのリクエストの詳細を確認
    print(body)

    try:
      handler.handle(body, signature)
    except InvalidSignatureError:
         abort(400)
    return 'OK'
# 新しいユーザーに公式LINEをフォローされた時の処理
@handler.add(FollowEvent)
def handle_follow(event):
  line_bot_api.reply_message(
    event.reply_token,
    TextSendMessage(text="友達登録ありがとうございます!")
  )

# ユーザーからメッセージが送られてきた時の処理
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
  text = event.message.text # ユーザーからのメッセージを取得
  # ユーザーからのメッセージに対して応答
  line_bot_api.reply_message(
    event.reply_token,
    TextSendMessage(text="メッセージを受け取りました!")
  )

 ・上記の実装により以下の2つの自動返信が実装できているはずです。
  ⚪︎ユーザーが公式LINEを友達登録したときには、「友達登録ありがとうございます!」というメッセージを自動で返信される
  ⚪︎ユーザーからテキストメッセージを受信したときには、「メッセージを受け取りました!」というメッセージを自動で返信される
 ・YOUR_CHANNEL_ACCESS_TOKEN YOUR_CHANNEL_SECRET は、LINE Developersコンソールから取得できます。取得したチャネルのアクセストークンとチャネルシークレットを設定します。

検証してみた

友達登録時の挙動

1. 公式LINEに友達登録して自動でメッセージが送られてくるのか確認していきます。
 a. 午後5:09にテストアカウントを友達登録した瞬間に公式LINEからメッセージが届きました。

2. ログを確認

 a. 公式LINEに友達登録した午後5:09127.0.0.1 - - [24/Nov/2023 17:09:34] "POST /callback HTTP/1.1" 200 - というログが出力されています。これはFlaskサーバーが "/callback" ルートでPOSTリクエストを受け取り、ステータスコード200で応答したことを示しています。これはリクエストが正常に処理されたことを意味します。

 b. リクエストの中身

body {
      "destination":"",
      "events":[{
                 "type":"follow",
                 "webhookEventId":"",
                 "deliveryContext":{"isRedelivery":false},
                 "timestamp":1701387795053,
                 "source":{
                           "type":"user",
                           "userId":"ユーザーに紐づくユニークなID"
},
                 "replyToken":"ユーザーに返信するためのトークン",
                 "mode":"active"
               }]
        }

 1. “events” type:follow フォローイベント
 2. “source” type:user ユーザー、userId ユーザーに紐づくユニークなID、
 3. replyToken ユーザーに返信するためのトークン

3. コードを確認

フォローイベントのリクエストを受け取ったことで以下のコードの処理が実行されます。

# 新しいユーザーに公式LINEをフォローされた時の処理
@handler.add(FollowEvent)
def handle_follow(event):
        line_bot_api.reply_message(
               event.reply_token,
               TextSendMessage(text="友達登録ありがとうございます!")
        )

 1. ユーザーが公式LINEアカウントをフォローすると、FollowEvent がトリガーされます。
 2. このイベントに応じて handle_follow 関数が呼び出されます。
 3. line_bot_api を使用して、イベントから受け取った replyToken を使用してユーザーに返信メッセージを送信します。
  a. 返信メッセージ:「友達登録ありがとうございます!」というメッセージが TextSendMessage オブジェクトとしてフォローしたユーザーに送信します。

メッセージ送信時の挙動

1. 公式LINEにメッセージを送信して自動でメッセージが返信されるか確認していきます。

 a. 午後5:10にテストアカウントに対してメッセージを送信した瞬間に公式LINEから返信メッセージが届きました。

1. ログを確認

 a. メッセージを送信した午後5:10 127.0.0.1 - - [24/Nov/2023 17:10:21] "POST /callback HTTP/1.1" 200 - というログが出力されています。これはFlaskサーバーが "/callback" ルートでPOSTリクエストを受け取り、ステータスコード200で応答したことを示しています。これはリクエストが正常に処理されたことを意味します。

 b. リクエストの中身

body {
   "destination":"U6c...",
   "events":[{
        "type":"message",
        "message":{
              "type":"text",
              "id":"4866...",
              "quoteToken":"opD...",
              "text":"テストアカウントさん、こんにちは!!"
              },
        "webhookEventId":"01...",
        "deliveryContext":{"isRedelivery":false},
        "timestamp":170...,
        "source":{
            "type":"user",
            "userId":"ユーザーに紐づくユニークなID"
},
        "replyToken":"ユーザーに返信するためのトークン",
        "mode":"active"
       }]
   }

 1. “events” type:message メッセージイベント
 2. “source” type:user ユーザー、userId ユーザーに紐づくユニークなID、
 3. replyToken ユーザーに返信するためのトークン

2. コードを確認

メッセージイベントのリクエストを受け取ったことで以下のコードの処理が実行されます。

# ユーザーからメッセージが送られてきた時の処理
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):

    # ユーザーからのメッセージを取得
    text = event.message.text 

    # ユーザーからのメッセージに対して応答
    line_bot_api.reply_message(

      # eventに含まれるreply_tokenを用いてメッセージを返信
         event.reply_token,

         TextSendMessage(text="メッセージを受け取りました!")
    )

 1. ユーザーが公式LINEアカウントをフォローすると、MessageEventがトリガーされます。
 2. このイベントに応じて handle_message関数が呼び出されます。
 3. line_bot_api を使用して、イベントから受け取った replyToken を使用してユーザーに返信メッセージを送信します。
  a. 返信メッセージ:「メッセージを受け取りました!」というメッセージが TextSendMessage オブジェクトとしてメッセージを送信したユーザーに返信しています。

おわりに

ここまでご覧いただきありがとうございました。今回は公式LINEの自動応答ボットの仕組みを紐解いていきました。LINEが提供しているMessagingAPIとWebhookという技術を用いることで、自動応答が実現できているんですね。MessagingAPIの種類もまだまだあるので、それらを組み合わせていけば、自らがユーザーに一切返信することなく全て自動でユーザーとのやりとりを完了することができそうです!便利すぎる。。。!

divxでは一緒に働ける仲間を募集しています。

興味があるかたはぜひ採用ページを御覧ください。


  採用情報 | 株式会社divx(ディブエックス) 可能性を広げる転職を。DIVXの採用情報ページです。 株式会社divx(ディブエックス)



お気軽にご相談ください


ご不明な点はお気軽に
お問い合わせください

サービス資料や
お役立ち資料はこちら

DIVXブログ

テックブログ タグ一覧

人気記事ランキング

GoTopイメージ