backlog APIで課題管理

# 経緯

いちいちBacklogにログインして（もしくはブクマ踏んで）ガントチャートみたり、タスク一覧見るのが面倒
チャットツールに必要最低限の情報を通知してくれれば良くね？

# やってみる

[Backlogの課題一覧の取得API](https://developer.nulab.com/ja/docs/backlog/api/2/get-issue-list/#%E8%AA%B2%E9%A1%8C%E4%B8%80%E8%A6%A7%E3%81%AE%E5%8F%96%E5%BE%97)を使う


# サンプル

期限が一週間後の自分が担当の課題一覧をslackにぶん投げる。

```bash
echo -n "{\"text\":\"@hogehoge 以下の期限が迫ってます。ご対応ください。\n $(curl --globoff -k "https://${スペース名}.backlog.jp/api/v2/issues?apiKey=API_KEYを入れて&projectId[0]=プロジェクトID入れて&statusId[0]=1&statusId[1]=2&statusId[2]=3&assigneeId[0]=自分のassigneeId入れて&dueDateUntil=$(date "+%Y-%m-%d" -d week)&count=100"|jq|sed -n '/issueKey/,/dueDate/p'|grep 'issueKey\|dueDate'|sed -e "s/変換したい文字列/課題のURLの一部+変換したい文字列/g" -e "s/T00:00:00Z//g" -e "s/,//g"|awk '{print $2}' |sed -e "N;s/\n//g" -e "s/\"\"/\ /g" -e "s/\"//g" | sed -e "s/$/\\\\n/g")\"}"  |curl -X POST -H 'Content-type: application/json' -d @- ${投稿したいチャンネルのWebhook URL}
```

こんな感じの結果がslackに通知される
cronとかで定期実行すれば毎日のリマインダーになるかと

<img width="724" alt="スクリーンショット 2020-07-13 19.18.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210189/c003cea8-1e40-1db8-9dc3-98ba4aef3c57.png">


課題へのリンク 期限日
課題へのリンク 期限日
課題へのリンク 期限日
...
..

## 必要なもの

jqが必要です。
SlackのIncoming Webhooksを利用してます。
Backlogの個人設定からAPI KEYの発行が必要です。
自分のassigneeIdなどは無くても動くので、動かない場合は不要パラメータを削ってみてください。
動いた結果から自分のassigneeIdを見つけて絞り込みに使用してください。
他、スペース名など必要なものはググれば出るので、「Backlog API 使い方」とかでググってください

## 何をやっているのか

slackのIncoming Webhooksの--data引数のjson部分をecho -n で出力し、そのままcurlに**@-**で渡してます。
見づらいですが、やってることは下記です。
先頭のechoからcurlまでのなが〜い処理をbashのワンライナーでやってます。

```bash
echo -n "{"text":"表示したいもの"}"| curl -X POST -H 'Content-type: application/json' -d @- ${投稿したいチャンネルのWebhook URL}
```

```bash
echo -n "{\"text\":\"@hogehoge 以下の期限が迫ってます。ご対応ください。\n $(curl --globoff -k "https://${スペース名}.backlog.jp/api/v2/issues?apiKey=API_KEYを入れて&projectId[0]=プロジェクトID入れて&statusId[0]=1&statusId[1]=2&statusId[2]=3&assigneeId[0]=自分のassigneeId入れて&dueDateUntil=$(date "+%Y-%m-%d" -d week)&count=100"|jq|sed -n '/issueKey/,/dueDate/p'|grep 'issueKey\|dueDate'|sed -e "s/変換したい文字列/課題のURLの一部+変換したい文字列/g" -e "s/T00:00:00Z//g" -e "s/,//g"|awk '{print $2}' |sed -e "N;s/\n//g" -e "s/\"\"/\ /g" -e "s/\"//g" | sed -e "s/$/\\\\n/g")\"}"  |curl -X POST -H 'Content-type: application/json' -d @- ${投稿したいチャンネルのWebhook URL}
```



# おまけ

bashワンライナーの部分の解説。
下記の部分が上記で言う**なが〜い処理**に当たります。

```bash
echo -n "{\"text\":\"@hogehoge 以下の期限が迫ってます。ご対応ください。\n $(curl --globoff -k "https://${スペース名}.backlog.jp/api/v2/issues?apiKey=API_KEYを入れて&projectId[0]=プロジェクトID入れて&statusId[0]=1&statusId[1]=2&statusId[2]=3&assigneeId[0]=自分のassigneeId入れて&dueDateUntil=$(date "+%Y-%m-%d" -d week)&count=100"|jq|sed -n '/issueKey/,/dueDate/p'|grep 'issueKey\|dueDate'|sed -e "s/変換したい文字列/課題のURLの一部+変換したい文字列/g" -e "s/T00:00:00Z//g" -e "s/,//g"|awk '{print $2}' |sed -e "N;s/\n//g" -e "s/\"\"/\ /g" -e "s/\"//g" -e "s/$/\\\\n/g")\"}" 
```

パーツに分解するとこんな感じ
echo -n でダブルクォーテーションで囲った部分(上記nの直後から最後まで)を改行なし画面出力

```bash
echo -n 
```

単なる文字列"{"text":"文字列"}"の前半の一部

```bash
"{\"text\":\"@hogehoge 以下の期限が迫ってます。ご対応ください。\n
```

```$(bash command)```で```$()```で囲まれた内部の結果を変数として渡しています。
```＄（）```の中身はcurlで自分の所属するbacklogのAPIを叩いている

```bash
projectId    //自分の所属するグループのプロジェクトID
statusId     //今回は1~3で完了以外を取ってるつもり
assigneeId   //担当が自分
dueDateUntil //締め切り日
count        //100件が上限らしいので１００件超える場合は取れない。。。
jq           //jqコマンドでjsonを改行ありで見やすく整形
sed -n '/issueKey/,/dueDate/p' // issueKeyからdueDateまでの範囲の行を抽出
grep 'issueKey\|dueDate'       // issueKeyとdueDateだけを抽出
sed -e "s/変換したい文字列/課題のURLの一部+変換したい文字列/g" // 課題のURIを生成するために変換
-e "s/T00:00:00Z//g" // 締め切り日に不要なT00:00:00Zが付いているので削除
-e "s/,//g"          // jsonのカンマが付いているので削除
awk '{print $2}'     //"キー:" "バリュー"形式で値が取れるのでバリューだけ抽出
sed -e "N;s/\n//g"   //上下２段に必要な情報が分かれて表示されるので１行に統合
-e "s/\"\"/\ /g"     //上記１行に統合したので間のダブルクォーテーションをスペースに変換
-e "s/\"//g"         //他のダブルクォーテーションは削除
sed -e "s/$/\\\\n/g" //各行の末尾に改行コード(\n)を入れる
```