Line-botをrailsで作ってみた。

#はじめに
linebotの設定とか内容は以下のリンクをかなり参考にしてます。
ありがとう御座いました。
環境設定↓
[今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。](https://qiita.com/y428_b/items/d2b1a376f5900aea30dc)

ボットの内容↓
[Ruby on Rails でlinebot。メンヘラbotを作ってみた。](https://qiita.com/clubysg/items/70309673376fd4cc7b2b)
[LINEBOT + RailsでWikipediabotを作ってみました。](https://qiita.com/ryo94/items/a0d1f6b69e2983b9be4e)

#アカウントの作成
[line developer](https://developers.line.biz)でアカウント作成。
サイトのデザインはちょくちょく変わってるみたいです。
詳しくは以下のリンク↓
[今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。](https://qiita.com/y428_b/items/d2b1a376f5900aea30dc)

#アプリの作成

プロジェクトを作って

```
$rails new sample_bot -d postgresql
```

dbを作って

```
$rails db:create
```

gemを入れて

```
gem 'line-bot-api'
```
```
$bundle install
```

#ルートの作成

/callbackにラインからアクセスがあった時にlinebotコントローラーのcallbackアクションで処理を行う。

```rb:routes.rb

Rails.application.routes.draw do
  post '/callback' => 'linebot#callback'
end
```

#コントローラーの作成

Postモデルは以下のコマンドで作りました。
サンプルのデーターは以下のサイトをまるっとパクりました。すいません。

[Ruby on Rails でlinebot。メンヘラbotを作ってみた。](https://qiita.com/clubysg/items/70309673376fd4cc7b2b)


```
$rails g scaffold Post name:string
```

コントローラーは送られてきたメッセージに含まれた文字によって返すメッセージをif文で条件分岐しています。


```rb:controllers/linebot_controller.rb
class LinebotController < 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|

      # event.message['text']でLINEで送られてきた文書を取得
      if event.message['text'].include?("好き")
        response = "んほぉぉぉぉぉぉ！すきすきすきすきすきすきすきすきぃぃぃぃぃ"
      elsif event.message["text"].include?("行ってきます")
        response = "どこいくの？どこいくの？どこいくの？寂しい寂しい寂しい。。。"
      elsif event.message['text'].include?("おはよう")
        response = "おはよう。なんで今まで連絡くれなかったの？"
      elsif event.message['text'].include?("みーくん")
        response = "みーくん！？" * 50
      else
        response = @post.name
      end
      #if文でresponseに送るメッセージを格納

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

    head :ok
  end
end
```

#本番環境の設定

herokuにデプロイして、herokuの環境変数に　LINE_CHANNEL_SECRET　と　LINE_CHANNEL_TOKEN　をセットする

```
$heroku config:set LINE_CHANNEL_SECRET=xxxx   #xxxxに自分のLINE_CHANNEL_SECRET
$heroku config:set LINE_CHANNEL_TOKEN=xxxx    #xxxxに自分のLINE_CHANNEL_TOKEN
```
でハマったのがLINE_CHANNEL_TOKENがどこにもない！！
IDとLINE_CHANNEL_SECRETしかない！！ってなったのですが、
結果見ている場所が違いました。どうやら、botの設定のサイトを見ていたみたいです。
###Line official account managerのサイトでなく、
###Line Developerのサイトをみてください！！
そこのTOP > プロバイダーリスト > プロバイダー名 > チャンネル名（ボットの名前） > チャネル基本設定に　Channel Secret(LINE_CHANNEL_SECRET)とアクセストークン(LINE_CHANNEL_TOKEN)アクセストークンは再発行を押してください。

###Webhook URLの設定
同じくチャンネル基本設定にあるWebhook送信を利用するにし、
Webhook URL ※SSLのみ対応に自分サイトのurlを登録してください。
https://<herokuのapp名>.herokuapp.com/callback　：例
注意：ここに登録したurlにラインのデータが送られるようになります。/callbackにラインからアクセスがあった時にlinebotコントローラーのcallbackアクションで処理を行うようにしてるため、このようなurlになっています。