Heroku＋Railsで動かすFacebook Messengerのオウム返しBot

昨晩、

[F8カンファレンス：FacebookがMessengerのチャットボットのプラットフォームを発表](http://jp.techcrunch.com/2016/04/13/20160412agents-on-messenger)

FacebookのF8カンファレンスでMessengerのチャットボットのプラットフォームを発表しました。

ということで早速、オウム返しBotを作ってみます。


<img width="375" alt="S__2301957.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18165/f60f1274-a3a8-520b-fcd6-b657bf4bae8d.jpeg">


公式ドキュメントは
[Messenger Platform - 参考資料 - 開発者向けFacebook](https://developers.facebook.com/docs/messenger-platform)

こちらです。


#1 Facebookの開発者ページでアプリまたはページを作成（または既存のアプリを利用）

チャットボットの公開には、Facebookアプリまたはページが必要です。

[Quick Starts - 開発者向けFacebook](https://developers.facebook.com/quickstarts/?platform=web)

#2 アプリページの左サイドバーの下から2番目、Messengerを選択し、「Get Started」ボタンを押す

Messengerという項目が新しく追加されています。

![スクショ 2016-04-13 11.51.37.png](https://qiita-image-store.s3.amazonaws.com/0/18165/0c213cdd-1a81-421b-c70e-fb9c33381546.png)

#3 Webhookを登録しよう

若干ややこしいのですが、まずWebhookを設定する必要があります。ここでは、コールバックURLを登録するためにはまず、URLを用意し、適当なトークンを入力し、登録時に、Facebookが行う検証に合格する必要があります。

![スクショ 2016-04-13 11.56.27.png](https://qiita-image-store.s3.amazonaws.com/0/18165/ab8aa3c4-6ef3-4ecf-a950-f4cf74c07f0f.png)

![スクショ 2016-04-13 12.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/18165/034572e2-5fa8-8015-4e9d-abf1ae9b0508.png)

そのためのサンプルコードを記載します。（herokuの場合）

コールバックURL　https://example.herokuapp.com/api/callback
トークン　hogehoge

※トークンは各自適当なものを入力して下さい。

と入力します。

そして、検証用にcallbackを受け付けるための処理を用意します。

Railsでの例を記します。

```
def callback
   if params["hub.verify_token"] == "hogehoge"
      render json: params["hub.challenge"]
   else
      render json: "Error, wrong validation token"
   end
end
```

その後、「確認をして保存」ボタンを押すと、FacebookがコールバックURLに検証のためのリクエストを送り、合格すると登録が完了します。

#4 アクセストークンを発行しよう

Facebookページを利用して、

![スクショ 2016-04-13 11.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/18165/e7bc5834-f8a2-ee2d-2a58-b28fedc0e71b.png)

#5 チャットボットを起動

4で取得したアクセストークンを利用して、curlコマンドからチャットボットを起動します。YOUR_TOKENを置き換えてコンソールから下記を叩いて下さい。

curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=YOUR_TOKEN"

#6 テストしてみよう

Facebook Messengerアプリの「友達やグループを検索」から、登録したアプリ（またはページ）を検索して、友だちに追加し、適当に話しかけてみましょう。すると、コールバックURLにリクエストが届きます。

<img width="375" alt="S__2301955.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18165/f33baac5-cb48-7d5f-f809-a8ea13017a5f.jpeg">

<img width="375" alt="S__2301956.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/18165/0f0f981b-2989-4567-3bf9-71907ddd47b9.jpeg">

#7 オウム返ししてみよう

さて、最後になりますが、オウム返しをしてみます。

Botが発言をしても、同じコールバックに返ってくるので、適当に「hoge」とか返すサンプルを書いていたら無限ループになりハマりました。。。Botかユーザーの発言かどうかを判定して、場合分けしています。

```
def callback

    token = "<TOKEN>"

    message = params["entry"][0]["messaging"][0]    

    if message.include?("message")

      #ユーザーの発言
      
      sender = message["sender"]["id"]
      text = message["message"]["text"]

      endpoint_uri = "https://graph.facebook.com/v2.6/me/messages?access_token=" + token
      request_content = {recipient: {id:sender},
                         message: {text: text}
                        }

      content_json = request_content.to_json

      RestClient.post(endpoint_uri, content_json, {
        'Content-Type' => 'application/json; charset=UTF-8'
      }){ |response, request, result, &block|
        p response
        p request
        p result
      }
    else
      #botの発言
    end
  end
```

#宣伝

下記2つを運営しておりますので、ぜひフォロー下さい！

Botに関するニュースメディア「BotEggニュース」　http://news.botandegg.com/
Facebook Bot研究会　https://www.facebook.com/groups/1684644661776706/?fref=ts