[Tips] APIを利用したBacklogへの課題追加 with Python
あることがきっかけでBacklogへの課題一括登録用のAPIを作成することになりました。
実装したコードと、その際に自身が "ハマった"ポイントについてまとめます。
[Note]
個人用に作成したものなので、コーディングが最適化されていない可能性があります。
事前準備
まずはPythonの実行環境を整えます。
詳細は割愛しますが、以下の準備を行ってください。
1. Pythonインストール
-インストールはこちらからどうぞ
- PATHを通すことも忘れずに
2. requestsライブラリのインストール
- Pythonをインストール後、Terminal (windowsの場合はコマンドプロンプト)で "pip install requests"を実行
実装したコード
今回は、可変情報を全てjsonファイルから入力しています。
pythonコード
jsonファイルに記載されている追加したいタスク分を繰り返しでapiで登録していきます。
ここでは、親課題がすでにできていて子課題を追加する、もしくは独立した課題を追加することを想定しています。
そのため、"親課題の作成->親課題に紐づく子課題を作成"を実行することは本コードでは実行できません。
import requests
import json
prot = 'https://'
spaceName = '' #初期値空白 jsonより入力
apiPath = '/api/v2/issues'
keyPara = '?apiKey='
apiKey = '' #初期値空白 jsonより入力
#jsonファイルをロード
file = open('input.json', 'r')
data = json.load(file)
headers = {
'Content-Type': 'application/json'
}
Num_of_task = data['apiInfo']['number'] #taskの数を取得
spaceName = data['apiInfo']['spaceName'] #スペース名を取得
apiKey = data['apiInfo']['apiKey'] #apiKeyを取得
url = prot+spaceName+apiPath+keyPara+apiKey #URLを生成
#作成するタスク分繰り返す#
for i in range(Num_of_task):
req_str = data['task'+ str(i+1)] #task名を取得
try:
r = requests.post(url, json = req_str, headers = headers) #POST
except requests.exceptions.ConnectTimeout: #Timeoutした場合の例外処理
print('Timeout Error')
sys.exit()
else:
if r.status_code==201: #status codeが201(Created)だったら成功した旨を標準出力
print('Successful!')
else : #失敗したら
print('Failed. Please comfirm the error below.')
print(r.status_code) # Status Code
print(r.json()) # Responce Body
jsonファイル
[各パラメータの説明]
●apiInfo -API利用時に必要な情報
spaceName: スペースのFQDNを入力
apiKey: 自身のスペースからAPIKeyを入力(手順はこちら)
number: 追加する課題の数
●taskX -課題登録に必要な情報
各種パラメータは公式ページを確認し入力
taskをn個追加したい場合は、"taskX'という形で繰り返し追記していく
{
"apiInfo":{
"spaceName": "YOUR SPACE NAME.backlog.com",
"apiKey": "YOUR API KEY",
"number": 2
},
"task1":{
"projectId": xxxx,
"summary": "Sample task1",
"issueTypeId": xxxxx,
"priorityId": 3,
"parentIssueId": xxxx,
"categoryId": [xxxx],
"assigneeId": xxxxx
},
"task2":{
"projectId": xxxx,
"summary": "Sample task2",
"issueTypeId": xxxxx,
"priorityId": 3,
"parentIssueId": xxxx,
"categoryId": [xxxx],
"assigneeId": xxxxx
}
}
"ハマった"罠
上記のコード自体はそれほど時間がかからず作成できたのですが、大きな問題が発生しました。
それは、
課題作成に必要なパラメータ群がどこから参照できるのかわからない
ということでした。
公式ページにいろいろパラメータの説明が書いてあるのですが、重要な"どこから参照できるのか"が書いていないのです。致命的・・・
少なくとも以下の項目はないと困るということで、どうしたら見れるか調べました。
・projectId
・issueTypeId
・parentIssueId
・categoryId
結論から言うと、以下の方法が一番楽です。
課題一覧をExcelでエクスポートし、各種パラメータを確認する
画面左のハンバーガーメニューから、"課題"を選択し、下図のようにExcelファイルでエクスポートします。この時、CSVでは項目が不十分なのでNGです。
それぞれ以下のように対応します。
・projectId:プロジェクトID
・issueTypeId : 種別ID
・parentIssueId : ID
・categoryId : カテゴリー ID
ただし、この方法だと既存で作成されている課題に紐づく情報しかみる事ができないため、個別に各種確認する方法も記載しておきます。
projectId
プロジェクト設定に遷移後、URLを確認し、Query String内に存在する、projectId=xxxの値を確認する。
issueTypeId
プロジェクト設定に遷移し、対象の種別を選択後、ページ遷移し、URLのQuery String内に存在する、IssueType.id=xxxの値を確認する
parentIssueId
調べた限り、個別に確認できなさそう
categoryId
プロジェクト設定に遷移し、対象のカテゴリー を選択後、ページ遷移し、URLのQuery String内に存在する、id=xxxの値を確認する
おわりに
Backlogのヘルプが少し不親切な部分もありましたが、なんとか実装はできました。
なるべく少ないコード量で実装したので、エラーハンドリングなど不十分なところがあると思いますが、参考になれば幸いです。