trelloのAPIを使ってみる -シェルスクリプト-

# はじめに

trelloのAPIを使って自分のタスクに関する情報をLINEに通知する機能を実装したいと思います。

# 参考ページ

先人の知恵に感謝しつつ下記のページを参照しました。

[Trello APIリファレンス日本語版(勝手に作成)](https://ogatism.jp/techs/trello-api-reference/)
[Trello API を叩いてカードを作成する方法（curl利用）](https://qiita.com/isseium/items/8eebac5b79ff6ed1a180)
[curl コマンド 使い方メモ](https://qiita.com/yasuhiroki/items/a569d3371a66e365316f)
[シェルスクリプトでLINEに天気を投稿する](https://qiita.com/sibatan/items/0887fd2a51180219263f)
[【30分で動かすシリーズ】TrelloにAPIを使ってカードの起票や取得をしてみる](http://blog.serverworks.co.jp/tech/2016/05/16/trello-api/)

# 準備 - 各種キーとTokenの取得 -

- **開発者向けAPIキーと認証キーの取得**

trelloにログインした状態で https://trello.com/1/appKey/generate にアクセスし、情報を控えます。

- **Tokenの取得**

下記にアクセスしTokenを取得します。

```
https://trello.com/1/authorize?key=<開発者向けAPIキー>&name=&expiration=never&response_type=token&scope=read,write
```

## 余談：とーくんって何さ

Tokenはtrelloにアクセスする為のユーザ認証の仕組みです。
これに対してユーザ名とパスワードを使用して認証取る手段をベーシック認証と言います。

通常はブラウザからユーザ名とパスワードを入れてtrelloにログインすると思いますが、サーバ側（さくらのVPSとかサービスを提供するマシン）はtrelloにログインしていません。
*※ローカルPCとtrello間は通信は通常暗号化されています。*

とはいえ、サーバ側でtrelloのAPIを使用して情報を取得する為に、コマンドを叩く度にユーザ名とパスワードを丸出しにするのはリスキーです。
そこで既にログイン済み（認証済み）のローカルPCで、Tokenというユーザ名とパスワードの代わりになるものを発行し、それをサーバ側で実行するコマンドのパラメータとして付けてあげて認証を取るというイメージです。

要するにローカルPCでtrelloにログインした状態で、APIを叩く場合は特にTokenを用いる必要はありません。
普通にcurlコマンドでURLを指定すれば値が返ってきます。
下記のURLをブラウザで叩いてみて下さい。自分のtrelloの情報が表示されればTokenを指定しなくても情報が取得出来るというのがお分かりいただけると思います。

```
https://trello.com/1/members/me/
```

同じようにサーバで下記のようにcurlコマンドを叩いてみると401エラーが返ると思います。
401エラーは「は？認証しろし」っていうエラーです。

```
$ curl -I -s 'https://trello.com/1/members/me/'
HTTP/1.1 401 Unauthorized
X-DNS-Prefetch-Control: off
（略）
```

他にもTokenを使うメリットはありますが、それはググって下さい。[ココ](https://developer.cybozu.io/hc/ja/articles/202463840-API%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86)とか分かり易いですね。
「Tokenなら安全なのか！」とか、細かい人は[OAuthの仕組み](https://murashun.jp/blog/20150920-01.html)をご覧あれ。

長めの余談は以上です。


# 必要なIDを取得する

trelloを既に利用している方はご存知だと思いますが、trelloはボード＞リスト＞カードという単位でタスクを管理する仕組みになっています。
それぞれにIDが割り振られているので、APIを叩くときもこの識別子を添えて叩くことで対象を指定します。

- **Board の ID を取得する**

サーバ側で下記を叩くとBoard IDを含めた結果が返ってきます。
引くぐらい沢山返ってくるので「Tokenの後に「&fields=name」と付けてフィルタをかけるよ良いよ」という先人のアドバイスにおとなしく従いましょう。

```
$ curl -s "https://trello.com/1/members/<ユーザネーム>/boards?key=<開発者向けAPIキー>&token=<とーくん>&fields=name" | jq .
```

※jqって何？？っていう人は「jqコマンド」でググってください。とりあえず取得したJSONデータを整理してくれるコマンドです。

※ユーザネームはTrello上のusernameで@xxxxっていうやつです。下記のリンクで確認できます。userIDもここで見れますね。（trelloに忘れずにログインしてください）

```
https://trello.com/1/members/me/
```


- **List の ID を取得する**

```
$ curl -s "https://trello.com/1/boards/<BoardのID>/lists?key=<Key>&token=<とーくん>&fields=name" | jq .
```

- **Cardの情報を取得する**

これで期日とかは取得出来るので、これを向き向きしてLINEにPOSTすればOKですね。

```
curl -s "https://trello.com/1/lists/<りすとのID>/cards?key=<開発者向けAPIキー>&token=<とーくん>" | jq .
```

ちなみに、jqコマンドの説明がないので補足ですが、下記のようにするとカードの名前と期日が取れます。同じようにカンマで区切れば他の値も取れたり取れなかったりします。←

```
curl -s "https://trello.com/1/lists/<りすとのID>/cards?key=<開発者向けAPIキー>&token=<とーくん>" | jq '.[]["name","due"]'
```

[jqコマンドのマニュアル](https://stedolan.github.io/jq/manual/#Basicfilters)

※眠くなってきたので、LINEの投稿はまた後日追記します。

---
#追記　LINEへの通知

```
 ACCESS_TOKEN=<LINE notifyで取得したとーくん>
 MSG="[$name]の期日は[$due]です。"
 curl -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$MSG" https://notify-api.line.me/api/notify
```
あとは、通知を出したいグループトークにLINE notifyを招待してあげればOKです。