学習記録

アウトプット用に作りました

LINEbotでメッセージおうむ返しアプリケーションを作成

LINEbotにチャットでテキストを送信すると、同じ内容のテキストを返信してくれるアプリケーションを作成していきます。

やることリスト


LINE Developersの登録と設定

  • LINE Developersで開発者として登録します。

  • 新規プロバイダーを作成します。

  • チャンネルを作成します。


Ngrokをインストールしてローカル開発環境を構築

Ngrokとは、手元のPC内に立ち上げたローカルサーバを簡単に外部に公開することができるサービスです。LINE Bot開発で、ちょっとした動作確認行うために、毎回Herokuなどにデプロイしてログを確認するという作業をしなくてもいいので作業効率が上がります。

$ brew install ngrok
$ ngrok —version
$ ngrok http 3000

※サーバーを起動した時に発行される赤線を引いた下記のURLが後々必要になります。

f:id:kimura34:20210515225106p:plain


LINEbotの実装

  • Railsアプリケーションを作成します。
$ rails new hoge
  • LINEbotを使うためのgemを追加してbundle installします。
gem 'line-bot-api'
  • コントローラを作成します。
$ rails g controller linebot

※コントローラは公式のコードやQiitaの記事を参考にしました。

GitHub - line/line-bot-sdk-ruby: LINE Messaging API SDK for Ruby

Rails+heroku+LINE Messager APIで秘書的なLINEbotを作ってみた(ゴミ出しの通知編) - Qiita

class LinebotController < ApplicationController
     require 'line/bot'

    # callbackアクションのCSRFトークン認証を無効
    protect_from_forgery :except => [:callback]

    def client
      @client ||= Line::Bot::Client.new { |config|
        config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
        config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
       }
    end

    def callback
      body = request.body.read

      signature = request.env['HTTP_X_LINE_SIGNATURE']
      unless client.validate_signature(body, signature)
        head :bad_request
      end

      events = client.parse_events_from(body)

      events.each { |event|
        case event
        when Line::Bot::Event::Message
          case event.type
          when Line::Bot::Event::MessageType::Text
            message = {
              type: 'text',
              text: event.message['text']
            }
            client.reply_message(event['replyToken'], message)
          end
        end
      }

      head :ok
   end
end
  • linebotコントローラのcallbackメソッドを出力するためにルーティングを設定します。
Rails.application.routes.draw do
   post '/callback', to: 'linebot#callback' 
end


dotenvを使ってenvファイル環境変数を設定

  • Gemfileにdotenvを追加してbundle installします。
gem 'dotenv-rails'

dotenvとは環境変数を管理する事が出来るgemです。 アプリケーションの中で「DBの情報」や「サーバーの情報」「外部APIの連携情報」など第三者に見せたくない機密情報をコードとは別に環境変数として情報を保存します。保存先は.envファイル という機密情報をまとめたファイルを作成し、情報を管理します。.envファイル はgitにそのまま載せると機密情報がgitに乗ってしまうため、 .gitignore に .envファイル を追加することで情報漏洩を回避します。

  • アプリケーションのルート直下にenvファイルを作成します。
$ touch .env
  • 作成したファイルの中にLINE_CHANNEL_SECRETLINE_CHANNEL_TOKENを管理します。
LINE_CHANNEL_SECRET=Channel secretを貼り付ける
LINE_CHANNEL_TOKEN=Channel access tokenを貼り付ける

※Channel secretはLINE Developersの指定チャンネル内、Basic settingに記載されています。
※Channel access tokenはLINE Developersの指定チャンネル内、Messaging APIに記載されています。

  • gitignoreに.envファイルを追加します
/.env


Webhook URLを設定

  • ngrokでサーバーを起動した時に発行されたURLに/callbackをつけて、LINE Developers内のMessaging APIのWebhook settingsに設定します。

f:id:kimura34:20210515230030p:plain

これで作成したLINEbotをQRコードで追加することで、チャットをおうむ返しするアプリケーションが完成しました。
ngrokでサーバーを起動してローカル環境でアプリケーションを動かしているので、ngrokのセッションが切れたらその都度Webhook URLを変更しなくてはいけません。