LINE自動応答ボットの仕組みを紐解いてみた
目次[非表示]
- 1.はじめに
- 2.MessagingAPIとは
- 3.MessagingAPIの種類
- 3.1.#応答メッセージを送る
- 3.2.#任意のタイミングでメッセージを送る
- 3.3.#さまざまなタイプのメッセージを送る
- 4.Webhookとは
- 5.LINE自動応答ボットの動作原理
- 6.実際にLINE自動応答ボットを作ってみた
- 7.検証してみた
- 7.1.友達登録時の挙動
- 7.2.メッセージ送信時の挙動
- 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アプリケーションを作成します。
・flask runコマンドを実行し、アプリケーションをローカルで起動させます。
3. ngrokのセットアップ
・今回は検証なのでデプロイはせずに、ngrokを使用してローカルに実行されているFlaskアプリケーションをインターネット上に公開します。
・ngrokとは
⚪︎ローカルPC上で稼働しているネットワーク(TCP)サービスを外部公開できるサービスです。 例えば、ローカルPCのWebサーバを外部公開することができます。
・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上のコードです。
・上記の実装により以下の2つの自動返信が実装できているはずです。
⚪︎ユーザーが公式LINEを友達登録したときには、「友達登録ありがとうございます!」というメッセージを自動で返信される
⚪︎ユーザーからテキストメッセージを受信したときには、「メッセージを受け取りました!」というメッセージを自動で返信される
・YOUR_CHANNEL_ACCESS_TOKEN と YOUR_CHANNEL_SECRET は、LINE Developersコンソールから取得できます。取得したチャネルのアクセストークンとチャネルシークレットを設定します。
検証してみた
友達登録時の挙動
1. 公式LINEに友達登録して自動でメッセージが送られてくるのか確認していきます。
a. 午後5:09にテストアカウントを友達登録した瞬間に公式LINEからメッセージが届きました。
2. ログを確認
a. 公式LINEに友達登録した午後5:09に 127.0.0.1 - - [24/Nov/2023 17:09:34] "POST /callback HTTP/1.1" 200 - というログが出力されています。これはFlaskサーバーが "/callback" ルートでPOSTリクエストを受け取り、ステータスコード200で応答したことを示しています。これはリクエストが正常に処理されたことを意味します。
b. リクエストの中身
1. “events” type:follow フォローイベント
2. “source” type:user ユーザー、userId ユーザーに紐づくユニークなID、
3. replyToken ユーザーに返信するためのトークン
3. コードを確認
フォローイベントのリクエストを受け取ったことで以下のコードの処理が実行されます。
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. リクエストの中身
1. “events” type:message メッセージイベント
2. “source” type:user ユーザー、userId ユーザーに紐づくユニークなID、
3. replyToken ユーザーに返信するためのトークン
2. コードを確認
メッセージイベントのリクエストを受け取ったことで以下のコードの処理が実行されます。
1. ユーザーが公式LINEアカウントをフォローすると、MessageEventがトリガーされます。
2. このイベントに応じて handle_message関数が呼び出されます。
3. line_bot_api を使用して、イベントから受け取った replyToken を使用してユーザーに返信メッセージを送信します。
a. 返信メッセージ:「メッセージを受け取りました!」というメッセージが TextSendMessage オブジェクトとしてメッセージを送信したユーザーに返信しています。
おわりに
ここまでご覧いただきありがとうございました。今回は公式LINEの自動応答ボットの仕組みを紐解いていきました。LINEが提供しているMessagingAPIとWebhookという技術を用いることで、自動応答が実現できているんですね。MessagingAPIの種類もまだまだあるので、それらを組み合わせていけば、自らがユーザーに一切返信することなく全て自動でユーザーとのやりとりを完了することができそうです!便利すぎる。。。!
divxでは一緒に働ける仲間を募集しています。
興味があるかたはぜひ採用ページを御覧ください。