LINE BOT が チラシをくれた(1) 〜おうむ返し編

web初心者が LINE BOT 適当に作った。
最終的なコードは一番最後の記事に載せる。

#追記
この一連の記事はLINE Messaging APIになる前のbot trialでの内容である。

#まずは環境
言語: RubyとSinatraという軽量フレームワーク
サーバー: HerokuがSSL認証の部分で一番簡単そうだったのでとりあえずHeroku

#~オウム返しできるまで~
1.とりあえずはLINE developers にアクセス！
2.LINE BOTアカウントを登録
(この時はまだ名前とかトプ画とかの設定だけで大丈夫)
####3.アプリ作成
まずは好きなディレクトリ（フォルダ）に Gemfile と config.rb　を作成
(Gemfile とは bundle という Ruby系 で超役に立つパッケージ管理?ツールみたいなの)


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

gem 'sinatra'
gem 'rest-client'
gem 'httpclient'
```


```ruby:config.rb
# coding: utf-8                                                                                                                                               
require 'bundler/setup'
require 'sinatra/base'
require 'json'

class App < Sinatra::Base

  before do
    @endpoint_uri = 'https://trialbot-api.line.me/v1/events'
    @request_header = {'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

  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: {
          contentType: msg['content']['contentType'],
          toType: msg['content']['toType'],
          text: msg['content']['text']
        }
     }
   end
   content_json = request_content.to_json

   RestClient.proxy = ENV["FIXIE_URL"]
   RestClient.post(@endpoint_uri, content_json,@request_header)
  end
  "OK"
end

run App
```

このようにコードを書きコマンドをうって Heroku にあげよう。
```
$ bundle install
$ git init
$ git add -A
$ git commit -m "first commit" 
$ heroku create
$ heroku push heroku master
```
初回は heroku にログインしなければいけないかも。。。その時のコマンドは
$ heroku login
(アカウトがある事前提)

###4.環境変数設定
'X-Line-ChannelID' => ENV["LINE_CHANNEL_ID"],
'X-Line-ChannelSecret' => ENV["LINE_CHANNEL_SECRET"],
'X-Line-Trusted-User-With-ACL' => ENV["LINE_CHANNEL_MID"],
上の3つは そのままタイプしても大丈夫だが基本的には自分以外の人には見せちゃいけないので環境変数としてHerokuにあげとこう

・あげ方
LINE BOT のサイトの行って Channel ID, Channel Secret, Mid をメモる。
コードが置いてあるデイレクトリで以下をうつ。
```
$ heroku config:add LINE_CHANNEL_ID="LINE BOT の channel ID"
$ heroku config:add LINE_CHANNEL_SECRET="LINE BOT の Channel Secret"
$ heroku config:add LINE_CHANNEL_MID="LINE BOT の Mid"
```
(""を忘れずに。)
RestClient.proxy = ENV["FIXIE_URL"]
これは後で。

###5. LINE BOT の callback URL & Whitelist を登録する
他の記事にも書いてあるが一応書く。

LINE BOT など 最近のBOT系では SSL認証が必要。。。
(SSL認証は http じゃなくて https になってる)
Herokuは元々SSL認証が通ってる　= 最高


Whitelist は 固定IPじゃなきゃダメ。 Heroku は固定じゃない。。。
Herokuは固定じゃない = 悲しみ
##対処法##
Fixie というアドオンを追加する。


ここでさっきの　RestClient.proxy = ENV["FIXIE_URL"]　の部分もやっちゃう。
1.Heroku dashboard -> BOTのアプリ -> アドオンのFixie　の順でクリック
2.すると Fixie の サイト に飛ぶので 右上のACCOUNT をクリック
3.Proxy URL を全部メモる。
4.さっき同様に heroku config:add する。
 
同時にFixie のアカウントのページに書いてある　Outbound IPs を どっちもメモる。
あと、必要なのがcallback URL。

##実際にcallback URL & Whitelist を書く##
callback URL
https://herokuのアプリ名.herokuapp.com:443/linebot/callback

Whitelist
さっきメモったFixieのOutbound IPsを書く 最後の空欄には、自分は24を入れた。

これでおうむ返しされたら勝ちだ。

一応 実際に来たメッセージの内容(params['result'][0])を載せとく。

```ruby:
{
"content"=>
        {"toType"=>1,
         "createdTime"=>1463666365473,
         "from"=>"秘密",
         "location"=>nil, "id"=>"秘密",
         "to"=>["自分のID"], <-　これが重要
         "text"=>"おはよう",
         "contentMetadata"=>{"AT_RECV_MODE"=>"2","SKIP_BADGE_COUNT"=>"true"},
         "deliveredTime"=>0,
         "contentType"=>1,
         "seq"=>nil
        },
"createdTime"=>1463666365620,
"eventType"=>"138311609000106303",
"from"=>"秘密",
"fromChannel"=>LINEのチャンネルID, <-　コードで書いたやつ
"id"=>"これはよくわからん",
"to"=>["自分のID"],
"toChannel"=>自分のチャンネルID
}
```

上記の日本語が書いてあるのは数値が入ってます。

#まとめ
ここまで出来たら後は結構やり放題な気がする。
ここおかしいと思ったり、もっと詳しく聞きたい方はなんなりと言ってください！

#次回
* [LINE BOT が チラシをくれた(2) 〜PUSH編](http://qiita.com/kurouw/items/a54b678308f5fe02ccfc)


#参考記事
* [API reference for BOT API](https://developers.line.me/bot-api/api-reference)
* [LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516#comment-e6737f3166be32597681)
* [とりあえずLINE BOT APIでオウムを作ってみた](http://qiita.com/masuidrive/items/1042d93740a7a72242a3)