热力图从 GitHub 抓数据,私有仓库不算
首页放了个提交热力图,数据从 GitHub 拉。做法是抓它个人主页上那个公开的事件接口,解析出每天的提交数。
上线后我自己看了一眼 GitHub,发现数字对不上:主页上明明更密。
原因是匿名抓取只能拿到公开贡献。我有几个练习放在私有仓库里,接口根本不返回。GitHub 上自己登录着能看到,是因为登录状态下的页面走的是 GraphQL,带鉴权。
要一致只能也走 GraphQL:
const query = `{
user(login: "hsgjq") {
contributionsCollection { contributionCalendar { weeks { days { contributionCount date } } } }
}
}`
配一个令牌,放在服务端环境变量里。这样首页显示的就和我自己看到的一致了。
代价有三条,我衡量过才做:
令牌会过期。classic 令牌最长一年,到期那天接口 401,热力图变空白。所以我加了降级:抓不到就显示"暂时无法获取",而不是让整页报错。这条比错误处理本身重要——首页不能因为一个装饰模块挂掉。
多了一次外部依赖。GitHub 挂了、限流了、接口改了,都会影响我的首页。所以这个请求设了超时(3 秒),并且结果缓存一小时,不做实时。
隐私。用带权限的令牌去查公开数据,我给它的最小权限是只读 public 信息,不给 repo 权限。
限流那条要单独记:匿名请求每小时 60 次,带令牌 5000 次。我一开始没缓存,页面每次刷新都打一次,测试时一小时就把配额用完了。