backlog APIで課題管理


経緯

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

やってみる

Backlogの課題一覧の取得APIを使う

サンプル

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

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とかで定期実行すれば毎日のリマインダーになるかと

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

必要なもの

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

何をやっているのか

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

echo -n "{"text":"表示したいもの"}"| curl -X POST -H 'Content-type: application/json' -d @- ${投稿したいチャンネルのWebhook URL}
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ワンライナーの部分の解説。
下記の部分が上記で言うなが〜い処理に当たります。

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の直後から最後まで)を改行なし画面出力

echo -n 

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

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

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

projectId    //自分の所属するグループのプロジェクトID
statusId     //今回は1~3で完了以外を取ってるつもり
assigneeId   //担当が自分
dueDateUntil //締め切り日
count        //100件が上限らしいので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"   //上下2段に必要な情報が分かれて表示されるので1行に統合
-e "s/\"\"/\ /g"     //上記1行に統合したので間のダブルクォーテーションをスペースに変換
-e "s/\"//g"         //他のダブルクォーテーションは削除
sed -e "s/$/\\\\n/g" //各行の末尾に改行コード(\n)を入れる