前回 の続きです…。
jsonで処理するため、標準的な shell (bash) とは言いながらjqというjsonのパーサを使うことにしました。
jqを準備する
今回は、RedmineのデータをAPI経由/jsonで取得します。
取って来たjsonをパースするために、jqをここからインストール。
ダウンロードのshell
- REDMINE_URL / API_KEY / ISSUE_IDS (チケットのID) は環境変数とかで渡すのが前提とします。
- ISSUE_IDS は空白スペースで区切って指定します。
- (Exp. export ISSUE_IDS="1 2 100")
rm -fr *
for ID in ${ISSUE_IDS}
do
# PDF取得
wget -nv --content-disposition ${REDMINE_URL}/issues/${ID}.pdf?key=${API_KEY} \
--output-document=${ID}.pdf
wait
# jsonデータ取得
wget --header="X-Redmine-API-Key:${API_KEY}" --header="Content-Type: application/json" \
-N -O issue.json ${REDMINE_URL}/issues/${ID}.json?include=attachments,relations
wait
# jq を使って添付ファイルのidを抽出
FILES=`cat issue.json | jq '.issue.attachments[].id'`
# 添付ファイルをダウンロード
for FILE in $FILES
do
wget --content-disposition --restrict-file-names=nocontrol \
--header="X-Redmine-API-Key:${API_KEY}" ${REDMINE_URL}/attachments/download/${FILE}
wait
done
# jq を使って関連チケットのidを抽出
RELATIONS=`cat issue.json | jq '.issue.relations[].issue_id'`
# 関連チケットをダウンロード
for RELATED in $RELATIONS
do
wget -nv --content-disposition ${REDMINE_URL}/issues/${RELATED}.pdf?key=${API_KEY} \
--output-document=${RELATED}.pdf
wait
done
done
ポイント
-
jsonの場合でも、xmlの場合でも同じなのですが、wgetを使って、 パラメータを複数指定する場合は、認証用のキーの情報をパラメータで渡すと、うまくデータが抽出できません。(オプションを変えてcurlで実行した場合でも、APIキーとその他のパラメータが同居するとうまくいきません)
-
このため、認証用のAPIキーは、HTTP Request Headerの X-Redmine-API-Key をセットしてあげています。