masked雑記

IT関連の記事を書く

BacklogAPIを利用してファイルを添付する

目的

Backlog API を利用して課題にファイルを添付する。

Backlog API

developer.nulab.com

BacklogAPIを利用して課題にファイルを添付するには、「添付ファイルの送信」/api/v2/space/attachmentを行い添付ファイルのIDを発行し、その後「課題コメントの追加」/api/v2/issues/:issueIdOrKey/commentsを呼び出す必要がある。
今回はファイルアップロード部分を実装したかっただけなので、適当なプロジェクトの適当な課題にファイルを添付する。
RubyPythonで実装した。友人に依頼されて最初にRubyで書いたけど、友人はPython使ってるからPythonで書き直した。

Ruby

使用したgem

rest-client, '2.1.0'

共通部分実装

require 'json'
require 'uri'
require 'rest-client'

base_url = 'https://<組織名>.backlog.com'
api_key = '<Backlogの個人設定で発行したAPIキー>'

プロジェクト一覧を取得する

ファイルを添付するための課題がある適当なプロジェクトIDを取得する。

response = RestClient.get(
  "#{base_url}/api/v2/projects", 
  {params: { apiKey: api_key }})
project_id = JSON.parse(response.body)[0]['id']
puts "project_id: #{project_id}"

プロジェクトの課題を取得

プロジェクトIDからファイルを添付するための適当な課題IDを取得する。

response = RestClient.get(
  "#{base_url}/api/v2/issues",
  {params: {apiKey: api_key, projectId: [project_id]}})
issue_id = JSON.parse(response.body)[0]['id']
puts "issue_id: #{issue_id}"

ファイルをアップロード

ファイルをアップロードし、IDを発行する。

request = RestClient::Request.new(
  method: :post,
  url: "#{base_url}/api/v2/space/attachment?"\
  "#{URI.encode_www_form({apiKey: api_key})}",
  payload: {
    multipart: true,
    file: File.new('/tmp/test_text_1.txt', 'rb')
  })
response = request.execute
file_id = JSON.parse(response.body)['id']
puts "file_id: #{file_id}"

課題にファイルを添付

上記で取得した課題IDとファイルのIDを利用してコメントを作成する。

response = RestClient.post(
  "#{base_url}/api/v2/issues/#{issue_id}/comments?"\
  "#{URI.encode_www_form(
    {apiKey: api_key, content: 'ファイル添付テスト', 'attachmentId[]' => [file_id]})}", 
  {})
puts "code: #{response.code}"
puts "body: #{response.body}"

Python

使用したパッケージ

requests==2.22.0

共通部分実装

import urllib.parse
import requests

baseUrl = 'https://<組織名>.backlog.com'
apiKey = '<Backlogの個人設定で発行したAPIキー>'

プロジェクト一覧を取得する

ファイルを添付するための課題がある適当なプロジェクトIDを取得する。

projectUrl = "%s/api/v2/projects?apiKey=%s" % (baseUrl, apiKey)
response = requests.get(projectUrl).json()
projectId = response[0]['id']
print("projectId: %s" % projectId)

プロジェクトの課題を取得

プロジェクトIDからファイルを添付するための適当な課題IDを取得する。

issueUrl = "%s/api/v2/issues?apiKey=%s&projectId[]=%s" % (baseUrl, apiKey, projectId)
response = requests.get(issueUrl).json()
issueId = response[0]['id']
print("issueId: %s" % issueId)

ファイルをアップロード

ファイルをアップロードし、IDを発行する。

filePath = '/tmp/test_text_1.txt'
files = {'file': ('test_text_1.txt' ,open(filePath, 'rb'))}
uploadUrl = "%s/api/v2/space/attachment?apiKey=%s" % (baseUrl, apiKey)
response = requests.post(
    uploadUrl,
    files = files).json()
attachmentId = response['id']
print("attachmentId: %s" % attachmentId)

課題にファイルを添付

上記で取得した課題IDとファイルのIDを利用してコメントを作成する。

content = '添付コメント'
commentUrl = "%s/api/v2/issues/%s/comments?apiKey=%s&attachmentId[]=%s&content=%s" % (baseUrl, issueId, apiKey, attachmentId, urllib.parse.quote(content))
response = requests.post(commentUrl).json()
print("response: %s" % response)