For a small project I’m working on, I needed access to GitHub, to investigate some repositories via code. Luckily, GitHub have an extremely extensive API. Furthermore, they even provide a .Net library (via a NuGet package) named Octokit.Net, to easily access that API:
Install-Package Octokit
Let’s see some samples. We’ll start by creating a new GitHubClient object:
var github = new GitHubClient(new ProductHeaderValue(TestGitHutAPI));
If you plan to use the API internally (using your own account, and not for your end-users), you can create a Personal access token in your profile at https://github.com/settings/applications, and then use that token as follow:
github.Credentials = new Credentials("Token goes here");
Alternatively, you can register your application in GitHub, and use the details to authorize your end-users via a regular OAuth2 flow:
var oauthLoginRequest = new OauthLoginRequest(clientId);
oauthLoginRequest.Scopes.Add(user);
oauthLoginRequest.Scopes.Add(public_repo);
var loginUrl = github.Oauth.GetGitHubLoginUrl(oauthLoginRequest); // Redirect your users to the LoginUrl
// You will receive thecodeused below in the Redirect URI configured in your GitHub application
var oauthTokenRequest = new OauthTokenRequest(clientId,clientSecret,code);
var oauthToken = await github.Oauth.CreateAccessToken(oauthTokenRequest);
github.Credentials = new Credentials(oauthToken.AccessToken);
We are now ready to do something with the GitHubClient. Let’s do a search for repositories:
var searchRepositoriesRequest = new SearchRepositoriesRequest("nosql")
{
Language = Language.CSharp,
Fork = ForkQualifier.ExcludeForks,
Sort = RepoSearchSort.Stars,
Order = SortDirection.Descending,
PerPage = 10
};
SearchRepositoryResult searchRepositoryResult = await github.Search.SearchRepo(searchRepositoriesRequest);
This will search for repositories that have the term NoSQL in them, that use the C# language. We will get the first 10 repositories, based on a descending number of Stars, and we’ll not get any Forked repositories. This is quite straight forward. Let’s see another sample, this one of searching for files inside a given repository:
var codeSearch = new SearchCodeRequest(".csproj")
{
Repo = repository.FullName,
In = new[] {CodeInQualifier.Path}
};
var codeResult = await github.Search.SearchCode(codeSearch);
This will search for all files that have CSPROJ in their path (which will result in all the C# Project files) within the given repository (based on the repository’s FullName).
Lastly, let’s see how we can retrieve the content of a file that we received in the above search. We’ll need the Login of the repository’s owner, the repository name, and the file’s SHA (which functions as a version/id for the purpose of this request):
var blob = await github.GitDatabase.Blob.Get(repo.Owner.Login, repo.Name, packageFile.Sha);
var contentBase64 = blob.Content;
var content = Convert.FromBase64String(contentBase64);
The Octokit.Net package is very comprehensive, and provides access to the following information in GitHub:
- Activities
- Deployment
- Gist
- GitDatabase
- Issues
- Notifications
- Organizations
- Releases
- Repositories
- Search
- Users
You can find the GitHub API documentation here: https://developer.github.com/v3/