今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。

# はじめに
LinebotをRuby on Railsで開発した話になります。
Linebot、Rails+Herokuの内容の記事は既にいくつもありますが、記事の内容が古く詰まる部分が多かったので、まとめました。
主に伝えたい内容は、以下になります。

* LINE Developer用のページが新しくなっていたこと
* HerokuのaddonであるFixieを使用する必要ないこと（クレジットカード登録不要ということ）
* Rails5により`gem install`不要なパッケージがあったこと。
* 寝かせないためのcronの設定は不要なこと

当方、Railsについては初心者のため、理解できてない部分説明不足な点があるかもしれません。その際はコメントでご指摘頂けると幸いですm(_ _)m

※ 1/31追記 callback関数で`head :ok`を返すようにしました。

# 環境
* Ruby 2.4.2p198
* Rails 5.1.4

# LINEbotアカウント作成
Developer用のページが以前（2017/7月）と少し変わっていたので軽く説明。

1. LINE Businessアカウントを[LINE developer](https://developers.line.me/ja/)にて作成。
* サービスからbot用のアカウントを作成。
    * https://developers.line.me/ja/services/messaging-api/ 
    * この時**Messaging APIのDeveloper Trial**を指定していないとPush送信（bot側からの発信）が利用できないので注意して下さい。（2017/11/7現在）
    * ログインすると↓こんな感じの画面になります
<img width="1166" alt="スクリーンショット 2017-11-07 16.03.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/83373/a174b87e-5fb0-caa2-dc67-90c4dd0257bf.png">


# Herokuにbot用app追加
* [Heroku](https://dashboard.heroku.com/apps)でアカウント作成して、bot用appを追加して下さい。
* **今回こちらからaddonは追加しないのでクレジットカードの登録は不要です！**

> #### FixieとかLine側のIPのWhitelistの設定は不要
大体Heroku*LineBot系の記事を見るとFixieというHeorkuのAddOnを使ってIPを固定しようとしているのですが,Line側のIPのWhitelistの設定は今年の4月ぐらいから任意になっているためその辺の設定不要です(FixieがあるとアウトバウンドのProxyを指定しなくてはいけないのでSDKが使えなくなる).
参考 : [Heroku(+Scheduler) + RailsでLineのリマインダーBotを作ったら世界に平和が訪れた](https://qiita.com/Shuheiktgw/items/b101a0e30488879a3ae7)


# Railsプロジェクトの作成
淡々と公式通りに進めていけば大丈夫です
https://devcenter.heroku.com/articles/getting-started-with-rails5
### 1. アプリケーションの作成
Heorkuがpostgresqlで動いているため、postgresqlオプションをつけておくと諸々設定してくれます。

```
rails new sample_bot --database=postgresql
```

### 2. Gemfileに`line-bot-api`を追記
[line-bot-sdk-ruby](https://github.com/line/line-bot-sdk-ruby)を使用するため、Gemfileを編集
ここで、**他の記事ですとログ出力用に`gem 'rails_12factor'`も入れるとありますが、Rails5では不要になりました。**
参考 : https://devcenter.heroku.com/articles/getting-started-with-rails5#heroku-gems

``` Gemfile
gem 'line-bot-api'
```
パッケージをインストール

```
bundle install
```

動作確認

```
rails s
```

http://0.0.0.0:3000/ に接続できれば大丈夫です。

### 4. HerokuへDeploy
ログインしてなければ

```
heroku login
```

Git repositoryを作成

```
git init
heroku git:remote -a <herokuのapp名>
git add .
git commit -m "init"
git push heroku master
```

`https://<heroku app名>.herokuapp.com/`にアクセスして接続できれば大丈夫です。

# Bot作成
[公式サンプル](https://github.com/line/line-bot-sdk-ruby/blob/master/examples/echobot/app.rb)見ながら、テンプレであるオウム返しbotを作ります。
### 1. コントローラーの作成
```
rails g controller linebot
```

### 2. 環境変数の設定
Gemfiileに追記&インストール

```
gem 'dotenv-rails' 
```
```
bundle install
````

Heroku側に環境変数を設定

```
heroku config:set LINE_CHANNEL_SECRET=xxxx
heroku config:set LINE_CHANNEL_TOKEN=xxxx
```
SettingsのReveal Config Varsからでも設定出来ます。



### 3. 実装
```config/routes.rb
Rails.application.routes.draw do
  post '/callback' => 'linebot#callback'
end
```

```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
    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
```

### 4. Deploy
本来はローカルで確認しないといけないですが、`replyToken`が用意できないためこのままDeployします。

```
git add .
git commit -m "add linebot_controller"
git push heroku master
```

### 5. LINE DeveloperへWebhook URLの設定
[LINE Developers](https://developers.line.me/console/)のページで作成したbot用アカウントの基本設定を開き、Webhook URLを設定します。
今回ですと、`https://<herokuのapp名>.herokuapp.com/callback`になります。
<img width="805" alt="スクリーンショット 2017-11-07 17.37.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/83373/85621001-b0d2-0b32-eec9-00edc8dab1a0.png">


### 6. 接続確認
実際にbotを友だち追加して、メッセージを送ってみて下さい、
オウム返しされたら完成です。

# Cronの設定について
Herokuを利用したことがある方はご存知のように、無料アカウントではheroku appは30分間しか起きていられません。そのため、アドオンの Heroku Scheduler などを使って上手く起こすように設定したりします。
しかし、LINE Messenger APIのおかげ？かbotが寝ている際にこちらからメッセージを送ると、起きてメッセージを返してくれます（起動のためかメッセージ返信まで少しラグがあります）
（TwitterやSlack botとかだと寝てしまうのでなんで起きるのかよく分かってないです。）

# おわりに
他にもPush実装やPush画面作成のCSSで詰まった部分などお伝えしたい内容があるのですが、過剰になるため省きました。別で投稿できたらします。
Heroku+Linebot系でこの記事が上に来ることで詰まる方を減らせたら幸いです。(๑´ڡ`๑)