我发现 bitbucket api 如下:
https://bitbucket.org/api/2.0/repositories/{teamname}
但此链接返回 301 状态(永久移至!api/2.0/repositories/{teamname}
)。
好的,但是这个返回状态 200,存储库为零。
我提供了两个参数作为user
和password
,但似乎没有任何改变。
那么,任何人都可以回答如何获取允许特定用户使用的私有存储库的完整列表吗?
我发现 bitbucket api 如下:
https://bitbucket.org/api/2.0/repositories/{teamname}
但此链接返回 301 状态(永久移至!api/2.0/repositories/{teamname}
)。
好的,但是这个返回状态 200,存储库为零。
我提供了两个参数作为user
和password
,但似乎没有任何改变。
那么,任何人都可以回答如何获取允许特定用户使用的私有存储库的完整列表吗?
Atlassian 文档 -存储库端点提供了有关如何访问存储库的详细文档。
bitbucket 中提到的用于获取帐户存储库列表的URL是:
GET https://api.bitbucket.org/2.0/repositories/{owner}
如果您使用上面的 URL,它总是检索您是所有者的存储库。为了检索用户所属的存储库的完整列表,您应该调用:
GET https://api.bitbucket.org/2.0/repositories?role=member
您可以根据需要为角色应用以下一组过滤器。
要限制返回的存储库集,请应用 role=[owner|admin|contributor|member] 参数,其中角色为:
- owner:返回当前用户拥有的所有存储库。
- admin:返回用户具有明确管理员访问权限的存储库。
- 贡献者:返回用户具有显式写入权限的存储库。
- member:返回用户具有显式读取权限的存储库。
Edit-1:
您可以使用Bitbucket REST 浏览器来测试请求/响应。(停产)
您不应使用来自https://bitbucket.org/api域的 API。
相反,您应该始终使用https://api.bitbucket.org。
现在,在执行重定向后您可能会得到一个空结果的一个原因可能是因为某些 http 客户端只会在服务器通过返回带有WWW-Authenticate
响应标头的 401 响应来明确要求它们时发送基本身份验证凭据。
存储库端点不需要身份验证。它只会返回对匿名用户可见的存储库(在您的情况下可能是一个空集),因此坚持WWW-Authenticate
挑战的客户端(有很多,包括 Microsoft Powershell)将无法按预期工作(注意,curl
总是急切地发送基本身份验证凭据,这使其成为一个很好的测试工具)。
上面的答案都不适合我,所以这就是我所做的。我们将使用 Bitbucket REST API。
您不能使用您的正常凭据。我创建了一个 API 密码。我不确定如何通过您的浏览器访问此页面,但请访问此处:https ://bitbucket.org/account/settings/app-passwords/
创建一个应用密码,然后剪切并保存 Atlassian 为您生成的密码。
curl --user your_username:your_app_password https://api.bitbucket.org/2.0/repositories/your_workspace?pagelen=100
我通过管道将其jq
保存到文件中。
your_workspace
您可以通过查看任何存储库的 URL 获得。
最大 pagelen 似乎是 100。如果您有超过 100 个 repos,那么您可能必须这样做:
curl --user your_username:your_app_password https://api.bitbucket.org/2.0/repositories/your_workspace?pagelen=100&page=2
JSON 还不错。您想要“值”数组。从那里,查看 links.clone,它可能有两个这样的条目:
"clone": [
{
"href": "https://user@bitbucket.org/WORKSPACE/REPO.git",
"name": "https"
},
{
"href": "git@bitbucket.org:WORKSPACE/REPO.git",
"name": "ssh"
}
],
这是我的结果中的剪切和粘贴,个人信息已更改。其他两个字段也很有用:
"full_name": "WORKSPACE/repo",
"name": "Repo",
扩展暴雪的答案,这是我刚刚写的一个 node.js 小脚本:
import axios from 'axios';
import fs from 'fs';
async function main() {
const bitbucket = axios.create({
baseURL: 'https://api.bitbucket.org/2.0',
auth: {
username: process.env.BITBUCKET_USERNAME!,
password: process.env.BITBUCKET_PASSWORD!,
}
});
const repos = [];
let next = 'repositories?role=member';
for(;;) {
console.log(`Fetching ${next}`)
const res = await bitbucket.get(next);
if(res.status < 200 || res.status >= 300) {
console.error(res);
return 1;
}
repos.push(...res.data.values);
if(!res.data.next) break;
next = res.data.next;
}
console.log(`Done; writing file`);
await fs.promises.writeFile(`${__dirname}/../data/repos.json`,JSON.stringify(repos,null,2),{encoding:'utf8'});
}
main().catch(err => {
console.error(err);
});