[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

画像1

ただし、この方法だと既存で作成されている課題に紐づく情報しかみる事ができないため、個別に各種確認する方法も記載しておきます。

projectId
プロジェクト設定に遷移後、URLを確認し、Query String内に存在する、projectId=xxxの値を確認する。

issueTypeId
プロジェクト設定に遷移し、対象の種別を選択後、ページ遷移し、URLのQuery String内に存在する、IssueType.id=xxxの値を確認する

parentIssueId

調べた限り、個別に確認できなさそう

categoryId

プロジェクト設定に遷移し、対象のカテゴリー を選択後、ページ遷移し、URLのQuery String内に存在する、id=xxxの値を確認する

おわりに

Backlogのヘルプが少し不親切な部分もありましたが、なんとか実装はできました。
なるべく少ないコード量で実装したので、エラーハンドリングなど不十分なところがあると思いますが、参考になれば幸いです。

この記事が気に入ったらサポートをしてみませんか?