Backlog APIを使って自分のアクティビティを調べよう

2017.05.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き横山です。

本日はバックログの自分のアクティビティをBacklog APIから取得し、CSV化するスクリプトを書いたので紹介します。

前提

以下の環境で動作確認しています。

  • Mac OS X 10.11.6
  • jq 1.5
  • curl 7.43.0
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1510
$ jq -V
jq-1.5
$ curl -V
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets

準備

Backlog API Key を取得しましょう

対象のBacklogスペースにログインしましたら、ページ右上のアイコンをクリックし「個人設定」をクリックします。

backlog_api001

開きましたら、左カラムの「API」の項目をクリックし、メモにAPIの利用目的等を書き、「登録」をクリックします。

backlog_api002

画面右下に「登録されたAPIキー」にAPIキーが作成されるのでそちらをメモしておきます。

backlog_api003

スクリプト

以下のスクリプトを実行しますと、最近100件のアクティビティのAPIが取得出来ます。
主に以下のAPIを叩いています。

#!/bin/bash
APIKEY="hy59xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSyv3"
BACKLOG_URL="https://xxx.backlog.jp"

TYPE_JSON='["",
            "課題の追加",
            "課題の更新",
            "課題にコメント",
            "課題の削除",
            "Wikiを追加",
            "Wikiを更新",
            "Wikiを削除",
            "共有ファイルを追加",
            "有ファイルを更新",
            "共有ファイルを削除",
            "Subversionコミット",
            "GITプッシュ",
            "GITリポジトリ作成",
            "課題をまとめて更新",
            "プロジェクトに参加",
            "プロジェクトから脱退",
            "コメントにお知らせを追加",
            "プルリクエストの追加",
            "プルリクエストの更新",
            "プルリクエストにコメント"]'

ME=$(curl -s $BACKLOG_URL/api/v2/users/myself\?apiKey=$APIKEY | jq -r '.id') 
echo "ID,日時,種別,プロジェクトURL,プロジェクトの課題URL,課題タイトル"
curl -s $BACKLOG_URL/api/v2/users/$ME/activities\?apiKey=$APIKEY\&count=100 |
  jq -r --argjson types "$TYPE_JSON" '.[] | [.id,
                                             .created,
                                             $types[.type],
                                             "'$BACKLOG_URL'/projects/"+.project.projectKey,
                                             if .content.key_id == null then 
                                               "" else 
                                               "'$BACKLOG_URL'/view/"+.project.projectKey+"-"+(.content.key_id|tostring)
                                               + (if .content.comment.id != null then 
                                                  "#comment-"+(.content.comment.id|tostring) else 
                                                  "" end)
                                             end,
                                             if .content.summary then .content.summary else "" end] | @csv'

設定

APIKEY

上記で設定したBacklog APIキーを設定してください

BACKLOG_URL

上記で設定したBacklog APIキーを設定したBacklogスペースのURLを設定してください

実行結果

$ bash activities.bash
ID,日時,種別,プロジェクトURL,プロジェクトの課題URL,課題タイトル
xxxxx8023,"20xx-xx-xxT17:00:20Z","GITプッシュ","https://xxx.backlog.jp/projects/PROJECT","",""
xxxxx8021,"20xx-xx-xxT17:00:17Z","GITプッシュ","https://xxx.backlog.jp/projects/PROJECT","",""
xxxxx8714,"20xx-xx-xxT17:00:11Z","GITプッシュ","https://xxx.backlog.jp/projects/PROJECT","",""
xxxxx3384,"20xx-xx-xxT07:49:05Z","課題にコメント","https://xxx.backlog.jp/projects/PROJECT","https://xxx.backlog.jp/view/PROJECT-2#comment-xxx","SUMMARY-2"
xxxxx5306,"20xx-xx-xxT10:27:06Z","課題にコメント","https://xxx.backlog.jp/projects/PROJECT","https://xxx.backlog.jp/view/PROJECT-2#comment-xxx","SUMMARY-2"
xxxxx8074,"20xx-xx-xxT17:00:06Z","GITプッシュ","https://xxx.backlog.jp/projects/PROJECT","",""
xxxxx3873,"20xx-xx-xxT09:03:27Z","課題の更新","https://xxx.backlog.jp/projects/PROJECT","https://xxx.backlog.jp/view/PROJECTO-1#comment-xxx","SUMMARY-1"
xxxxx9408,"20xx-xx-xxT03:18:52Z","課題の更新","https://xxx.backlog.jp/projects/PROJECT","https://xxx.backlog.jp/view/PROJECTO-1#comment-xxx","SUMMARY-1"
:
:
:

