【Rails】Line bot の作成

## 概要
プログラミング初学者です。勉強のためにLine botを作成してみました。
テキストメッセージにはテキストを、スタンプにはスタンプを返す仕様です。
[![Image from Gyazo](https://i.gyazo.com/c85180b8a9d6d9fc42f9c5e362597d2e.gif)](https://gyazo.com/c85180b8a9d6d9fc42f9c5e362597d2e)

## 手順
 - アプリケーション作成
 - Line developperにてアカウントを作成（割愛）
 - herokuにデプロイ
 - gem 'line-bot-api'を使って実装
 
## アプリケーション作成
```
$ rails _6.0.0_ new line_bot -d mysql  # アプリ立ち上げ（DBはmysql、のちにherokuでpostgresに変換）
$ cd line_bot　# ディレクトリに移動
$ rails db:create # DB作成

```
必要なgemを導入

```ruby:Gemfile

gem 'line-bot-api' # Line apiを使うのに必要
gem 'dotenv-rails' # 環境変数を使うのに必要

```
```

$ bundle install # gemを反映させる
$ rails g controller line_bots client collback # コントローラーの作成

```
今回は、line_botコントローラーの他にpostモデルを作成し、botの返信用にランダムなテキストを登録でき使用にしました。
参照：[Line-botをrailsで作ってみた。](https://qiita.com/sakakinn/items/e771f3d7732f6bb655d3)

```
$ rails g scaffold Post name:string # postモデルに関する全てを自動生成
$ rails db:migrate # DBにmigrateする

```
コントローラーの作成。
公式を読みましたがメッセージオブジェクトの理解に苦しみました。。。
参照：[Line Developers](https://developers.line.biz/ja/docs/messaging-api/message-types/)
メッセージオブジェクトの中身をテキストかスタンプかに記述することで条件分岐によって返信方法を分けることができました。

```ruby:line_bots_controller

class LineBotsController < ApplicationController
  require 'line/bot'  # gem 'line-bot-api'

  # 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

    # Postモデルの中身をランダムで@postに格納する
    @post=Post.offset( rand(Post.count) ).first
    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
              if event.message['text'].include?("運勢")
                message = {
                  type: 'text',
                  text: ["大吉", "中吉", "小吉", "凶", "大凶"].shuffle.first
                }
              elsif event.message['text'].include?("天気")
                message = {
                  type: 'text',
                  text: ["今日は快晴です", "今日は大雨です", "今日は曇りです", "今日は雪が降るかもしれません", "曇り時々雨"].shuffle.first
                }
              elsif event.message['text'].include?("おはよう")
                message = {
                  type: 'text',
                  text: ["おはようございます🌞", "昨日はよく眠れたかな？", "おはよう！！", "ZZZ...", "おはよう、気持ちの良い朝ですね！！"].shuffle.first
                  # emojis: {
                  #   index: 0,
                  #   productId: "5ac21184040ab15980c9b43a",
                  #   emojiId: "015"
                  # }
                }
              elsif event.message['text'].include?("おやすみ")
                message = {
                  type: 'text',
                  text: ["おやすみなさい😴", "８時間は寝ましょう！！", "おはよう！！", "ZZZZZZZZZZ...", "眠れない。。"].shuffle.first
                  # emojis: {
                  #   index: 0,
                  #   productId: "5ac21184040ab15980c9b43a",
                  #   emojiId: "015"
                  # }
                }
              elsif event.message['text'].include?("じゃんけん")
                message = {
                  type: 'text',
                  text: "ぐー、ちょき、ぱーのどれかを出してね。じゃんけんぽん！"
                }
              elsif event.message['text'].include?("ぐー")
                message = [{
                  type: 'text',
                  text: "ぐー!あいこ！"
                },
                {
                  type: 'text',
                  text: "ちょき!私の負け。。"
                },
                {
                  type: 'text',
                  text: "ぱー！私の勝ち！"
                },
                {
                  type: 'text',
                  text: "ちょき！強すぎない。。"
                }].shuffle.first
              elsif event.message['text'].include?("ちょき")
                message = [{
                  type: 'text',
                  text: "ぐー!私の勝ち！！"
                },
                {
                  type: 'text',
                  text: "ちょき!あいこ！"
                },
                {
                  type: 'text',
                  text: "ぱー！私の負け。。"
                }].shuffle.first
              elsif event.message['text'].include?("ぱー")
                message = [{
                  type: 'text',
                  text: "ぐー!私の負け。。"
                },
                {
                  type: 'text',
                  text: "ちょき!私の勝ち！"
                },
                {
                  type: 'text',
                  text: "ぱー！あいこ！"
                }].shuffle.first
              else 
                message = {
                  type: 'text',
                  text: @post.name
                }
              end
            when Line::Bot::Event::MessageType::Sticker
              message = [{
                type: 'sticker',
                packageId: '11537',
                stickerId: '52002734'
              },
              {
                type: 'sticker',
                packageId: '11537',
                stickerId: '52002736'
              },
              {
                type: 'sticker',
                packageId: '11537',
                stickerId: '52002760'
              },
              {
                type: 'sticker',
                packageId: '11537',
                stickerId: '52002740'
              },
              {
                type: 'sticker',
                packageId: '11537',
                stickerId: '52002771'
              }].shuffle.first
          end
          client.reply_message(event['replyToken'], message)
      end
    }

    head :ok
  end
end

```
環境変数を定義
参照：[【Rails】dotenv-railsの導入方法と使い方を理解して環境変数を管理しよう！](https://pikawaka.com/rails/dotenv-rails)

```ruby:.env
LINE_CHANNEL_SECRET = 自身のチャンネルシークレット
LINE_CHANNEL_TOKEN =　自身のチャンネルアクセストークン

# いずれもLine Developersに記載があります

```

## herokuにデプロイ

本番環境はherokuでやりました。
railsチュートリアルを参考に実行しました(記事内の「デプロイする」項目を参照に行いました。）
参照：[Ruby on Railsチュートリアル](https://railstutorial.jp/)

本番環境での環境変数の設定

```
# heroku上でURL作成後下記実行

$ heroku login
$ heroku config:set LINE_CHANNEL_SECRET= 自身のチャンネルシークレット
$ heroku config:set LINE_CHANNEL_TOKEN= 自身のチャンネルアクセストークン
$ heroku config # 環境変数が適用されているか確認
$ heroku run rake db:migrate # DBをmigrate

```

## Webhook設定

Line botのapiを呼び出す

```

# Line Developers
アプリのURL（herokuでデプロイしたので"https//○○○.herokuapp.com")//callback

```

## デプロイの実行

実行後、Webhookの検証で「成功」とでたらLine botが動きます。

```

$ git push heroku master

```

以上です。
今後は、pushメッセージや、他のAPIと連携したbotが作れるよう勉強していきます。