本项目用于获取 CNB 用户的所有仓库及其文件列表。提供了两种 API 方式:
| 组织 | 仓库数量 | 说明 |
|---|---|---|
| kfc50 | 78 个 | 主要组织 |
| kfc60 | 8 个 | 子组织 |
| kfc70 | 8 个 | 子组织 |
export CNB_TOKEN="your_token_here"
export CNB_API_ENDPOINT="https://api.cnb.cool"
接口: GET /users/{username}
用途: 获取用户的详细信息,包括仓库数量、组织数量等
curl -X GET "https://api.cnb.cool/users/cnb.ageYeGZgDeAA" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
响应字段说明:
repo_count: 总仓库数public_repo_count: 公开仓库数group_count: 组织数量接口: GET /users/{username}/groups
用途: 获取用户所属的所有组织信息
curl -X GET "https://api.cnb.cool/users/cnb.ageYeGZgDeAA/groups" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
响应字段说明:
path: 组织路径(如 kfc50)name: 组织名称all_sub_repo_count: 该组织下的总仓库数接口: GET /{slug}/-/repos
用途: 获取指定组织下的所有仓库
参数:
page_size: 每页数量(默认 20,最大 100)page: 页码filter_type: 仓库类型(private, public, secret)order_by: 排序字段(created_at, last_updated_at, stars, slug_path, forks)desc: 是否降序# 获取 kfc50 组织下的所有仓库
curl -X GET "https://api.cnb.cool/kfc50/-/repos?page_size=100" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
# 获取 kfc60 组织下的所有仓库
curl -X GET "https://api.cnb.cool/kfc60/-/repos?page_size=100" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
# 获取 kfc70 组织下的所有仓库
curl -X GET "https://api.cnb.cool/kfc70/-/repos?page_size=100" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
接口: GET /{repo}/-/git/contents/{file_path}
用途: 获取仓库的文件和目录列表
参数:
repo: 仓库路径(格式:组织/仓库名)file_path: 文件路径(根目录为空或 /)ref: 分支或 commit hash(可选)# 获取 kfc50/cool 仓库的根目录文件列表
curl -X GET "https://api.cnb.cool/kfc50/cool/-/git/contents/" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
# 获取指定分支的文件列表
curl -X GET "https://api.cnb.cool/kfc50/cool/-/git/contents/?ref=main" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
# 获取子目录的文件列表
curl -X GET "https://api.cnb.cool/kfc50/cool/-/git/contents/assets" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN"
响应字段说明:
type: 内容类型(tree=目录, blob=文件, lfs=LFS文件)name: 文件/目录名path: 完整路径entries: 子项列表(仅当 type=tree 时)接口: GET /users/{username}/repos
用途: 获取用户的仓库列表(支持分页)
必需 Headers:
accept: application/vnd.cnb.web+jsonuser-agent: Mozilla/5.0 ...(任意浏览器 user-agent)重要发现: 使用 page_size=100 可以一次获取所有公开仓库(测试获取到 94 个)!
# ⭐ 推荐:一次获取所有公开仓库(无需分页)
curl 'https://cnb.cool/users/cnb.ageYeGZgDeAA/repos?page=1&page_size=100&role=Guest&order_by=last_updated_at&desc=true' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
# 基础请求(默认每页 20 个)
curl 'https://cnb.cool/users/cnb.ageYeGZgDeAA/repos?page=1&page_size=20' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
# 带排序和筛选
curl 'https://cnb.cool/users/cnb.ageYeGZgDeAA/repos?page=1&page_size=20&role=Guest&order_by=last_updated_at&desc=true' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
# 分页获取(如果需要)
for page in 1 2 3 4 5; do
curl "https://cnb.cool/users/cnb.ageYeGZgDeAA/repos?page=$page&page_size=20&role=Guest&order_by=last_updated_at&desc=true" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
done
接口: GET /{repo}/-/git/tree-info/{commit_sha}[/{path}]
用途: 获取仓库根目录或子目录的文件列表,包含每个文件的最后提交信息
必需 Headers:
accept: application/vnd.cnb.web+jsonuser-agent: Mozilla/5.0 ...(任意浏览器 user-agent)重要说明:
# 获取仓库根目录的文件列表
# 示例:获取 kfc50/cnb-live 仓库的根目录文件列表
curl 'https://cnb.cool/kfc50/cnb-live/-/git/tree-info/7b17750c857818034741fd174a80249b131106ef' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
# 获取指定文件的信息(使用 names 参数)
curl 'https://cnb.cool/kfc50/cnb-live/-/git/tree-info/7b17750c857818034741fd174a80249b131106ef?names=README.md&names=config.json&names=keep_alive.sh' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
# 获取子目录的文件列表
# 示例:获取 screenshots222 子目录的文件列表
curl 'https://cnb.cool/kfc50/cnb-live/-/git/tree-info/652b326b3e348684dcbf53cb2206360ad4d5966d/screenshots222' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
# 获取子目录中指定文件的信息
curl 'https://cnb.cool/kfc50/cnb-live/-/git/tree-info/652b326b3e348684dcbf53cb2206360ad4d5966d/screenshots222?names=Screenshot_20260313_035535_com_huawei_browser_BrowserMainActivity.webp&names=Screenshot_20260313_040640.webp' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed
响应字段说明:
path: 文件/目录路径name: 文件/目录名last_commit.sha: 最后提交的 SHAlast_commit.commit.author: 提交作者信息last_commit.commit.message: 提交消息last_commit.commit.date: 提交时间如何获取 commit SHA:
# 方法 1:使用官方 API(需要 CNB_TOKEN)
curl -s "https://api.cnb.cool/kfc50/cnb-live/-/git/branches/main" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN" | jq '.commit.sha'
# 方法 2:从 Web API 响应中提取(如果有的话)
完整的文件浏览流程:
参数说明:
page: 页码(从 1 开始)page_size: 每页数量(默认 20)role: 角色筛选(Guest, Owner, Member 等)order_by: 排序字段(last_updated_at, created_at, stars 等)desc: 是否降序(true/false)功能: 使用官方 Open API 获取所有仓库的文件列表
使用方法:
# 确保已设置环境变量
export CNB_TOKEN="your_token_here"
# 运行脚本
chmod +x get_all_repos_files_v3.sh
./get_all_repos_files_v3.sh
输出: 生成 repos_files_report_v3.md 报告文件
#!/bin/bash
export CNB_TOKEN="your_token_here"
# 1. 获取用户信息
user_info=$(curl -s "https://api.cnb.cool/users/cnb.ageYeGZgDeAA" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN")
# 2. 获取所有组织
groups=$(curl -s "https://api.cnb.cool/users/cnb.ageYeGZgDeAA/groups" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN")
# 3. 遍历每个组织获取仓库
for group_path in $(echo "$groups" | jq -r '.[].path'); do
echo "=== 组织: $group_path ==="
# 获取组织下的仓库
repos=$(curl -s "https://api.cnb.cool/$group_path/-/repos?page_size=100" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN")
# 遍历每个仓库获取文件列表
for repo_path in $(echo "$repos" | jq -r '.[].path'); do
echo " 仓库: $repo_path"
# 获取根目录文件列表
files=$(curl -s "https://api.cnb.cool/$repo_path/-/git/contents/" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN")
echo " 文件数: $(echo "$files" | jq '[.entries[] | select(.type == "blob")] | length')"
echo " 目录数: $(echo "$files" | jq '[.entries[] | select(.type == "tree")] | length')"
done
done
#!/bin/bash
# 获取用户所有仓库(无需 token)
USERNAME="cnb.ageYeGZgDeAA"
PAGE=1
PAGE_SIZE=100
while true; do
echo "获取第 $PAGE 页..."
repos=$(curl -s "https://cnb.cool/users/$USERNAME/repos?page=$PAGE&page_size=$PAGE_SIZE&role=Guest&order_by=last_updated_at&desc=true" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed)
# 检查是否还有数据
count=$(echo "$repos" | jq 'length')
if [ "$count" -eq 0 ]; then
break
fi
# 输出仓库信息
echo "$repos" | jq -r '.[] | "\(.path) - \(.description // "无描述")"'
PAGE=$((PAGE + 1))
done
| 特性 | 官方 Open API | Web API |
|---|---|---|
| 认证 | 需要 CNB_TOKEN | 无需认证 |
| Headers | Accept + Authorization | Accept + User-Agent |
| 功能 | 完整(仓库、文件、提交等) | 仓库列表 + 文件列表(根目录+子目录) |
| 分页 | 支持 | 支持(最大 page_size=100) |
| 排序 | 支持 | 支持 |
| 文件列表 | ✅ 支持 | ✅ 支持(根目录+子目录) |
| 文件内容 | ✅ 支持 | ❌ 不支持 |
| 提交信息 | ✅ 支持 | ✅ 支持(包含在文件列表中) |
| 子目录支持 | ✅ 支持 | ✅ 支持(新发现!) |
| 适用场景 | 完整的代码管理 | 快速获取公开仓库和文件列表 |
Web API (application/vnd.cnb.web+json) 可以获取:
重要发现:
tree-info 端点非常强大,可以获取仓库的完整文件列表,而且包含每个文件的最后提交信息!contents 端点返回的信息更丰富(官方 API 不包含提交信息)。# 1. 获取用户所有仓库
repos=$(curl -s 'https://cnb.cool/users/cnb.ageYeGZgDeAA/repos?page=1&page_size=100&role=Guest&order_by=last_updated_at&desc=true' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed)
# 2. 遍历每个仓库获取文件列表
for repo_path in $(echo "$repos" | jq -r '.[].path'); do
echo "=== $repo_path ==="
# 获取仓库的 commit SHA(需要官方 API 或从其他来源获取)
# commit_sha=$(...)
# 获取文件列表
curl -s "https://cnb.cool/$repo_path/-/git/tree-info/$commit_sha" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed | jq -r '.entries[].name'
done
官方 API 限制:
Web API 限制:
分页处理:
请求频率:
repos_files_report_v3.md#!/bin/bash
# 混合方案:Web API 获取仓库列表 + 官方 API 获取 commit SHA + Web API 获取文件列表
# 只需要 CNB_TOKEN 用于获取 commit SHA
export CNB_TOKEN="your_token_here"
# 1. 使用 Web API 获取所有仓库
echo "正在获取仓库列表..."
repos=$(curl -s 'https://cnb.cool/users/cnb.ageYeGZgDeAA/repos?page=1&page_size=100&role=Guest&order_by=last_updated_at&desc=true' \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed)
echo "找到 $(echo "$repos" | jq 'length') 个仓库"
# 2. 遍历每个仓库
for repo_path in $(echo "$repos" | jq -r '.[].path'); do
echo ""
echo "=== $repo_path ==="
# 3. 使用官方 API 获取 commit SHA
commit_sha=$(curl -s "https://api.cnb.cool/$repo_path/-/git/branches/main" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN" | jq -r '.commit.sha')
if [ "$commit_sha" != "null" ] && [ -n "$commit_sha" ]; then
echo "Commit SHA: $commit_sha"
# 4. 使用 Web API 获取文件列表
files=$(curl -s "https://cnb.cool/$repo_path/-/git/tree-info/$commit_sha" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed)
echo "文件列表:"
echo "$files" | jq -r '.entries[] | " - \(.name) (最后更新: \(.last_commit.commit.date))"'
else
echo "无法获取 commit SHA"
fi
# 避免请求过快
sleep 0.2
done
#!/bin/bash
# 完全使用 Web API,但需要已知 commit SHA
# 适用于已知仓库和 commit SHA 的场景
# 示例:获取 kfc50/cnb-live 仓库的文件列表
REPO="kfc50/cnb-live"
COMMIT_SHA="7b17750c857818034741fd174a80249b131106ef"
echo "获取 $REPO 的根目录文件列表..."
curl -s "https://cnb.cool/$REPO/-/git/tree-info/$COMMIT_SHA" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed | jq -r '.entries[] | "\(.name) - \(.last_commit.commit.message | split("\n")[0])"'
echo ""
echo "获取 screenshots222 子目录的文件列表..."
curl -s "https://cnb.cool/$REPO/-/git/tree-info/652b326b3e348684dcbf53cb2206360ad4d5966d/screenshots222" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed | jq -r '.entries[] | "\(.name) - \(.last_commit.commit.date)"'
#!/bin/bash
# 递归获取仓库的所有文件(包括子目录)
# 需要 CNB_TOKEN 来获取 commit SHA
export CNB_TOKEN="your_token_here"
REPO="kfc50/cnb-live"
# 1. 获取 commit SHA
echo "获取 $REPO 的 commit SHA..."
COMMIT_SHA=$(curl -s "https://api.cnb.cool/$REPO/-/git/branches/main" \
-H "Accept: application/vnd.cnb.api+json" \
-H "Authorization: Bearer $CNB_TOKEN" | jq -r '.commit.sha')
echo "Commit SHA: $COMMIT_SHA"
# 2. 递归获取文件列表的函数
get_files_recursive() {
local repo=$1
local commit_sha=$2
local path=$3
local indent=$4
# 构建 URL
local url="https://cnb.cool/$repo/-/git/tree-info/$commit_sha"
if [ -n "$path" ]; then
url="$url/$path"
fi
# 获取文件列表
local files=$(curl -s "$url" \
-H 'accept: application/vnd.cnb.web+json' \
-H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' \
--compressed)
# 遍历每个文件/目录
echo "$files" | jq -r '.entries[] | .name' | while read name; do
local entry_path=$(echo "$files" | jq -r ".entries[] | select(.name == \"$name\") | .path")
echo "$indent$name"
# 如果是目录(通过检查是否有 last_commit 来判断,或者通过其他方式)
# 这里简化处理,实际可能需要更复杂的判断
done
}
# 3. 获取根目录文件
echo ""
echo "=== $REPO 文件列表 ==="
get_files_recursive "$REPO" "$COMMIT_SHA" "" ""
tree-info 端点,可以无需 token 获取文件列表