ストック型サービスの入り口としてのSlack(Trelloとの連携)

**更新：2016/06/23**
プログラミング不要で出来るようになってました。
https://seleck.cc/note/seleck_howto/article/55

※更新
Hubot Integrationが更新されて必要な環境変数等が変わっているので注意。
http://qiita.com/KeitaMoromizato/items/0ee11d795d18a49538d8

# 前置き
Slackはチャットサービスという性質上、フロー型の情報(リアルタイムなコミュニケーション)を操るのは向いていますが、情報をストックするのには向いていません。
ただし幸せなことにSlackはService Integrationの機能が充実しています。ストック型サービスと組み合わせることで、Slackでのコミュニケーションの可能性はさらに広がります。

ということで、hubotを介して[Trello](https://trello.com/)と連携する方法とメリットについてです。

## ストック型 × フロー型のメリット
ストック型サービス(Trello/Github?/etc...)へ情報を蓄積する入り口としてフロー型サービス(Slack)を利用するメリットは３点あります。

### 1.情報を記憶できる
人の記憶は曖昧です。アイデアを思いついてもすぐに忘れます。アイデアをSlackに投げても、アイデアを投稿したことすら忘れてしまいます。思いついたことは、ストックに最適化されたサービスに蓄積しましょう。

### 2.気軽さ
SlackのUIはとてもシンプルかつ投稿に最適化されています。Web版でもモバイル版でも一瞬で投稿することができます。情報を保存することへのハードルを下げることが、結果として大事なアイデアを消失させないことに繋がります。

### 3.人の目にふれる
Slack(チャットサービス)はTrelloやGithubなどの他のどのツールよりも見る時間が多いはず。情報発信と、それに連なるコミュニケーションの方法としては最適なツールです。思いついたアイデアは自分の中だけに留めず、共有することで化学反応を起こしましょう。


# herokuでhubotを動かすまで
今回はherokuを使用しています。
基本的なhubot環境構築なら、同じことをやっている人がたくさんいるので良く分からないかたはググってみるといいと思います。

※やり方が古いとご指摘頂きましたので修正しました。このページを参考に書いています。
[Hubotのインストール](http://qiita.com/bouzuya/items/11c0c6da2b3ad54b827f)

```
$ npm install -g yo generator-hubot
```

yoコマンドでbotを作成。

```
$ mkdir test_bot
$ cd test_bot
$ yo hubot
```

こんな感じで質問に答えていきます。今回はSlackとつなぐので、adapterにはslackを指定。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/52054/69a6d97b-7f34-d4db-7136-53936d247531.png)


※ **Hubot 2.9.x以前が入っている方**は次のコマンドで同じことができます。

```
$ hubot --create test_bot
$ cd test_bot
$ npm install hubot-slack --save

# /Procfileを以下の内容に書き換える
web: bin/hubot --adapter slack
```

botの作成が完了したらherokuの環境を作成＋push

```
$ heroku create test-bot --stack cedar
$ git push heroku master
$ heroku addons:add rediscloud
$ heroku ps:scale web=1
```

Slackの[Configure Integrations]または[Add a Service Integration]からhubotを選択して追加。(1)HUBOT_SLACK_TOKENと(2)HUBOT_SLACK_TEAMをメモ。また、[Integration Settings]の[Hubot URL]にherokuアプリケーションのURLを書く。

herokuの環境変数を設定。チャネル名に#は不要、','区切りで複数指定できます。

```
$ heroku config:set HUBOT_SLACK_TOKEN=(1)xxxxxx
$ heroku config:set HUBOT_SLACK_TEAM=(2)xxxxxxxxx
$ heroku config:set HUBOT_SLACK_BOTNAME=test_bot
$ heroku config:set HUBOT_SLACK_CHANNELMODE=whitelist
$ heroku config:set HUBOT_SLACK_CHANNELS=ここにチャネル名
```

ここまでで動いているはず。試しにslackで「bot名 PING」とポストしてみましょう。PONGが返ってきたら成功です。


# Want機能(Slack×Trello)
Trelloと連携して実際に何をやっているかというと、Slackで「want hogehoge」と投稿するとTrelloの「Want」リストにhogehogeというカードを追加しています。
Trelloの使い方は様々あると思いますが、今のプロジェクトでは「いつかやりたいけど特に内容も詰めてないし、いつやるかも決まっていない」ような内容を備忘録としてWantリストに登録しています。このWantリストのカード登録をSlack経由でできるbotを作ります。

## Trello API
TrelloAPIを使うための準備は少し煩雑。これから良くなるといいな。

まずは以下のURLにアクセス。keyを取得します。
https://trello.com/1/appKey/generate

![3.png](https://qiita-image-store.s3.amazonaws.com/0/52054/c26ba258-7bfe-9c5d-57ac-789b182d8630.png)

Keyが取得できたら次はTokenを取得。Keyを設定して以下のURLにブラウザでアクセス。

```
https://trello.com/1/authorize?key=<上で取得したKey>&name=&expiration=never&response_type=token&scope=read,write
```

次に自分が使っているBoardのIDを取得。以下のURLにアクセスするとBoardの一覧がJSONで取得できるので、投稿したいBoardのIDをメモ。

```
https://trello.com/1/members/keitamoromizato/boards?key=<上で取得したKey>&token=<上で取得したToken>&fields=name
```

最後に投稿したいListのIDを取得。Boardと同様にJSONで取得できるので、投稿したいListのIDをメモ。

```
https://trello.com/1/boards/<上で取得したBoardのID>/lists?key=<上で取得したKey>&token=<上で取得したToken>&fields=name
```

これで準備が整いました！

## 実装
まずはTrelloモジュールをインストール

```
$ npm install node-trello --save
```

こんな感じのコードを/scripts以下に置きます。hubotは/scripts以下に置いたコードを勝手に読み込んでくれるので、実装はこれで完了。

``` scripts/trello.coffee
module.exports = (robot) ->
  robot.hear /^want (.*)/i, (msg) ->
    title = "#{msg.match[1]}"

    Trello = require("node-trello")
    t = new Trello(process.env.HUBOT_TRELLO_KEY, process.env.HUBOT_TRELLO_TOKEN)
    t.post "/1/cards", {name: title, idList: process.env.HUBOT_TRELLO_LIST}, (err, data) ->
      if err
        msg.send "ERROR"
        return
      msg.send "「#{title}」 をTrelloに保存しました"
```

herokuにpush後、必要な環境変数を設定。

```
$ git push heroku master
$ heroku config:set HUBOT_TRELLO_KEY=xxxxxxxx
$ heroku config:set HUBOT_TRELLO_TOKEN=xxxxxxxx
$ heroku config:set HUBOT_TRELLO_LIST=xxxxxxxxxxx
```

これで動くはずです。Slackの対象チャネルに「want なんとか」と投稿するとTrelloに「なんとか」というカードが作られます。

## 最後に
このようにSlackをストック型サービスと連携させることにより、

1. 思いついた情報を気軽にメモして
2. その場でチームに共有し
3. 忘れないようにストック型サービスに蓄積

が同時にできます。今はTrelloだけですが、後々はすべての入り口をSlackに集約できないかなーと考えています。特に思考ログをストックする場所が欲しいのですが、何かいい保存方法ありますかね？