随机贡献者选择器Skill random-contributor

此技能用于从GitHub公共仓库中随机选择一个贡献者,适用于抽样、任务分配、公平委派等场景。关键词:GitHub API、随机选择、贡献者管理、自动化工具、DevOps。

DevOps 0 次安装 0 次浏览 更新于 3/22/2026

name: random-contributor description: 使用GitHub API或仓库页面(无需认证,适用于公共仓库)从GitHub仓库中选择一个随机贡献者。

随机贡献者技能

目的

  • 从公共GitHub仓库中选择一个均匀随机的贡献者。适用于抽样、致谢、委派或在贡献者之间公平分配任务。

功能

  • 使用GitHub REST API(公共端点)列出仓库的贡献者(处理分页)。
  • 如果API速率限制或CORS阻止API使用,则回退到爬取仓库的贡献者页面。
  • 返回贡献者信息:登录名、姓名(如果可用)、头像URL、个人资料URL、贡献数量。

使用场景

  • 选择随机的维护者或贡献者,用于诸如“谁应该审查”或“谁应该被致谢”的任务。
  • 仅应用于公共仓库。

前提条件

  • Bash示例需要curljq,或JS示例需要Node.js 18+。
  • 可选的GitHub令牌(GH_TOKEN)可增加速率限制;对于小型仓库,无需令牌也能工作。

示例

Bash(使用GitHub API;分页,每页100条):

REPO_OWNER=besoeasy
REPO_NAME=open-skills

# 获取贡献者列表(公共API)。使用可选的GH_TOKEN环境变量以提高速率限制。
AUTH_HEADER=""
if [ -n "${GH_TOKEN:-}" ]; then
  AUTH_HEADER="-H \"Authorization: token ${GH_TOKEN}\""
fi

# 获取贡献者(第一页);对于大型仓库,您需要分页。这里我们使用简单的分页循环。
contributors=()
page=1
while true; do
  out=$(eval "curl -fsS ${AUTH_HEADER} \"https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/contributors?per_page=100&page=${page}\"")
  count=$(echo "$out" | jq 'length')
  if [ "$count" -eq 0 ]; then break; fi
  logins=$(echo "$out" | jq -r '.[].login')
  while read -r l; do contributors+=("$l"); done <<< "$logins"
  if [ "$count" -lt 100 ]; then break; fi
  page=$((page+1))
done

# 随机选择
idx=$((RANDOM % ${#contributors[@]}))
selected=${contributors[$idx]}
echo "$selected"

Node.js(推荐:使用原生fetch并处理分页):

async function getRandomContributor(owner, repo, token) {
  const headers = {};
  if (token) headers['Authorization'] = `token ${token}`;

  let page = 1;
  const per = 100;
  const all = [];

  while (true) {
    const url = `https://api.github.com/repos/${owner}/${repo}/contributors?per_page=${per}&page=${page}`;
    const res = await fetch(url, { headers });
    if (!res.ok) break;
    const data = await res.json();
    if (!Array.isArray(data) || data.length === 0) break;
    all.push(...data);
    if (data.length < per) break;
    page++;
  }

  if (!all.length) return null;
  const pick = all[Math.floor(Math.random() * all.length)];
  return {
    login: pick.login,
    avatar: pick.avatar_url,
    profile: pick.html_url,
    contributions: pick.contributions
  };
}

// 用法:
// getRandomContributor('besoeasy','open-skills', process.env.GH_TOKEN).then(console.log)

代理提示

“为{owner}/{repo}找到一个随机贡献者。使用GitHub API;如果API速率限制阻止您,则回退到爬取贡献者页面。返回JSON:{login, name?, avatar, profile, contributions}。”

注意事项

  • 对于非常大的仓库(>1000贡献者),考虑使用流式或水库采样,而不是一次性获取所有贡献者。
  • 尊重GitHub API速率限制;提供使用GH_TOKEN的选项以增加限制。
  • 仅限公共仓库;请勿尝试在没有适当凭证的情况下访问私有仓库。

另请参阅

  • skills/check-crypto-address-balance(API使用模式示例)