GitHub限速防止用户提交历史logging的返回

我写了代码来返回用户已经提交给GitHub的“连胜”(连续多less天)。 不幸的是,它是recursion地制作GitHub API请求,最终很快就会遇到速度限制问题(甚至是API令牌)。 有没有更好的方法来检索这些信息?

本质上,我正在寻找的是显示在用户帐户页面上的“绿色方块”数据:

在这里输入图像描述

我的示例代码正在进入速率限制:

const express = require('express'); const request = require('request'); const moment = require('moment'); require('dotenv').config(); const app = express(); const port = 5000; app.get('/streak/:user', async function (req, res) { const yesterdaysDate = moment().subtract(1, 'day').format('YYYY-MM-DD'); try { const streakCountTotal = await checkUserCommitForDate(req.params.user, yesterdaysDate); res.send({ streakCountTotal }); } catch (error) { console.log(error); res.sendStatus(500); } }); async function checkUserCommitForDate(user, date) { const authorOptions = { url: `https://api.github.com/search/commits?q=author:${user}+author-date:${date}`, headers: { 'User-Agent': 'request', 'Accept': 'application/vnd.github.cloak-preview', 'Authorization': `token ${process.env.GITHUB_SECRET_ACCESS_TOKEN}` } }; const committerOptions = { url: `https://api.github.com/search/commits?q=committer:${user}+committer-date:${date}`, headers: { 'User-Agent': 'request', 'Accept': 'application/vnd.github.cloak-preview', 'Authorization': `token ${process.env.GITHUB_SECRET_ACCESS_TOKEN}` } }; const githubAuthorResponse = await promisify(request)(authorOptions); const githubCommitterResponse = await promisify(request)(committerOptions); const githubAuthorCount = Number(JSON.parse(githubAuthorResponse.body).total_count); const githubCommitterCount = Number(JSON.parse(githubCommitterResponse.body).total_count); if (isNaN(githubAuthorCount) || isNaN(githubAuthorCount)) { throw new Error('GitHub contribution count was not a number. Body of response was:', githubAuthorResponse.body); } else if (githubAuthorCount + githubCommitterCount > 0) { const previousDaysDate = moment(date).subtract(1, 'day').format('YYYY-MM-DD'); let streakCounter = await checkUserCommitForDate(user, previousDaysDate); streakCounter++; console.log('streakCounter', streakCounter); return streakCounter; } else { return 0; } } function promisify(fn) { return function (...args) { return new Promise((resolve, reject) => { fn(...args, (err, result) => { if (err) { console.log('error', err); return reject(err); } resolve(result); }); }); }; }; app.listen(port, function () { console.log('listening on port', port); }); 

您可以从configuration文件页面中使用的svg发布日历数据中提取发言清单:

https://github.com/users/bertrandmartel/contributions

parsingxml非常简单,用户贡献统计信息只能使用一个请求来处理。 以下是使用cheerioparsingxml的nodeJS示例:

 const express = require('express'); const request = require('request'); const cheerio = require('cheerio') const app = express(); const port = 5000; app.get('/streak/:user', function(req, res) { request('https://github.com/users/' + req.params.user + '/contributions', function(error, response, body) { if (error) { console.log(error); res.sendStatus(500); return; } processContrib(res, body); }); }); function processContrib(res, body) { var $ = cheerio.load(body); var data = []; $('svg').find('rect').each(function(index, element) { data.push({ count: parseInt($(element).attr('data-count')), date: new Date($(element).attr('data-date')) }) }); var yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); data = data.sort(function(a, b) { return new Date(b.date) - new Date(a.date); }).filter(function(el) { return el.date.getTime() <= yesterday.getTime(); }); var streakCount = 0; for (var i = 0; i < data.length; i++) { if (data[i].count == 0) { break; } streakCount++ } res.status(200).json({ streak: streakCount }); } app.listen(port, function() { console.log('listening on port', port); }); 

请注意,您也可以处理这里显示的贡献统计信息

需要注意的是,它并没有使用官方的API,而是被认为是日历API上的贡献的事件可能会发生变化。 使用API​​,您需要重新定义与此处定义的相同的条件