Sinatra LINE BOT ひとまず お話出来るようにしてみた (LINE BOT API + DOCOMO 雑談API)

LINEのBOT APIが1万名限定で使えるということで触ってみました。

[BOT API Trial Account](https://business.line.me/services/products/4/introduction)

まず、アカウントは取得する必要があります。（まだ1万名に達しているかどうかは知りません）
多分上記URLに進めばアカウント取得出来るかと。

それで、とりあえずお話が出来るようなbotを作ろうと思います。
お話相手はDOCOMOの雑談APIさんです。

それで、サーバーのほうはSinatraでHerokuにアップします。

以下のような感じでお話出来ました。
話がうまい子ではありませんが、お話相手にはなってくれそうです。

<img width="375" alt="slack_for_ios_upload.png" src="https://qiita-image-store.s3.amazonaws.com/0/40796/8e6a316b-a24c-202c-8417-f68413e7354d.png">


# アプリケーション作成

好きなフォルダを作って、以下のGemfileとconfig.ruの2つを用意して下さい。

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

gem 'sinatra'
gem 'rest-client'
gem 'docomoru'
```

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

class App < Sinatra::Base
  get '/' do
    'test'
  end

  post '/linebot/callback' do
    params = JSON.parse(request.body.read)

    params['result'].each do |msg|
      client = Docomoru::Client.new(api_key: ENV["DOCOMO_API_KEY"])
      response = client.create_dialogue(msg['content']['text'])
      msg['content']['text'] = response.body['utt']

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

それで bundle install して下さい。
簡単です。 

基本的なBOTの処理は
http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516
を参考にさせて頂きました。

あと、DocomoのAPIですが、docomoのAPIのためのgemがあったのでこちらを利用することにしました。
https://github.com/r7kamura/docomoru

この後で、DocomoのAPIを取得します。

流れとしては、LINEからのコールバックを受けて、受けたコメントをDocomoの雑談APIへ。そして返答をそのままLINEのメッセージとして返すという感じです。

# DocomoのAPI KEY取得

以下のURLからAPI KEYを取得します。
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_usage_scenario

申請をするとすぐにdevelop用のAPI KEYをもらえます。

# herokuにアップ

herokuを使ったことがない方はアカウントを取得して必要な toolbeltをインストールする必要があります。

```
$ git init
$ git add .
$ git commit -m "Create line bot"
$ heroku create (アプリ名)
$ git push heroku master
```

# herokuに必要な設定

LINE BOTには接続元IPが必要らしく、Fixieというアドオンを使います。HTTPプロキシを発行してくれて、アウトバウンドのIPを固定してくれるようです。

```
$ heroku addons:create fixie:tricycle
```

``` http://fixie:hogehoge:80 ``` みたいなのがプロキシのURLで
```123:123:123:123 ``` みたいなのが固定IPです。2つある。

この2つが取得出来たらオーケーです。(herokuの管理画面からも確認にいける)

この後に、環境変数を設定します。

以下のように設定します。
必要なのは、
FIXIE_URL　-> 直前で取得したプロキシURL
LINE_CHANNEL_ID、LINE_CHANNEL_MID、LINE_CHANNEL_SECRET -> アカウントを発行するともらえる
DOCOMO_API_KEY -> ちょっと上のほうで取得したDocomoのapiのkey

![line-bot-demo_·_Settings___Heroku.png](https://qiita-image-store.s3.amazonaws.com/0/40796/1977acba-bfa9-9911-3fd9-312177281e5f.png)

# Line Bot側の設定

https://developers.line.me/
のリンク先の画面右上の「channels」というボタンをクリックします。

そうすると画面の下の方に「EDIT」ボタンがあるのでそこから諸々好きなように変更して下さい。
ただし、ひとつ確実にしないといけないのは「callback」の設定です。

``` https://(アプリ名).herokuapp.com:443/linebot/callback ``` とします。

![LINE_developers.png](https://qiita-image-store.s3.amazonaws.com/0/40796/258ce4b9-e2a8-7b6d-4226-161042a5cf29.png)

それで次にwhite listを設定します。

![LINE_developers 2.png](https://qiita-image-store.s3.amazonaws.com/0/40796/5e33310f-0fb9-8009-9077-c5ff409d6ff3.png)

左のサイドバーの「Server IP Whitelist」からいけます。
ここで、FIXIEで取得した2つのIPを追加します。このとき「/」以下のインプップエリアは空で大丈夫です。

# 完成

以上で完成です。
先ほどのcallbackを設定した画面のQRコードを読み込んで友達追加してメッセージを送って返ってくれば成功です。
ただし、callbackを設定してすぐには設定が反映されないようです。出来なくても気長に待ちましょう。

ひとまず、
``` https://(アプリ名).herokuapp.com:443 ``` にアクセスして「test」の文字が表示されればオッケーです。

僕は1日放置したら出来るようになりました。

```
$ heroku logs -t
```

でログを見ることも出来るので便利です。

# 参考
[LINE BOT の公式ページ](https://business.line.me/services/products/4/introduction)
[公式リファレンス](https://developers.line.me/bot-api/api-reference)

[LINE BOT API でのハマりどころ](http://yone098.hatenablog.com/entry/2016/04/10/032451)
結構丁寧。
ハマりどころを書いてくれていて助かった。

[LINE BOT をとりあえずタダで Heroku で動かす](http://qiita.com/yuya_takeyama/items/0660a59d13e2cd0b2516#comment-e6737f3166be32597681)
herokuでタダでbot動かせるよという記事。herokuでFixieを使えば動かせるということで参考になりました。

[とりあえずLINE BOT APIでオウムを作ってみた](http://qiita.com/masuidrive/items/1042d93740a7a72242a3)
上記記事が参考にしているということで。参考になりました。