How do I make an API call to GitHub for a user'

2019-03-16 15:17发布

问题:

On GitHub, a user can have pinned repositories.

There's also the Repositories section of the API describing how to make requests that involve repos. You can also get information about the orgs a user is part of as described in another answer (which can be pinned).

However, I want to access a user's pinned repos. For example given the following profile:

I'd like to be able to do the following:

$ curl -s <some endpoint with some parameters> | <some pipeline with some filtering>
str
liffy_diffy
spiralify
micro-twitter
kit
xdoc

So I'm wondering:

  • What is the endpoint and parameters do I need to get a user's pinned repos?

I was able to use the nokogiri gem to parse the html. However, it seems like I should be api to accomplish the same thing with a simple HTTP request:

$ ./get_user_pinned_repos mbigras
str
liffy_diffy
spiralify
micro-twitter
kit
xdoc

Code:

#!/usr/bin/env ruby
# get a user's pinned repos
require 'rubygems'
require 'nokogiri'
require 'open-uri'

if ARGV.length != 1
  STDERR.puts "usage: get_user_pinned_repos <username>"
  exit 1
end

username = ARGV.first
profile_url = "https://github.com/#{username}"
page = Nokogiri::HTML(open(profile_url))
page.css("span.repo").each { |repo| puts repo.text }

回答1:

You can get pinned repository using Github GrapQL API :

{
  repositoryOwner(login: "bertrandmartel") {
    ... on User {
      pinnedRepositories(first:6) {
        edges {
          node {
            name
          }
        }
      }
    }
  }
}

Try it in the explorer

You can request it with curl with :

curl -H "Authorization: bearer TOKEN" --data-binary @- https://api.github.com/graphql <<EOF
{
 "query": "query { repositoryOwner(login: \"bertrandmartel\") { ... on User { pinnedRepositories(first:6) { edges { node { name } } } } } }"
}
EOF

You can parse the JSON output with jq JSON parser :

username=bertrandmartel
curl -s -H "Authorization: bearer TOKEN" \
     -d '{ "query": "query { repositoryOwner(login: \"'"$username"'\") { ... on User { pinnedRepositories(first:6) { edges { node { name } } } } } }" }' \
     https://api.github.com/graphql | \
     jq -r '.data.repositoryOwner.pinnedRepositories.edges[].node.name'