Azure DevOps仓库大小API调用404及权限查询问题求助
Azure DevOps仓库大小与权限查询API问题解决
我用Python脚本获取Azure DevOps项目的仓库列表,同时要查询每个仓库的大小和访问权限列表。目前能成功拿到仓库列表,但调用仓库大小的REST API(原用itemsizes端点)返回404错误,权限查询API也无法正常工作。我的PAT已经配置全权限,仓库都有内容,求正确的API端点或解决方法。
一、仓库大小查询的正确方案
原itemsizes端点并非官方用于获取仓库总大小的接口,正确的API是仓库的stats端点,返回数据中包含仓库的总占用字节数:
- 正确端点格式:
{organization_url}/{project_name}/_apis/git/repositories/{repo_id}/stats?api-version=7.1 - 返回字段:使用
sizeInBytes获取仓库总大小
二、仓库权限查询的正确方案
原权限端点逻辑错误,Azure DevOps的权限查询需要针对Git安全命名空间(固定ID:2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87)发起POST请求,通过请求体指定目标仓库的令牌:
- 正确端点格式:
{organization_url}/_apis/securitynamespaces/2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87/query?api-version=7.1 - 请求方式:POST,需构造包含仓库令牌的请求体
- 权限解析:返回的
allow字段是权限位掩码,需对应解析为实际权限(如读取、贡献、管理等)
三、修正后的完整脚本
另外注意:原脚本的Authorization头处理错误,Azure DevOps的Basic认证要求将":" + PAT进行Base64编码,而非直接使用PAT。
import requests import base64 # Azure DevOps organization URL organization_url = "https://dev.azure.com/your_organization" # Personal Access Token (PAT) with appropriate permissions personal_access_token = "your_personal_access_token" # Project name project_name = "your_project_name" # 处理PAT的Basic认证(必须将":PAT"进行Base64编码) auth_token = base64.b64encode(f":{personal_access_token}".encode()).decode() headers = { "Content-Type": "application/json", "Authorization": f"Basic {auth_token}" } # 获取仓库列表API repo_api_url = f"{organization_url}/{project_name}/_apis/git/repositories?api-version=7.1" response = requests.get(repo_api_url, headers=headers) if response.status_code == 200: repositories = response.json()["value"] for repo in repositories: repo_name = repo["name"] repo_id = repo["id"] print(f"\n=== 仓库:{repo_name} ===") # 1. 查询仓库大小 size_api_url = f"{organization_url}/{project_name}/_apis/git/repositories/{repo_id}/stats?api-version=7.1" size_response = requests.get(size_api_url, headers=headers) if size_response.status_code == 200: repo_size = size_response.json()["sizeInBytes"] print(f"大小:{repo_size} 字节") else: print(f"获取大小失败,状态码:{size_response.status_code}") print(size_response.text) # 2. 查询仓库权限 security_namespace_id = "2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87" # Git安全命名空间固定ID access_api_url = f"{organization_url}/_apis/securitynamespaces/{security_namespace_id}/query?api-version=7.1" # 构造权限查询请求体 request_body = { "query": { "tokens": [f"repoV2/{repo_id}"], "securityNamespaceId": security_namespace_id, "includeExtendedInfo": True } } access_response = requests.post(access_api_url, json=request_body, headers=headers) if access_response.status_code == 200: permissions = access_response.json()["value"][0]["acesDictionary"].values() print("访问权限:") for ace in permissions: user_name = ace.get("displayName", "未知用户") # 解析权限位掩码,映射为可读权限 permission_bits = ace["allow"] permission_list = [] if permission_bits & 1: permission_list.append("读取") if permission_bits & 2: permission_list.append("贡献") if permission_bits & 4: permission_list.append("管理") permission_str = ", ".join(permission_list) if permission_list else "无权限" print(f" 用户/组:{user_name},权限:{permission_str}") else: print(f"获取权限失败,状态码:{access_response.status_code}") print(access_response.text) else: print(f"获取仓库列表失败,状态码:{response.status_code}") print(response.text)
内容的提问来源于stack exchange,提问作者Automation
相关产品推荐
相关产品推荐

