logo
0
0
WeChat Login

CNB 仓库文件列表获取工具

概述

本项目用于获取 CNB 用户的所有仓库及其文件列表。提供了两种 API 方式:

  1. 官方 Open API - 需要 CNB_TOKEN 认证
  2. Web API - 无需 token,只需 user-agent header

用户信息

  • 用户名: cnb.ageYeGZgDeAA
  • 昵称: AAA本地文件夹
  • 总仓库数: 102 个
  • 公开仓库数: 94 个

组织结构

组织仓库数量说明
kfc5078 个主要组织
kfc608 个子组织
kfc708 个子组织

API 方式一:官方 Open API(需要 CNB_TOKEN)

环境变量配置

export CNB_TOKEN="your_token_here"
export CNB_API_ENDPOINT="https://api.cnb.cool"

1. 获取用户信息

接口: 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: 组织数量

2. 获取用户所属组织列表

接口: 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: 该组织下的总仓库数

3. 获取组织下的仓库列表

接口: 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"

4. 获取仓库文件列表

接口: 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 时)

API 方式二:Web API(无需 token)

特点

  • 无需认证: 不需要 CNB_TOKEN
  • 无需 cookie: 只需设置 user-agent
  • 公开数据: 可以获取公开仓库信息
  • 文件列表: 可以获取仓库文件列表(新发现!)
  • 提交信息: 包含每个文件的最后提交信息

1. 获取用户仓库列表

接口: GET /users/{username}/repos

用途: 获取用户的仓库列表(支持分页)

必需 Headers:

  • accept: application/vnd.cnb.web+json
  • user-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

2. 获取仓库文件列表(⭐ 新发现!)

接口: GET /{repo}/-/git/tree-info/{commit_sha}[/{path}]

用途: 获取仓库根目录或子目录的文件列表,包含每个文件的最后提交信息

必需 Headers:

  • accept: application/vnd.cnb.web+json
  • user-agent: Mozilla/5.0 ...(任意浏览器 user-agent)

重要说明:

  • 无需 token 认证!
  • 无需 cookie!
  • 需要先获取仓库的 commit SHA(可以通过官方 API 或 Web API 获取)
  • 返回每个文件的详细信息,包括最后提交的作者、时间、消息等
  • 支持获取根目录和任意子目录的文件列表

2.1 获取根目录文件列表

# 获取仓库根目录的文件列表
# 示例:获取 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

2.2 获取子目录文件列表

# 获取子目录的文件列表
# 示例:获取 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: 最后提交的 SHA
  • last_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 响应中提取(如果有的话)

完整的文件浏览流程:

  1. 获取根目录的 commit SHA(通过官方 API)
  2. 使用 Web API 获取根目录文件列表
  3. 对于子目录,使用相同的 commit SHA + 子目录路径
  4. 可以递归获取任意深度的子目录文件列表

参数说明:

  • page: 页码(从 1 开始)
  • page_size: 每页数量(默认 20)
  • role: 角色筛选(Guest, Owner, Member 等)
  • order_by: 排序字段(last_updated_at, created_at, stars 等)
  • desc: 是否降序(true/false)

脚本文件

1. get_all_repos_files_v3.sh

功能: 使用官方 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 报告文件


完整示例:获取所有仓库文件列表

使用官方 API

#!/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

使用 Web API(无需 token)

#!/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

API 对比

特性官方 Open APIWeb API
认证需要 CNB_TOKEN无需认证
HeadersAccept + AuthorizationAccept + User-Agent
功能完整(仓库、文件、提交等)仓库列表 + 文件列表(根目录+子目录)
分页支持支持(最大 page_size=100)
排序支持支持
文件列表✅ 支持✅ 支持(根目录+子目录)
文件内容✅ 支持❌ 不支持
提交信息✅ 支持✅ 支持(包含在文件列表中)
子目录支持✅ 支持✅ 支持(新发现!)
适用场景完整的代码管理快速获取公开仓库和文件列表

Web API 能力说明

Web API (application/vnd.cnb.web+json) 可以获取:

  • ✅ 用户仓库列表
  • ✅ 仓库基本信息(名称、描述、语言等)
  • ✅ 仓库根目录文件列表(通过 tree-info 端点)
  • ✅ 仓库子目录文件列表(通过 tree-info/{path} 端点)
  • ✅ 每个文件的最后提交信息(作者、时间、消息)
  • ❌ 文件内容(需要使用官方 API)

重要发现:

  1. Web API 的 tree-info 端点非常强大,可以获取仓库的完整文件列表,而且包含每个文件的最后提交信息!
  2. 支持子目录路径,可以获取任意深度的子目录文件列表!
  3. 这比官方 API 的 contents 端点返回的信息更丰富(官方 API 不包含提交信息)。

完整工作流程(无需 token)

# 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

注意事项

  1. 官方 API 限制:

    • 需要有效的 CNB_TOKEN
    • Token 需要有相应的权限(repo-code:r 等)
    • 建议添加适当的请求间隔避免被限流
  2. Web API 限制:

    • 只能获取公开仓库信息
    • 不能获取文件内容
    • 建议添加 user-agent 模拟浏览器请求
  3. 分页处理:

    • 官方 API 默认每页 20 条,最大 100 条
    • Web API 默认每页 20 条
    • 需要循环获取所有页面
  4. 请求频率:

    • 建议每次请求间隔 0.2-0.5 秒
    • 避免并发请求过多导致被限流

生成的报告

  • 文件名: repos_files_report_v3.md
  • 内容: 包含所有 94 个公开仓库的详细文件列表
  • 格式: Markdown 表格格式,便于阅读和分析

完整示例:使用 Web API 获取所有仓库文件列表(无需 token)

方案一:混合使用 Web API + 官方 API

#!/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

方案二:完全使用 Web API(需要已知 commit SHA)

#!/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" "" ""

更新日志

  • 2026-05-19: 初始版本,成功获取 94 个公开仓库的文件列表
  • 2026-05-19: 发现 Web API 的 tree-info 端点,可以无需 token 获取文件列表
  • 使用官方 Open API 和 Web API 两种方式验证

About

cnb搜索自己的仓库代码

Language
TypeScript47.5%
HTML29.4%
JavaScript7.5%
Shell6.3%
Others9.3%