本文要点
- 旧 /repos/{owner}/{repo}/stargazers 列表已因隐私保护限制为管理员和协作者;不要用换账号、扩权或抓取 UI 绕过限制。
- 新端点是 GET /repos/{owner}/{repo}/stargazers/history,公开仓库可不认证访问,细粒度 token 只需 Metadata read。
- 结果按日历周从新到旧返回,days 从周日开始;没有新增 star 的周会返回零,但周与日边界不保证和 UTC 对齐。
- per_page 最多 30 周、page 最多 100;必须保存 API 版本、分页游标、抓取时间与边界样本,不能只取第一页。
- 聚合历史不提供个人身份或精确个人加星记录;取消 star 会让当前总数与历史新增量出现合理差异。
- 401/403 先查认证与端点访问规则,404 查仓库,422 查参数或滥用保护;只有 DNS、TLS、407 或连接超时才进入网络排查。
先理解变化:这是隐私安全替代,不是旧列表换名字
GitHub 官方 Changelog 说明,今年早些时候 stargazer 列表端点被限制为管理员和协作者,以减少个人数据被用于垃圾信息。新的 Star History 端点让工具继续分析仓库 star 增长,但只返回聚合历史,不暴露个人 stargazer 身份。
如果旧系统依赖 login、用户主页或 application/vnd.github.star+json 中的个人时间戳,新端点不能一比一替代这些字段。正确迁移目标应改为趋势、发布效果和仓库增长分析;继续抓取 UI、轮换账号或扩大权限去恢复个人名单,会违背这次变化的隐私边界。
先盘点旧依赖:哪些报表会出现 403、空结果或断层
搜索代码、定时任务、BI 查询和第三方集成中的 /stargazers、application/vnd.github.star+json、starred_at、用户 login 与页面抓取。为每个消费者记录仓库、用途、当前权限、保存字段、刷新频率、最后成功时间和失败响应,区分增长趋势需求与个人身份需求。
GitHub 早期限制公告明确提到,旧列表和相关 UI 可能返回空响应或 403。不要把这种权限变化误判为代理故障,也不要把历史缓存中的个人数据直接迁入新表。对没有合法、必要用途的身份字段停止采集,并按组织的数据保留规则处理已有数据。
最小请求:端点、API 版本与权限怎么核对
官方文档给出的请求是 GET /repos/{owner}/{repo}/stargazers/history,建议发送 Accept: application/vnd.github+json,并固定 X-GitHub-Api-Version: 2026-03-10。先在公开测试仓做无认证请求,再在私有测试仓用细粒度 token 验证,记录 HTTP 状态、request ID、响应 schema 与调用时间。
细粒度 GitHub App 或个人访问 token 只需要 Metadata repository permissions read;请求公开资源时可以不认证。不要为了消除 403 直接授予 Contents write 或管理员权限。若私有仓失败,先核对 token 类型、仓库范围和 Metadata read,再检查组织策略。
分页与时间边界:30 周一页不等于只有 30 周历史
返回结果按日历周从新到旧排列,翻页会继续向仓库创建周回溯;页内也是新到旧,直接按页拼接可形成连续序列。per_page 最大 30,page 最大 100。生产抓取应保存 page、per_page、API 版本和最后一周标识,并为最后一页和仓库创建周设置停止条件。
每个 week 包含 total 与从周日开始的七个 days 计数;没有新增 star 的周返回零。GitHub 明确说周与日边界不保证对齐 UTC,因此不要把 week 时间戳自行重切成 UTC 周后再与原数组逐日比较。先保存原始值,再按业务展示时区生成派生视图。
新旧数据怎么对账:取消 star 与个人时间戳必须单独处理
在同一测试仓保存旧系统最后一份合法聚合快照、新接口全部分页结果和当前 stargazer count。逐周比较趋势、发布日期附近的变化和缺口,但不要假设历史 days 简单相加一定等于当前总数:用户取消 star 后不会出现在当前计数里,而历史接口描述的是各日创建的 stars。
对需要精确个人归因的旧功能明确降级:改为周/日聚合、区间变化或当前总数,不用推测身份补齐。若接口值与仪表盘差异超过预设阈值,保留旧报表只读,标注数据截止时间,停止自动发布增长结论并人工复核时区、分页、取消 star 和仓库转移。
错误分层:权限、参数与网络不要混查
401/403 优先检查是否误调旧 stargazers 列表、token 是否有效、仓库是否在授权范围以及 Metadata read 是否生效;404 核对 owner、repo 与仓库可见性;422 可能是参数验证失败或请求被判定为滥用,先检查 per_page、page 与调用频率。扩大 token 权限、改 Base URL 或无限重试都会掩盖根因。
只有 DNS 解析失败、TLS 握手错误、代理 407、TCP 连接超时,或其他 GitHub REST 端点也同时出现连接层失败,才进入网络路径排查。可参考<a href="/resources/github-copilot-enterprise-proxy-ca-guide">GitHub Copilot 企业代理与 CA 指南</a>检查证书和出口;固定出口不能恢复被隐私策略限制的个人列表,也不能改变 API 权限。
灰度、回滚与完成标准
先在一个公开测试仓跑全分页并验证周边界,再用一个私有测试仓确认最小权限;随后让新旧聚合报表影子运行一个完整刷新周期。只有分页无缺口、趋势差异可解释、隐私字段已移除、错误率和限流稳定,才逐步切换更多仓库与下游仪表盘。
出现持续 401/403、422、分页重复或断层、时区重切导致日数据错位、无法解释的对账差异,或下游仍要求个人身份时立即停止切换。保留原始响应、API 版本、脱敏日志和旧聚合快照,回到只读报表并人工审查;如需稳定复现连接层错误,可<a href="/" target="_blank" rel="noopener noreferrer">访问 PuppyIP 官网</a>了解固定出口,但不得用于绕过 GitHub 的隐私限制。
资料来源
常见问题
GitHub Star History API 的端点是什么?
官方端点是 GET /repos/{owner}/{repo}/stargazers/history。建议使用 application/vnd.github+json,并固定 X-GitHub-Api-Version: 2026-03-10。
新接口还能返回每个 stargazer 的身份和加星时间吗?
不能。它返回按周聚合的 total 和从周日开始的七日计数,不暴露个人身份,也不能替代需要精确个人记录的旧功能。
调用 Star History API 需要什么权限?
细粒度 token 需要 Metadata repository permissions read;只请求公开仓库时可以不认证。不要为排除 403 盲目授予写权限或管理员权限。
为什么只拿到 30 周数据?
per_page 最大 30 周,必须继续请求后续 page;page 最大 100。结果按最新周到最早周排列,不能只读取第一页就当成完整历史。
历史每日计数相加为什么不等于当前 star 总数?
历史数组记录每天创建的 stars,而当前计数不包含后来取消 star 的用户;此外还要检查分页是否完整、周边界是否被错误地按 UTC 重切。
换固定 IP 能恢复旧 stargazers 个人列表吗?
不能。旧列表受 GitHub 隐私和权限规则限制。固定出口只在 DNS、TLS、407 或连接超时等明确网络证据出现时有诊断价值,不能绕过访问规则。