从 GitHub API 查找用户的总贡献

34

我正试图从GitHub提取以下信息,适用于任何用户。

Example user contributions

GitHub REST API中是否有一种方法/接口可以直接获取这些信息?

8个回答

31

2019年的答案,使用GitHub API V4

首先前往GitHub申请一个token:https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line。第7步,选择作用域read:user

cUrl

curl -H "Authorization: bearer token" -X POST -d '{"query":"query {\n  user(login: \"MeiK2333\") {\n    name\n    contributionsCollection {\n      contributionCalendar {\n        colors\n        totalContributions\n        weeks {\n          contributionDays {\n            color\n            contributionCount\n            date\n            weekday\n          }\n          firstDay\n        }\n      }\n    }\n  }\n}"}' https://api.github.com/graphql

JavaScript

async function getContributions(token, username) {
    const headers = {
        'Authorization': `bearer ${token}`,
    }
    const body = {
        "query": `query {
            user(login: "${username}") {
              name
              contributionsCollection {
                contributionCalendar {
                  colors
                  totalContributions
                  weeks {
                    contributionDays {
                      color
                      contributionCount
                      date
                      weekday
                    }
                    firstDay
                  }
                }
              }
            }
          }`
    }
    const response = await fetch('https://api.github.com/graphql', { method: 'POST', body: JSON.stringify(body), headers: headers })
    const data = await response.json()
    return data
}

const data = await getContributions('token', 'MeiK2333')
console.log(data)

1
请注意:如果您只想知道已认证用户的总贡献,{"query": "query {viewer {contributionsCollection {contributionCalendar {totalContributions}}}}"}就足够了。 - hakatashi
你能解释一下为什么你使用了POST方法,而不是GET方法吗? - Anoushk
@Maverick,这是POST请求,因为该请求使用了GraphQL。请参考此链接 - https://dev59.com/i1IH5IYBdhLWcg3wjfm4 - YuliaP stands with Ukraine

15

是的,您可以使用新的graphql API轻松完成这个操作。

请查看资源管理器:https://developer.github.com/v4/explorer/

在那里,您可以看到用户的边缘贡献集合。您可以获取重建日历所需的所有信息。

我已经包含了一个完整的示例,并且资源管理器文档甚至可以进一步指导您。

具体来说,query.user.contributionsCollection.contributionsCalendar.totalContributions就是您要找的内容。

请复制/粘贴以下内容到资源管理器中,您将看到我过去一年的贡献历史记录。

query { 
  user(login: "qhenkart") {
    email
    createdAt
    contributionsCollection(from: "2019-09-28T23:05:23Z", to: "2020-09-28T23:05:23Z") {
      contributionCalendar {
        totalContributions
        weeks {
          contributionDays {
            weekday
            date 
            contributionCount 
            color
          }
        }
        months  {
          name
            year
            firstDay 
          totalWeeks 
          
        }
      }
    }
  }
  
}

12

要加载包含所有贡献的svg,您可以在html页面中使用以下代码

<img src="https://ghchart.rshah.org/username" alt="Name Your Github chart">

enter image description here

要自定义颜色,您只需这样做

 <img src="https://ghchart.rshah.org/HEXCOLORCODE/username" alt="Name Your Github chart">

HEXCOLORCODE = 17A2B8 在此输入图像描述


5

您可以通过添加to URL参数从https://github.com/users/<USER>/contributions获取SVG日历,例如:

https://github.com/users/bertrandmartel/contributions?to=2016-12-31

你可以使用基本的XML解析器来对SVG中的所有贡献进行求和。
以下是使用的2016年示例:
curl -s "https://github.com/users/bertrandmartel/contributions?to=2016-12-31" | \
     xmlstarlet sel -t -v "sum(//svg/g/g/rect/@data-count)"

4
您可以使用GitHub事件API来实现此功能:

示例(Node.js)

const got = require('got')

async function getEvents(username) {
  const events = []
  let page = 1

  do {
    const url = `https://api.github.com/users/${username}/events?page=${page}`
    var { body } = await got(url, {
      json: true
    })
    page++
    events.push(...body)
  } while(!body.length)

  return events
}

(async () => {
  const events = await getEvents('handtrix')

  console.log('Overall Events', events.length)
  console.log('PullRequests', events.filter(event => event.type === 'PullRequestEvent').length)
  console.log('Forks', events.filter(event => event.type === 'ForkEvent').length)
  console.log('Issues', events.filter(event => event.type === 'IssuesEvent').length)
  console.log('Reviews', events.filter(event => event.type === 'PullRequestReviewEvent').length)
})()

示例(JavaScript)

async function getEvents(username) {
  const events = []
  let page = 1

  do {
    const url = `https://api.github.com/users/${username}/events?page=${page}`
    var body = await fetch(url).then(res => res.json())
    page++
    events.push(...body)
  } while(!body.length)

  return events
}

(async () => {
  const events = await getEvents('handtrix')

  console.log('Overall Events', events.length)
  console.log('PullRequests', events.filter(event => event.type === 'PullRequestEvent').length)
  console.log('Forks', events.filter(event => event.type === 'ForkEvent').length)
  console.log('Issues', events.filter(event => event.type === 'IssuesEvent').length)
  console.log('Reviews', events.filter(event => event.type === 'PullRequestReviewEvent').length)
})()

Documentation


7
请注意,使用此功能只能返回最近90天的数据。 - Nef10

1

0
您可以使用此函数从客户端中提取去年的贡献:
function getContributions(){
    const svgGraph = document.getElementsByClassName('js-calendar-graph')[0];
    const daysRects = svgGraph.getElementsByClassName('day');
    const days = [];

    for (let d of daysRects){
        days.push({
           date: d.getAttribute('data-date'),
           count: d.getAttribute('data-count')
        }); 
    }

    return days;    
}

我还编写了一个小的节点模块,可以“提取”贡献
@simonwep/github-contributions

也许这会对你有所帮助(即使我晚了4年)


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接