如何使用 Python x Backlog API 批量检索数据

您好,

是来自七级系统解决方案部门的川。

现在已经是六月了。我们什么时候才能设立一个名为“雨天”的全国性节日呢?

说到下雨,我最近试用了Backlog的API,我们公司内部用它来管理任务。感觉它能从好几个方面简化流程,所以我想写篇文章记录一下。用它
检索数据比在图形用户界面里点来点去方便多了,真的非常方便。

本文提供了用于检索用户、类别和问题列表的示例代码。

如果你想用 curl 快速完成此操作,请参考下面这篇文章,这篇文章由我们开发部门负责处理各种复杂问题的 Mandai 撰写。

有效利用 Backlog 的 API

使用环境

Microsoft Windows 11 专业版
Python 3.12.2

准备

我们将颁发 API 密钥,确认子域名/项目 ID,并使用 Python requests 模块,因此我们将准备这些内容。

■ 获取 API 密钥
登录 Backlog 后,您可以通过右上角的个人资料图标 → [个人设置] → [API] 获取 API 密钥。(这可能取决于您的帐户权限)
○ 官方文档

■ 查看项目 ID:
在项目页面的“问题”部分,查看 URL 以查找子域名和项目 ID,并记下这些信息。https
://(子域名)/find/xxx?projectId=(ID)

requests 模块
未安装

pip install requests

获取用户列表

在工作中使用 Baklog 等管理工具时,账户管理常常会成为一个问题。(当你忙于日常工作时,管理各种工具确实很麻烦。)如果能
一次性获取用户列表,就能一目了然地看到哪些账户正在使用,哪些账户未使用。因此,让我们尝试按照官方文档中的说明来获取这些信息。

官方文件

这段代码会将参与特定项目的用户列表输出到 CSV 文件。

import csv import requests # 获取用户 def fetch_users(api_key, project_id): url = f"https://<subdomain>/api/v2/projects/{project_id}/users" params = { "apiKey": api_key } response = requests.get(url, params=params) if response.status_code == 200: return response.json() else: print("获取用户失败:", response.text) return None # 格式化 JSON def json_to_csv(json_data): csv_data = [] for item in json_data: user_id = item['id'] user_name = item['name'] csv_data.append([user_id, user_name]) return csv_data # 输出到 CSV 文件 def main(): api_key = "<APIキーを記載> project_id = "<输入您的项目 ID>" users = fetch_users(api_key, project_id) if users: csv_data = json_to_csv(users) with open('users.csv', mode='w', newline='') as file: csv_writer = csv.writer(file) csv_writer.writerow(['id', 'name']) # 输出标题行 csv_writer.writerows(csv_data) print("用户数据输出到 users.csv") else: print("无法检索用户数据") if __name__ == "__main__": main()

执行后,如果在代码所在的目录中生成一个名为 user.csv 的文件,这是正常的。

ID、姓名
1234、超越太郎
5678、超越花子

获取类别列表

如果您使用客户姓名或类似信息作为类别,您可能需要以更有条理的方式管理它们。
您可以稍微修改前面提到的用户获取代码,从而一次性检索所有类别,请尝试使用这种方法。

官方文件

import csv import requests # 获取分类 def fetch_categories(api_key, project_id): url = f"https://<subdomain>/api/v2/projects/{project_id}/categories" params = { "apiKey": api_key } response = requests.get(url, params=params) if response.status_code == 200: return response.json() else: print("获取分类失败:", response.text) return None # 格式化 JSON 文件 def json_to_csv(json_data): csv_data = [] for item in json_data: category_id = item['id'] category_name = item['name'] csv_data.append([category_id, category_name]) return csv_data # 输出到 CSV 文件 def main(): api_key = "<APIキーを記載> project_id = "<输入您的项目 ID>" categories = fetch_categories(api_key, project_id) if categories: csv_data = json_to_csv(categories) with open('categories.csv', mode='w', newline='') as file: csv_writer = csv.writer(file) csv_writer.writerow(['id', 'name']) # 输出标题行 csv_writer.writerows(csv_data) print("类别数据输出到 categories.csv") else: print("无法检索类别数据") if __name__ == "__main__": main()

执行后,如果在代码所在的目录中生成一个名为 categories.csv 的文件,这是正常的。

ID,名称
123456,ABC 公司
654321,DEF 公司

获取特定类别的问题列表

最后,这里是获取特定类别问题列表的代码(我们用此类别对客户进行分类)。

您可以为任务指定各种项目,请根据需要进行自定义。
状态列表

以下代码是一个示例,其中指定了以下条件以返回数据:

status_id
created_since
created_until

这次,我们还需要指定一个时间段,所以我们将使用预设的日期时间。
请注意,代码中的 created_since/until 是格式化的,必须手动输入。

import json import csv import sys import requests from datetime import datetime, timedelta def fetch_issues(api_key, project_id, category_id, status_id, created_since, created_until): url = "https://<subdomain>/api/v2/issues" params = { "apiKey": api_key, "parentChild": 0, # 获取所有问题,包括父问题 "projectId[]": project_id, "createdSince": created_since, "createdUntil": created_until, "statusId[]": status_id, "categoryId[]": category_id } response = requests.get(url, params=params) if response.status_code == 200: return response.json() else: print("获取问题失败:", response.text) return None def json_to_csv(json_data): csv_data = [] for item in json_data: created = item['created'] issue_type = item['issueType']['name'] summary = item['summary'] assignee = item['assignee']['name'] if item.get('assignee') else '' # 如果没有受让人,则设置空字符串 csv_data.append([created, issue_type, summary, assignee]) return csv_data def main(): api_key = "<APIキーを記載> project_id = <输入项目 ID> category_id = <输入类别 ID> status_id = <状态 ID> # 指定日期和时间 created_since = "2024-01-01" created_until = "2024-01-31" all_issues = [] seen_issue_ids = set() while True: json_data = fetch_issues(api_key, project_id, category_id, status_id, created_since, created_until) if not json_data: break # 将 JSON 转换为 CSV 格式 csv_data = json_to_csv(json_data) # 记录问题 ID for item in json_data: issue_id = item['id'] if issue_id not in seen_issue_ids: all_issues.append(item) seen_issue_ids.add(issue_id) # 获取检索到的数据的最新创建日期,并将其设置为下一个请求的 start_date if json_data: last_created = json_data[-1]['created'] last_created_date = datetime.strptime(last_created, "%Y-%m-%dT%H:%M:%SZ").date() created_until = (last_created_date - timedelta(days=1)).strftime("%Y-%m-%d") else: break # 输出为 csv csv_writer = csv.writer(sys.stdout) csv_writer.writerow(['Creation Date', 'Category', 'Content', 'Responsible Person']) # 输出标题行 csv_writer.writerows(json_to_csv(all_issues)) if __name__ == "__main__": main()

- 示例输出

创建日期、类别、内容、负责人
2024-03-08T23:23:50Z、已完成、关于测试用例、Hanako Beyond
2024-03-08T23:06:50Z、已完成、xxx 设置请求、Taro Beyond

完全的

-------------------------------------------------
进行内部和跨部门协作,以及与外部公司进行项目管理 Backlog 我们使用

如果您觉得这篇文章对您有帮助,请点个“赞”!
11
加载中...
11票,平均分:1.00/111
2,287
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

川健

来自系统解决方案部门的
一只奇特的宝可梦