LINEのbotでメッセージを送受信するまでの実装の流れ(Rails+Messaging API)
今回は作成したLINEのbotでのユーザーのUID取得、メッセージの送信、メッセージの受信をするまでの流れをまとめてみた。
実装の流れ
1. LINEデベロッパーコンソールでプロバイダー・チャネルなどを作成
2. Webhookで友達追加時にUIDを取得
3. 取得したUIDでメッセージを送信
4. Webhookでメッセージを受信して保存
LINEデベロッパーコンソールでの作業
以下よりアカウントを作成。
次にプロバイダー(これは一つのアプリ等につき一つのプロバイダー)を作成。
「新規チャネル作成」より、LINE Messaging API(bot)を選択。
アイコン画像、アプリ名、説明を入力し、テストではDeveloper Trialプランを選択。業種やメールアドレスを入力して作成完了。
チャネルの設定画面へ行き、メッセージ送受信設定からWebhook送信を「利用する」、Webhook URLにLINEからのWebhookを送信するサーバーのURLを入力する。
これで、LINEで友達追加されたりメッセージを受信したときに、このURLに対してデータが飛んでくるようになる。各種イベントは以下ドキュメントで確認可能。
友達追加時にUIDを取得する
ここまで設定が終わったら、友達追加(Followイベント)がWebhookで送信されてきたときにサーバー側でUIDを確認してみる。
今回はRailsを使うので、以下のGemをインストール
# Gemfile
gem 'line-bot-api'
コントローラーを作成して以下のような処理を書く。
# line_events_controller.rb
require 'line/bot'
def client
@client ||= Line::Bot::Client.new { |config|
config.channel_secret = "1636329139"
config.channel_token = "7171b889a85e446a3222c6384d319903"
}
end
def recieve
body = request.body.read
events = client.parse_events_from(body)
events.each { |event|
userId = event['source']['userId'] #userId取得
p 'UserID: ' + userId # UserIdを確認
end
end
ルーティングはすべてrecieveに飛ばす。
# routes.rb
post :line_events, to: 'line_events#recieve'
チャネル設定にQRコードがあるので、これを読み取って友達追加してみる。
ログを確認してみると、以下のように出力されるはず。
UserID: U22d5eb879b518b29ba93358xxxXXXxxx
このUserIDを使用して、メッセージを送信したり、ユーザーごとにリッチメニューを設定したりすることが可能。
取得したUIDでメッセージを送信
UserIDの取得までできれば、あとはドキュメントにそって自由にユーザーに対してメッセージを送ることができる。
メッセージにはリプライとpushがあり、サービス側のタイミングでメッセージを送りたい場合はpushを使うことになる。
curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer {channel access token}' \
-d '{
"to": "U4af4980629...",
"messages":[
{
"type":"text",
"text":"Hello, world1"
},
{
"type":"text",
"text":"Hello, world2"
}
]
}'
メッセージは複数指定可能で、複雑なレイアウトやアクションなどを指定できるFlexメッセージも送信可能。詳しくは以下の記事を参照。
Webhookでメッセージを受信して保存
LINEで受信したメッセージを受け取ってサーバー側に保存する実装を書いてみる。
先ほどeventsを取得するところまで書いたので、その中でイベントの種類を条件分岐して、メッセージだったらMessageというモデルのレコードを作成する。
events.each { |event|
userId = event['source']['userId'] #userId取得
case event
when Line::Bot::Event::Message # Messageの場合
case event['type']
when 'message'
Message.create(
user_uid: userId,
replyToken: event['replyToken'],
message_id: event['message']['id'],
message_type: event['message']['type'],
message_text: event['message']['text']
)
end
end
end
これでメッセージが来た時にサーバー内にメッセージの情報を保存できた。
まとめ
とりあえずUserのUIDを取得してしまえば、わりと簡単にメッセージが遅れます。また、LINEログインとの連携もできるので、LINEbotベースで展開するようなWEBサービスも作れます。
この記事が気に入ったらサポートをしてみませんか?