RESTfm を用いた Chatbot アプリケーションの例

# RESTfm を用いた Chatbot アプリケーションの例
最終日にはいよいよ RESTfm を用いたアプリケーションを作ってみましょう。ただ、普通の CRUD ができるアプリケーションでは面白くありません[^1]。

そこで今回は Chatbot を作ってみます。Read したいレコードを指定すると bot がそのレコードの内容を返してくれる、というシンプルなものです。

# 環境
諸事情があり、以下のような構成にします。本質的な内容は Hubot + Slack などでも同じです。

- [ChatWork](http://www.chatwork.com/ja/)
- [Ruboty](https://github.com/r7kamura/ruboty)
    - [ruboty-chatwork](https://github.com/mhag/ruboty-chatwork)

# Ruboty のインストールと起動
Ruboty 自体のインストールや起動（常駐）方法についてはここでは省略します。

## 利用するデータベース
具体例として利用するデータベースを用意します。以下のように`Staff`というデータベースの`StaffData`レイアウト内の`staff_data`というテーブルを用います。

![fm_Qiita_02.png](https://qiita-image-store.s3.amazonaws.com/0/72181/fdefe835-1538-1f7e-41ff-08d165504f1f.png)

![fm_Qiita_03.png](https://qiita-image-store.s3.amazonaws.com/0/72181/2fb3cf37-c1d7-92e7-5344-31b579ed7df0.png)

以下の5つのカラムが定義されているのが分かります。

- `id`
- `name`
- `gender`
- `work`
- `point`

このテーブルに対して 7 つのデータが投入されています。

# Ruboty の仕様
ChatWork 上の bot に対して、以下のように投げたら、その`id`の人の`name`を返すようにしてみます（ここでは`id`は`2`ですね）。bot の名前は`srm`とします。

`srm このID誰？ 2`

# Ruboty のスクリプトを書いていく
ではスクリプトを書いていきましょう。「FileMaker API for Ruby (ginjo-rfm)」についての記事も参考にしてください。

##### まずは必要なものを`require`します。

```ruby:restfm_ruboty.rb
require 'rfm'
require 'open-uri'
require 'json'
```

##### 次に接続情報を書いてあげます。

```ruby:restfm_ruboty.rb
RFM_CONFIG = {
  :host          => 'FileMaker Server のアドレス',
  :account_name  => 'ユーザ名',
  :password      => 'ユーザ名に対するパスワード',
  :database      => 'Staff',
  :layout        => 'StaffData',
  :ssl           => false # デフォルトが true なので注意
}
```

##### 次に Ruboty の核の部分を書いていきましょう。まずはおまじない的な部分です[^2]。

```ruby:restfm_ruboty.rb
module Ruboty
  module Handlers
    class Restfm < Base
      on(/このID誰？ (.*)/, name: "who_is_this_id", description: "指定したIDの人は誰か")
```

##### メインのメソッドを書きましょう。`check_who_is_this_id`というメソッドにより`@name`に名前が入るという設計です。

```ruby:restfm_ruboty.rb
      def who_is_this_id(message)
        id = message.match_data.to_s.match(/このID誰？ (.*)/)[1].to_s
        check_who_is_this_id(id)
        message.reply("ID #{id} の人の名前は #{@name} です！")
      end
```

##### check_who_is_this_id メソッドを書きましょう。RESTfm は http\://hogehoge/RESTfm/ に配置されているものとします。

```ruby:restfm_ruboty.rb
      def check_who_is_this_id(id)
        json = open("http://hogehoge/RESTfm/Staff/layout/StaffData/id%3D%3D%3D#{id}.json").read
        json_parse = JSON.parse(json)
        @name = json_parse["data"][0]["name"] # [0] を忘れない
      end
```

# Ruby のスクリプトが完成
上述のスクリプトを組み合わせれば完成となります。完成したスクリプトは以下のとおりです。

```ruby:restfm_ruboty.rb
require 'rfm'
require 'open-uri'
require 'json'

RFM_CONFIG = {
  :host          => 'FileMaker Server のアドレス',
  :account_name  => 'ユーザ名',
  :password      => 'ユーザ名に対するパスワード',
  :database      => 'Staff',
  :layout        => 'StaffData',
  :ssl           => false # デフォルトが true なので注意
}

module Ruboty
  module Handlers
    class Restfm < Base
      on(/このID誰？ (.*)/, name: "who_is_this_id", description: "指定したIDの人は誰か")

      def who_is_this_id(message)
        id = message.match_data.to_s.match(/このID誰？ (.*)/)[1].to_s
        check_who_is_this_id(id)
        message.reply("ID #{id} の人の名前は #{@name} です！")
      end

      def check_who_is_this_id(id)
        json = open("http://hogehoge/RESTfm/Staff/layout/StaffData/id%3D%3D%3D#{id}.json").read
        json_parse = JSON.parse(json)
        @name = json_parse["data"][0]["name"] # [0] を忘れない
      end

    end
  end
end
```

# テストしてみる
さっそく Ruboty で試してみましょう。以下のように表示されれば成功です！

```
srm このID誰？ 2

ID 2 の人の名前は higashino です！
```

# 様々なアプリケーションを作る
今回は RESTfm を用いて Chatbot を作ってみました。Web API が使えるということで、いわゆる CRUD ができる Webアプリケーション だけではなく、Chatbot のようなアプリケーションも簡単に作ることができます。

アイデアを活かして、様々なアプリケーションを作ってみてください[^3]。

[^1]: サンプルアプリケーションがありますし、フレームワークも多くあります
[^2]: 荒い正規表現なので適当に修正をしてください
[^3]: 今だと Amazon Dash Button を使ったアプリケーションが面白そうです