LINE BOTを試してみる(Cloud9 + Heroku)

# 開発環境

* Line Bot設定はhttps://developers.line.me からどうぞ！
* Cloud9 https://c9.io/
* Heroku https://www.heroku.com/

アカウントがない人は登録しておこう！（みんな無料だよ）

ただし今回使うHerokuのFIXIEアドオンのインストールはクレジットカードの登録が必要になります。(無料でも必要なんです)
抵抗がない方はアカウント情報から登録しておきましょう。

# 手順

## Cloud9でrailsプロジェクトを作成する

プロジェクト作成はCloud9のページから。

![image_03.png](https://qiita-image-store.s3.amazonaws.com/0/18060/8c933b8d-76e5-6aa7-d787-3114667eed88.png)


プロジェクトが作成できたら
ここからはCloud9のターミナル上での作業です。

![image_02.png](https://qiita-image-store.s3.amazonaws.com/0/18060/abf945fe-1aa0-91ef-2668-2c8bd3cda276.png)


```
rm -rf /home/ubuntu/workspace/*
```

railsとかは使わないので、workspace内のフォルダは全て削除しておく

そしてGemをきれいにしよう

```
# 必要なものだけ残す
gem uninstall -axI $(gem list --no-versions | egrep -v "bigdecimal|io-console|json|psych|rake|rdoc")
# 確認
gem list
# bundler! bundler!
gem install bundler

```

## プログラムの作成

@yuya_takeyama さんのRubyプログラムを参考にしました。
（プログラムが最新版になられてたので、一つ前のプログラムを紹介しています）

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

最新版は上記をご参照ください。

Heroku(Ruby,Railsプロジェクト)でデプロイすれば、Rakeの仕様で
config.ruがエントリポイントになるので、その中に手っ取り早くコードを書きましょう。

```:config.ru
require 'bundler/setup'
require 'sinatra/base'
require 'json'
require 'rest-client'

class App < Sinatra::Base
  post '/linebot/callback' do
    params = JSON.parse(request.body.read)

    params['result'].each do |msg|
      request_content = {
        to: [msg['content']['from']],
        toChannel: 1383378250, # Fixed  value
        eventType: "138311608800106203", # Fixed value
        content: msg['content']
      }

      endpoint_uri = 'https://trialbot-api.line.me/v1/events'
      content_json = request_content.to_json

      RestClient.proxy = ENV["FIXIE_URL"]
      RestClient.post(endpoint_uri, content_json, {
        'Content-Type' => 'application/json; charset=UTF-8',
        'X-Line-ChannelID' => ENV["LINE_CHANNEL_ID"],
        'X-Line-ChannelSecret' => ENV["LINE_CHANNEL_SECRET"],
        'X-Line-Trusted-User-With-ACL' => ENV["LINE_CHANNEL_MID"],
      })
    end

    "OK"
  end
end

run App
```

```:Gemfile
source 'https://rubygems.org'

gem 'sinatra'
gem 'json'
gem 'rest-client'
```

```
bundle install
```

問題なくインストールできるはずです。
安定した土台があるのはクラウドサービスのいいとこですね。
Windowsで環境構築してるときは色々エラーで泣いてました。

## Gitの準備

HerokuへデプロイするためにGitプロジェクトにします。

```
git init
```

## HerokuとFIXIEの準備

```
heroku login # 登録メールアドレスとパスワードを入力するよ
heroku create # app名を指定しなければ適当なapp名になります
heroku addons:create fixie:tricycle # FIXIEインスコ
```

これでherokuからFIXIEのプロキシ経由でリクエストできます。
FIXIEのアウトバウンドIPやプロキシURLの情報は
Herokuのダッシュボード → 作成したプロジェクト → Resourcesの
Add-onsにFixieのリンクがあるので、そこをクリックすれば
FIXIEのログとアカウント情報が見れます。

アカウント情報
![image_01.png](https://qiita-image-store.s3.amazonaws.com/0/18060/1ab0dc8a-5c7e-aeb2-e1c6-238a7b140d1b.png)

## LINE BOTに必要な情報を調べておく

![image_05.png](https://qiita-image-store.s3.amazonaws.com/0/18060/909ff449-9f63-be32-0bda-79035e16041b.png)


Channel ID
Channel Secret
MID
の値ははこの後利用します。

## ついでにCallback URLを設定します

前の手順のLINE Developersの画像からはみ出てますが、下のほうでCallback URLを指定できます。

Callback URL指定する値を調べます。

![image_06.png](https://qiita-image-store.s3.amazonaws.com/0/18060/6e7ae6d5-3d82-f05a-26b8-1c52cd83e9a0.png)

Herokuのダッシュボード → 作成したプロジェクト → Settings
でHerokuプロジェクトのURLがわかります。
このURLをhttpsプロトコルにしてポート番号をつけます。（そうでないとだめらしいです）

```
https://xxxxxxxxx.herokuapp.com:443/linebot/callback
```

にしてCallback URLとして指定してあげます。

## ついでにServer IP Whitelistを設定しておきます

設定するIPはFixieのアウトバウンドIPです。
アウトバウンドIPは二つあったので、両方指定しておきます。

## Heroku ENVの設定

前手順にあったLINE BOT APIの情報
Channel ID
Channel Secret
MID
とFIXIEのアカウント情報にあったPROXY URLを
下記のように設定してあげます。
このENVはRubyプログラムから参照します。

```
heroku config:add LINE_CHANNEL_ID="xxxxxx"
heroku config:add LINE_CHANNEL_SECRET="xxxxxx"
heroku config:add LINE_CHANNEL_MID="xxxxxx"
heroku config:add FIXIE_URL="http://xxxxxx"
```

## Herokuへデプロイ

準備は整ったので最後にHerokuへデプロイします

```
git add .
git commit -m 'deploy!! heroku!'
git push heroku master
```

## あとはLINEから確認しましょう

@yuya_takeyama さんの記事のように、タダでLINE BOTの構築が行えました。
プログラムはすでに上がっている記事を参考にするとして、
今回は手順にフォーカスをあてた記事になりました。

それではよいBOTライフを！！！