RedmineからBacklogに移行する案件があり、使う前にAPIで何ができるのか調べておきたかったのと ちょうど requests を使って見たかったので一緒に試して見ました。
python3.5で実行しています。
準備
$ pyvenv-3.5 venv
$ venv/bin/pip install requests
実装
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
HOST = 'https://hamster.backlog.jp'
API_KEY = 'apiKey=#####YOUR_API_KEY#####'
PROJECT_KEY = '#####YOUR_PROJECT_KEY#####'
def main():
# ユーザ情報の取得
# GET ${HOST}/api/v2/users/myself?${API_KEY}
r = requests.get(HOST + '/api/v2/users/myself?' + API_KEY)
print(r.json()['mailAddress'])
# プロジェクト情報取得
# ${HOST}/api/v2/projects/${PROJECT_ID}?${API_KEY}
r = requests.get(HOST + '/api/v2/projects/' + PROJECT_KEY + '?' + API_KEY)
PROJECT_ID = r.json()['id']
# 種別一覧の取得
# ${HOST}/api/v2/projects/${PROJECT_ID}/issueTypes?${API_KEY}
r = requests.get(HOST + '/api/v2/projects/' + PROJECT_KEY + '/issueTypes?' + API_KEY)
print(r.json())
ISSUE_TYPE_ID = r.json()[0]['id']
# 優先度一覧の取得
# ${HOST}/api/v2/priorities?${API_KEY}
r = requests.get(HOST + '/api/v2/priorities?' + API_KEY)
print(r.json())
PRIORITY_ID = r.json()[0]['id']
# 課題の追加
# ${HOST}/api/v2/issues?${API_KEY}
description = """===
これは課題投稿のテストです。
Backlog APIを利用してPythonから課題を投稿しています。
===
hogehoge
"""
data = {
'projectId': PROJECT_ID, # 課題を登録するプロジェクトのID
'summary': '課題投稿サンプル', # 課題の件名
'issueTypeId': ISSUE_TYPE_ID, # 課題の種別のID
'priorityId': PRIORITY_ID, # 課題の優先度のID
'description': description # 課題の詳細
}
r = requests.post(HOST + '/api/v2/issues?' + API_KEY, data=data)
print(r.json())
if __name__ == '__main__':
main()
実行結果
yuto.matsuki@recochoku.co.jp
[{'color': '#7ea800', 'id': 247919, 'projectId': 54803, 'displayOrder': 0, 'name': 'タスク'}, {'color': '#990000', 'id': 247918, 'projectId': 54803, 'displayOrder': 1, 'name': 'バグ'}, {'color': '#ff9200', 'id': 247920, 'projectId': 54803, 'displayOrder': 2, 'name': '要望'}, {'color': '#2779ca', 'id': 247921, 'projectId': 54803, 'displayOrder': 3, 'name': 'その他'}]
[{'id': 2, 'name': '高'}, {'id': 3, 'name': '中'}, {'id': 4, 'name': '低'}]
{'updatedUser': {'mailAddress': 'yuto.matsuki@recochoku.co.jp', 'id': 124948, 'userId': 'yuto_matsuki', 'name': '[レコチョク]松木佑徒', 'lang': None, 'roleType': 2}, 'attachments': [], 'createdUser': {'mailAddress': 'yuto.matsuki@recochoku.co.jp', 'id': 124948, 'userId': 'yuto_matsuki', 'name': '[レコチョク]松木佑徒', 'lang': None, 'roleType': 2}, 'stars': [], 'actualHours': None, 'keyId': 2, 'id': 5808128, 'created': '2016-09-24T04:22:45Z', 'customFields': [], 'estimatedHours': None, 'category': [], 'assignee': None, 'issueType': {'color': '#7ea800', 'id': 247919, 'projectId': 54803, 'displayOrder': 0, 'name': 'タスク'}, 'summary': '課題投稿サンプル', 'versions': [], 'status': {'id': 1, 'name': '未対応'}, 'startDate': None, 'dueDate': None, 'description': '===\n これは課題投稿のテストです。\n Backlog APIを利用してPythonから課題を投稿しています。\n ===\n\n hogehoge\n ', 'issueKey': 'WIZYDEV-2', 'milestone': [], 'parentIssueId': None, 'resolution': None, 'priority': {'id': 2, 'name': '高'}, 'updated': '2016-09-24T04:22:45Z', 'projectId': 54803, 'sharedFiles': []}
感想
- jQueryに似てる。この程度のAPI呼び出しは簡単に書けた。
- レスポンスを .json() で辞書型に変換してくれるのでJSONを返すAPIと相性が良さそう
- JSON変換に失敗すると None になるらしいのでちゃんと使うならチェックも入れるべき
- 応用でCloudWatchのアラートからチケット登録とか機会があれば使ってみたい
- AWS Lambdaの環境には残念ながらrequests入っていないようです
参考
松木佑徒