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

您好,
我
是来自7-Tier系统解决方案部门的Kawa。
现在已经是六月了。我们什么时候才能设立一个名为“雨天”的全国性节日呢?
说到下雨,我最近花了一些时间研究我们内部任务管理使用的 Backlog API,感觉它在很多方面都能提高效率,所以我想写篇文章记录一下。
它非常方便,因为获取数据比在图形用户界面里来回点击要容易得多。
本文提供了用于检索用户、类别和问题列表的示例代码。
如果你想用 curl 快速完成此操作,请参考下面这篇文章,这篇文章由我们开发部门负责处理各种复杂问题的 Mandai 撰写。
使用环境
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 拉取。
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、已处理、测试用例、超越花子
2024-03-08T23:06:50Z、已处理、xxx 设置请求、超越太郎
完全的
Beyond
我们使用Backlog 来进行部门内部和部门之间的协作,以及与外部公司进行项目管理

11