获取每年 GitHub 用户贡献的数量

Get number of yearly GitHub user contributions

GitHub 上的用户个人资料显示用户在过去一年中做出的贡献数量:

我想在我的网站上显示此信息,最好不要引入任何类型的后端。我在几个地方找过它。 /users/(me)/ 中未列出任何内容。除了抓取页面源代码之外,有没有办法检索此信息?我没有看到任何记录...

你看过GithubAPI吗?使用它,您可以 运行 来自您的 js 文件的请求,而无需实现任何后端。

为了您的目的,我认为您可以使用以下请求 https://api.github.com/users/yourUserName/events。结果,您将获得与您的用户名相关的事件列表。

例如

    [
      {
        "id": "xxxxxxx",
        "type": "PushEvent",
        "actor": {.......},
        "repo": {......},
        "payload": {.......},
        "public": true,
        "created_at": "2016-11-17T21:33:15Z"
      },
      .....
    ]

您应该浏览列表并过滤类型 = PushEvent 和 created_at = lastYear。

希望对您有所帮助!


更新:该服务仅提供过去 3 个月的结果,因此其他可能性是检查 (users/username/repos),然后检查对它们的提交 (repos/username/repoName/commits)

我已经决定使用 PHP 解析我的个人资料页面的 HTML。我首先为我的个人资料页面下载 HTML:

$githubProfile = file_get_contents('https://github.com/controversial');

接下来我找到短语contributions in the last year在页面上的位置。白色 space 在 contributionsin the last year 之间很奇怪,所以我使用正则表达式来匹配任意数量的 space.

$contributionsIndex = preg_match(
  '/contributions\s+in the last year/',
  $githubProfile,
  $matches,
  PREG_OFFSET_CAPTURE
);
$index = $matches[0][1];

最后,我从这一点向后迭代,直到遇到一个既不是数字也不是数字中的逗号的字符。一旦这个条件变为假,我就知道我找到了数字的开头:

$endIndex = $index;

while (is_numeric($githubProfile[$index-2]) || $githubProfile[$index-2] == ',')
  $index--;

$contributionsCount = substr($githubProfile, $index-1, $endIndex-$index);

最后,我回显了数字(没有逗号)

echo(str_replace(',', '', $contributionsCount));

最后,我使用 JavaScript 页面中的 AJAX 调用从 PHP 脚本中获取值。

function get(url, callback) {
  /* eslint-disable no-console */
  const xhr = new XMLHttpRequest();
  xhr.open('GET', url);
  xhr.onload = e => (callback || console.log)(e.target.responseText);
  xhr.onerror = () => console.log('error');
  xhr.send();
  /* eslint-enable no-console */
}

// Fill in GitHub contributions count
get('contributions-count.php', (resp) => {
  document.getElementById('gh-contributions-count').innerText = resp;
});

我相信这将在未来使用 GitHub 的 GraphQL API 更干净地完成,但这仍处于预览阶段。

也可以使用 xml 解析器解析 svg 日历数据,然后对所有 data-count 条目求和。为避免 CORS 问题,您可以使用类似 urlreq living on http://urlreq.appspot.com/req 的代理:

const user = 'controversial';

fetch('https://urlreq.appspot.com/req?method=GET&url=https://github.com/users/' + user + '/contributions')
  .then(function(response) {
    return response.text();
  })
  .then(function(text) {
    xmlDoc = new DOMParser().parseFromString(text, 'text/xml');
    var nodes = xmlDoc.getElementsByTagName('rect');
    var count = 0;
    for (var i = 0; i < nodes.length; i++) {
      count += parseInt(nodes[i].getAttribute('data-count'));
    }
    console.log('contributions count : ' + count);
  })
  .catch(function(error) {
    console.log('Request failed', error)
  });

另一个使用命令行的例子 & can be found here