我找到了像bitbucket api:
https://bitbucket.org/api/2.0/repositories/{teamname}
但此链接返回301状态(永久移至!api/2.0/repositories/{teamname}
)。
好的,但这个返回状态200,零存储库。
我提供了两个参数user
和password
,但似乎没有任何变化。
那么,任何人都可以回答如何获取允许特定用户的私人存储库的完整列表吗?
答案 0 :(得分:15)
Atlassian文档 - Repositories Endpoint提供了有关如何访问存储库的详细文档。
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]参数,其中的角色为:
- 所有者:返回当前用户拥有的所有存储库。
- admin :返回用户明确的存储库 管理员访问。
- 贡献者:返回用户具有显式写入权限的存储库。
- 成员:返回用户明确读取的存储库 访问。
编辑-1:
您可以使用Bitbucket REST browser来测试请求/响应。(已停止)
答案 1 :(得分:1)
您不应使用https://bitbucket.org/api域中的API。
相反,您应该始终使用https://api.bitbucket.org。
现在有一个原因可能是您在重定向后获得空结果可能是因为某些http客户端只会在服务器通过返回带有WWW-Authenticate
响应头的401响应显式请求它们时才发送基本身份验证凭据
存储库端点不需要身份验证。它只会返回匿名用户可以看到的存储库(在您的情况下可能是一个空集),因此坚持WWW-Authenticate
质询的客户端(有很多,包括Microsoft Powershell)将无法工作预期(注意,curl
总是急切地发送Basic Auth凭证,这使它成为一个很好的测试工具。)
答案 2 :(得分:0)
不幸的是,根据我在文档中看到的内容,无法列出用户有权访问的所有私有存储库。
GET https://api.bitbucket.org/2.0/repositories
“返回所有公共存储库的分页列表。”根据{{3}}。
GET https://api.bitbucket.org/2.0/repositories/{owner}
“返回指定帐户或UUID拥有的所有存储库的分页列表。”根据{{3}}。
因此,不可能获得所有不一定由用户拥有的私有存储库 ,或者我找不到正确的端点,或者文档不准确。
答案 3 :(得分:0)
在blizzard's answer上扩展,这是我刚写的一个小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);
});