ぇ、100件じゃ足りないですか?

Backlog APIの制限上一度に100件以上は取得することが出来ません。
ですので、これ以上の件数を取得する場合はループを作成し、query stringに maxId を指定します。

以下のスクリプトを改変し利用することで事実上何件でも取得出来ますが、
Backlog API側で件数制限をしている部分もありますので、過度なAPI呼び出しをしないようご注意願います。

スクリプト

以下スクリプトは100件を3ページ分取ってくる設定です。

#!/bin/bash
APIKEY="hy59xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSyv3"
BACKLOG_URL="https://xxx.backlog.jp"
SIZE=100
PAGE=3


TYPE_JSON='["",
            "課題の追加",
            "課題の更新",
            "課題にコメント",
            "課題の削除",
            "Wikiを追加",
            "Wikiを更新",
            "Wikiを削除",
            "共有ファイルを追加",
            "有ファイルを更新",
            "共有ファイルを削除",
            "Subversionコミット",
            "GITプッシュ",
            "GITリポジトリ作成",
            "課題をまとめて更新",
            "プロジェクトに参加",
            "プロジェクトから脱退",
            "コメントにお知らせを追加",
            "プルリクエストの追加",
            "プルリクエストの更新",
            "プルリクエストにコメント"]'
function getActities() {
  JSON="$1" && shift
  echo $JSON | jq -c --argjson types "$TYPE_JSON" '[.[] | [.id,
                                                           .created,
                                                           $types[.type],
                                                           "'$BACKLOG_URL'/projects/"+.project.projectKey,
                                                           if .content.key_id == null then 
                                                             "" else 
                                                             "'$BACKLOG_URL'/view/"+.project.projectKey+"-"+(.content.key_id|tostring)
                                                             + (if .content.comment.id != null then 
                                                                "#comment-"+(.content.comment.id|tostring) else 
                                                                "" end)
                                                           end,
                                                           if .content.summary then .content.summary else "" end]]'
}

ME=$(curl -s $BACKLOG_URL/api/v2/users/myself\?apiKey=$APIKEY | jq -r '.id')
JSON=$(curl -s $BACKLOG_URL/api/v2/users/$ME/activities\?apiKey=$APIKEY\&count=$SIZE)
echo "ID,日時,種別,プロジェクトURL,プロジェクトの課題URL,課題タイトル"
ACTIVITIES=$(getActities "$JSON")
echo $ACTIVITIES | jq -r '.[] | @csv'

# PAGEが2ページ未満の設定ならここで終了する
if [ $PAGE -lt 2 ]; then
  exit 0
fi

# APIの呼び出しを最大5回までに留める
if [ $PAGE -gt 5 ]; then
  PAGE=5
fi

for n in $(seq 2 $PAGE); do
  MAXID=$(echo $ACTIVITIES | jq -r '.[-1][0]')
  JSON=$(curl -s $BACKLOG_URL/api/v2/users/$ME/activities\?apiKey=$APIKEY\&count=$SIZE\&maxId=$MAXID)
  if [ "0" == "$(echo $JSON | jq '. | length')" ]; then
    break
  fi
  ACTIVITIES=$(getActities "$JSON")
  echo $ACTIVITIES | jq -r '.[] | @csv'
done

設定

APIKEY

上記で設定したBacklog APIキーを設定してください

BACKLOG_URL

上記で設定したBacklog APIキーを設定したBacklogスペースのURLを設定してください

SIZE

1度のAPI呼び出しで取得する件数。 (1 <= SIZE <= 100)

PAGE

API呼び出し回数。 (1 <= PAGE <= 5)

まとめ

こちらのスクリプトを使うことでBacklogで最近どんな作業をやったかのExcelなどにまとめる事が出来ると思います。
作業可視化の方法として思い出していただけると幸いです。

参考したサイト