如何批量获取Bitbucket仓库的所有用户权限列表?
获取Bitbucket仓库用户权限详细列表的解决方案
一、纠正API使用误区
你调用的 GET /2.0/workspaces/<workspace_id>/permissions/repositories?pagelen=100 接口其实已经包含完整的权限信息,只是返回结构是按权限条目分页:每个条目里的user字段对应权限拥有者,permission字段是具体权限级别(如read、write、admin),repository字段对应所属仓库。你需要遍历所有分页结果才能拿到全量数据。
二、两种高效获取方案
方案1:基于工作空间权限接口批量获取
这个接口会返回所有仓库的所有权限条目,只需处理分页即可:
- 初始请求:
curl -u <username>:<app-password> "https://api.bitbucket.org/2.0/workspaces/<workspace_id>/permissions/repositories?pagelen=100" - 检查响应中的
next字段,若存在则继续请求该URL,直到next为空 - 合并所有响应中的
values数组,即可得到所有「用户-仓库-权限」的对应关系
方案2:按仓库维度逐个查询(适合精确整理单仓库权限)
如果需要按仓库维度整理权限,可以先获取所有仓库列表,再逐个查询权限:
- 获取全量仓库:
curl -u <username>:<app-password> "https://api.bitbucket.org/2.0/workspaces/<workspace_id>/repositories?pagelen=100",同样处理分页拿到所有仓库的slug - 对每个仓库调用:
curl -u <username>:<app-password> "https://api.bitbucket.org/2.0/repositories/<workspace_id>/<repo_slug>/permissions/users?pagelen=100",获取该仓库的所有用户权限 - 将结果按仓库或用户维度汇总整理
三、自动化脚本示例(Python)
手动处理分页效率低,用脚本自动化完成:
import requests import time from requests.auth import HTTPBasicAuth # 替换为你的信息 WORKSPACE_ID = "你的工作空间ID" USERNAME = "Bitbucket用户名" APP_PASSWORD = "Bitbucket应用密码" # 需开启Workspace membership和Repositories权限 def fetch_all_paginated_data(url): all_data = [] while url: resp = requests.get(url, auth=HTTPBasicAuth(USERNAME, APP_PASSWORD)) resp.raise_for_status() data = resp.json() all_data.extend(data.get("values", [])) url = data.get("next") time.sleep(0.5) # 避免触发API速率限制 return all_data # 获取所有权限条目 permission_entries = fetch_all_paginated_data( f"https://api.bitbucket.org/2.0/workspaces/{WORKSPACE_ID}/permissions/repositories?pagelen=100" ) # 整理为用户维度的权限字典 user_perms = {} for entry in permission_entries: user_name = entry["user"]["display_name"] user_email = entry["user"]["email"] repo_name = entry["repository"]["name"] perm_level = entry["permission"] if user_name not in user_perms: user_perms[user_name] = {"email": user_email, "repos": []} user_perms[user_name]["repos"].append({"repo": repo_name, "permission": perm_level}) # 输出整理后的结果 for user, details in user_perms.items(): print(f"用户: {user} ({details['email']})") print("权限仓库列表:") for repo_info in details["repos"]: print(f"- {repo_info['repo']}: {repo_info['permission']}") print("---")
四、注意事项
- 必须使用Bitbucket应用密码(而非账号密码),应用密码需开启对应权限
- Bitbucket API默认每小时限制600次请求,脚本中加入短延迟可避免触发限制
- 如果需要包含团队权限,可额外调用
/permissions/groups接口补充数据
内容的提问来源于stack exchange,提问作者Dani Diaz
相关产品推荐
相关产品推荐

