Node.jsでTrelloとSlackとTwitterを連携させてタスク管理をちょっと良い感じにする

タスク管理の中の特定の作業を自動化して、かつ他のツールと連携してちょっと生活を便利にしたいなっていうそんなエントリーです。

# 僕のタスク管理

僕は自分のタスク管理をTrelloを使って行っています。
運用の仕方としては、

1. 自分専用のPrivateなボードを使う
2. リストの構成は以下。
  - tech -> 技術系のタスク(〇〇のチュートリアルやるとか、勉強するとかそういう話)
  - work -> 仕事のタスク。業務で別のタスク管理使ってるけど個人的にはここにも追加している。平日の日中は主にここを消化する
  - other -> 仕事でも勉強でもない内容はすべてここ
  - today -> 今日やるべきタスク
  - done -> おわったタスク
3. 毎朝、今日やるべきタスクをそのリストから「today」リストに移す
4. 一つ一つタスクを潰していく。終わったものは「done」リストに移す
5. 「today」リストが空になったら好き放題遊ぶ
6. 毎晩寝る前とかに「done」タスクの中身を全てアーカイブする

以上の感じで毎日タスクを回しています。

# 問題点と解決方法

とりあえず毎晩「done」タスクの中身を手動でアーカイブするのが面倒臭いです。
あと欲を言えばもう少しこのタスク消化の日々に遊び要素を取り入れたいです。

ということでそこらへんを解決するために以下のやり方で回していけるようにします。

1. 毎朝、今日やるべきタスクをそのリストから「today」リストに移す(ここは変わらず)
2. 一つ一つタスクを潰していく。終わったものは「done」リストに移す(ここも変わらず)
3. 「today」リストが空になったら好き放題遊ぶ(ここも変わらず)
4. 毎晩決まった時間に「today」リストと「done」リストの中身を見て「こなしたタスク」と「今日やるべきだったのに終わらなかったタスク」を引っ張ってきてslackに投下
5. 上記のタスクの内容は伏せつつ、その数をTwitterに投稿
6. 「done」リストの中身を全てアーカイブする

以上です。  
今回はこの4と5と6を実装していくよ〜っていう話です。

# 必要なものを最初に全部集める

## Trello編

TrelloのAPIを使うには、まずTrelloの会員である必要があり、そしてキーとトークンを用意する必要があります。  
そして今回は、自分が使っているボードと、「today」リストと「done」リストのそれぞれのIDが必要になります。
すでに会員であることを前提に話を進めます。

### キーとトークンを見つける

まずはTrelloにログインしている状態で以下のURLにアクセスします。

```
https://trello.com/1/appKey/generate
```

これでキーを取得できます。

![trello_1.png](https://qiita-image-store.s3.amazonaws.com/0/70780/98e36a69-7621-702b-80c0-d9687087c327.png)

次にそのページ内の「Token」というリンクに進みます。

![trello_2.png](https://qiita-image-store.s3.amazonaws.com/0/70780/ee09923d-1d68-0f18-04f6-ee02bfeec247.png)

そのページ内の「Allow」をクリックすると以下の画面に飛ぶので、ここに表示されているのがトークンです。

### 使うボードのIDを見つける

以下のコマンドを叩くことで、自分のアカウントに紐づくボードを全て取得することができます。

```
curl "https://trello.com/1/members/[ユーザー名]/boards?key=[キー]&token=[トークン]&fields=name"
```

JSONを取得することができるので、返ってきた値から必要な情報を探します。
僕は「MyTodo」というボードがほしかったのでそのIDを残しておきます。(IDは隠しています)

```
[
  {
    "id": "XXXXXXXXXXXXXXXXXXXXXXXX", 
    "name": "MyTodo"
  }
]
```

### 使うリストのIDを見つける

次に、今回必要となる「done」と「today」のリストのIDを先ほど取得したボードのIDから取得します。
叩くコマンドは以下です。

```
curl "https://trello.com/1/boards/[ボードID]/lists?key=[キー]&token=[トークン]&fields=name"
```

先ほどと同じようにJSONが返ってきます。

```
[
  {
    "id": "XXXXXXXXXXXXXXXXXXXXXXXX", 
    "name": "today"
  }, 
  {
    "id": "XXXXXXXXXXXXXXXXXXXXXXXX", 
    "name": "done"
  }
]
```

これでTrelloで必要なものは全て揃いました。

## Slack編

SlackのBotを扱うためには、WebHook用のURLを取得する必要があります。
自分のSlackチームのIncoming WebHooksにいきます。初めての人はもしかしたら何か色々やらなきゃいけないようなことがあったような気もしますが忘れてしまったので省略します。

![slack_1.png](https://qiita-image-store.s3.amazonaws.com/0/70780/0f198b7a-cae1-87c5-adcf-45bf3ac23958.png)

使用するチャンネルを指定して、「Add Incoming WebHooks integration」をクリックします。
移動した先で表示されているWebhook URLを使用します。

## Twitter編

以下のURLで、Create New Appをクリックします。
[https://apps.twitter.com/](https://apps.twitter.com/)

必要事項を入力してアプリケーションの作成すると、API KeyとAPI SecretとAccess TokenとAccess Token Secretを取得することができます。
それらの値を使用します。

詳しいやり方は以下を参照してください。
[やってみると意外とカンタン！TwitterAPIを使ってつぶやきデータを取得してみた。 | Web制作ならWebNAUT](http://webnaut.jp/develop/633.html)

# 実装の話

今回のソースコードは全てこちらにあがっていますのでそれを見ていただければ一発かなと思います。
[https://github.com/nabeliwo/trello-slack-twitter-bot](https://github.com/nabeliwo/trello-slack-twitter-bot)

簡単に処理の流れだけ説明すると以下のようになります。
ちなみにリクエストを送る処理は、[axios](https://github.com/mzabriskie/axios)を使用しています。

1. 「today」リストと「done」リストの中にあるタスクをそれぞれ取得する。2つのfetch処理は並列実行する
2. 取得したデータを扱いやすいように整形して、以下の処理に渡す。
  - Slackに投稿する
  - Twitterでtweetする
  - 上記2つの処理は並列で実行する
3. 「done」リストから取得したタスク達のIDを元にTrelloのdelete処理を配列回して実行する
4. 1〜3の処理のどこかでエラーが出たら `/logs/error.log` にエラー内容を記述。(fsを使用)
5. 1〜4の処理を毎日決まった時間に起こさせる([node-cron](https://github.com/ncb000gt/node-cron))を使用
6. 仮想環境上で、[forever](https://github.com/foreverjs/forever)を使って1〜5の処理をデーモン化

これだけです。
とても簡単な処理なので、ソースコード自体をここで書くまでもないなあと思ったのでリポジトリのURL載せるだけに留めておきます。

これで無事に僕は毎日23時にslackの通知とtwitterの自動投稿が行われるようになりました。
Slackに通知がくることで今日一日の成果を噛み締めつつ、ツイートすることで満足感が得られます。また、タスクが思うように進まなかった日は進捗率0%とか辛い数字がタイムラインに流れることになるのでなかなか気が引き締まります。

以上です。