LINE BOTを短時間で試す方法

参考にした記事
[Line Messaging API オウム返しBot(rails × heroku)](http://qiita.com/YoheiMiyamoto/items/f6851cdb40891edf0e57)

- オウム返しをしてくれるBOTを最速で作成しましょう！
- 所要時間目安30〜60分

# 環境構築

## アカウント
まずはLINEのアカウントを作成しましょう
下記を参考に
https://developers.line.me/messaging-api/getting-started

## LINE認証情報について
アカウント作成が完了したら以下にアクセス
https://business.line.me/ja/

LINE developersのBasic Informationに以下の記載があります

- Channel ID
- Channel Secret	
- Channel Access Token

上記を控えておいて下さい

## Heroku
fixieインストール

以下を参考に
[LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516)

こちらはHerokuの操作コマンドもまとめて掲載されています
[LINE BOTを動かす環境を調べてみた](http://djangoapplab.com/47/)

herokuアカウント作成後、fixieをインストール

heroku addons:create fixie:tricycle

アカウント設定を確認

- Proxy URL
- Outbound IPs

上記を控えておいて下さい

## LINE developersでServer IP Whitelist設定

https://business.line.me/ja/
アカウントリストから対象のアカウントのLINE developersへアクセスして下さい

画面左のタブからServer IP Whitelistをクリック
上記で控えた`Outbound Ips`をIP addressに設定して下さい
(/ 以降は一旦気にしないでください)

## LINE developersでWebhook URL設定
LINE developersでServer IP Whitelist設定と同様に画面左のタブのBasic Informationクリック

Webhook URL

下記を追記してください

`https://{ご自身のherokuアプリ名}.herokuapp.com:443/callback`

## Herokuのキー設定
herokuに環境変数の設定を行います

```
heroku config:add OUTBOUND_PROXY = '先ほどメモした設定値'
heroku config:add CHANNEL_SECRET = '先ほどメモした設定値'
heroku config:add CHANNEL_ACCESS_TOKEN = '先ほどメモした設定値'
```


# 実装

## rails

### gem

```
gem 'dotenv-rails'
gem 'faraday'
gem 'faraday_middleware'

// heroku用
group :production do
  gem 'rails_12factor'
end
```
上記を追記して下さい

### line_client

`lib/line_client.rb`

line_client.rbには主にLINEからの返信内容に関する、実装がされています

```
class LineClient
  END_POINT = "https://api.line.me"

  def initialize(channel_access_token, proxy = nil)
    @channel_access_token = channel_access_token
    @proxy = proxy
  end

  def post(path, data)
    client = Faraday.new(:url => END_POINT) do |conn|
      conn.request :json
      conn.response :json, :content_type => /\bjson$/
      conn.adapter Faraday.default_adapter
      conn.proxy @proxy
    end

    res = client.post do |request|
      request.url path
      request.headers = {
        'Content-type' => 'application/json',
        'Authorization' => "Bearer #{@channel_access_token}"
      }
      request.body = data
    end
    res
  end

  def reply(replyToken, text)

    messages = [
      {
        "type" => "text" ,
        "text" => text
      }
    ]

    body = {
      "replyToken" => replyToken ,
      "messages" => messages
    }
    post('/v2/bot/message/reply', body.to_json)
  end

end
```
上記の `def reply(replyToken, text)` のtextにBotに対して入力した
文字列情報が格納されていて、Json型式で内容をそのまま返却する実装です

### コントローラ
`webhook_controller.rb`

```
class WebhookController < ApplicationController
  // Lineからのcallbackか認証
  protect_from_forgery with: :null_session

  CHANNEL_SECRET = ENV['CHANNEL_SECRET']
  OUTBOUND_PROXY = ENV['OUTBOUND_PROXY']
  CHANNEL_ACCESS_TOKEN = ENV['CHANNEL_ACCESS_TOKEN']

  def callback
    unless is_validate_signature
      render :nothing => true, status: 470
    end

    event = params["events"][0]
    event_type = event["type"]
    replyToken = event["replyToken"]

    case event_type
    when "message"
      input_text = event["message"]["text"]
      output_text = input_text
    end

    client = LineClient.new(CHANNEL_ACCESS_TOKEN, OUTBOUND_PROXY)
    res = client.reply(replyToken, output_text)

    if res.status == 200
      logger.info({success: res})
    else
      logger.info({fail: res})
    end

    render :nothing => true, status: :ok
  end

  private
  # verify access from LINE
  def is_validate_signature
    signature = request.headers["X-LINE-Signature"]
    http_request_body = request.raw_post
    hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, CHANNEL_SECRET, http_request_body)
    signature_answer = Base64.strict_encode64(hash)
    signature == signature_answer
  end
end
```

`res = client.reply(replyToken, output_text, user)`
先程作成した `line_client.rb` に入力値 `output_text` を渡しています

### ルート設定
`config/routes.rb`


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

## デプロイ

一応Herokuのコマンドについては以下を参考に
[Heroku コマンド・設定 メモメモ](http://qiita.com/pugiemonn/items/0e69b7a29a384b356e65)

```
git add .
git commit -m "任意のコメント"
git push heroku master
```

## 試してみよう
作成したLINE BOTを友だち追加してテストしてみましょう

うまく動かない場合は ` heroku logs -t` でエラー内容を確認しましょう

## 最後に

ここまでできてしまえば後は
https://devdocs.line.me/ja/#webhooks
上記のリファレンスを参考に
![スクリーンショット 2017-02-04 20.02.14.png](https://qiita-image-store.s3.amazonaws.com/0/136533/57344fbb-bf00-5ac0-af95-f32336512c56.png "スクリーンショット 2017-02-04 20.02.14.png")


![スクリーンショット 2017-02-04 20.01.31.png](https://qiita-image-store.s3.amazonaws.com/0/136533/374ad1fd-7938-9e6a-c81e-58bc49926d59.png "スクリーンショット 2017-02-04 20.01.31.png")

リファレンスには上記の実装方法など詳細に記載がありますのでいろいろなことを試してみましょう

わたしも先月はじめてLINE BOT作ってみましたが、
結構な時間を環境構築にかけてしまいました
わたしのように時間をかけないでいただけたら幸いです

つくってみて正直とってもおもしろかったですね
わたしはgoogleの検索エンジンと連携してCarouselで
表示することまでやってみました
まだまだできることが盛り沢山なのでいろいろ試したいですね

[googleとの連携はこちらを参考に](http://qiita.com/kijitora-neko/items/7138906a1e71236cd02c)