スクリーンショット_2019-02-07_22

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サービスも作れます。

この記事が気に入ったらサポートをしてみませんか?