octonode is a library for nodejs to access the github v3 api
npm install octonode
var github = require('octonode');
// Then we instanciate a client with or without a token (as show in a later section)
var ghme = client.me();
var ghuser = client.user('pksunkara');
var ghrepo = client.repo('pksunkara/hub');
var ghorg = client.org('flatiron');
var ghgist = client.gist();
var ghteam = client.team(37);
var ghsearch = client.search();var client = github.client();
client.get('/users/pksunkara', function (err, status, body) {
console.log(body); //json object
});var client = github.client('someaccesstoken');
client.get('/user', function (err, status, body) {
console.log(body); //json object
});var client = github.client({
username: 'pksunkara',
password: 'password'
});
client.get('/user', function (err, status, body) {
console.log(body); //json object
});var client = github.client({
id: 'abcdefghijklmno',
secret: 'abcdefghijk'
});
client.get('/user', function (err, status, body) {
console.log(body); //json object
});Many of the below use cases use parts of the above code
github.auth.config({
username: 'pksunkara',
password: 'password'
}).login(['user', 'repo', 'gist'], function (err, id, token) {
console.log(id, token);
});github.auth.config({
username: 'pksunkara',
password: 'password'
}).revoke(id, function (err) {
if (err) throw err;
});// Web application which authenticates to github
var http = require('http')
, url = require('url')
, qs = require('querystring')
, github = require('octonode');
// Build the authorization config and url
var auth_url = github.auth.config({
id: 'mygithubclientid',
secret: 'mygithubclientsecret'
}).login(['user', 'repo', 'gist']);
// Store info to verify against CSRF
var state = auth_url.match(/&state=([0-9a-z]{32})/i);
// Web server
http.createServer(function (req, res) {
uri = url.parse(req.url);
// Redirect to github login
if (uri.pathname=='/login') {
res.writeHead(301, {'Content-Type': 'text/plain', 'Location': auth_url})
res.end('Redirecting to ' + auth_url);
}
// Callback url from github login
else if (uri.pathname=='/auth') {
var values = qs.parse(uri.query);
// Check against CSRF attacks
if (!state || state[1] != values.state) {
res.writeHead(403, {'Content-Type': 'text/plain'});
res.end('');
} else {
github.auth.login(values.code, function (err, token) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(token);
});
}
} else {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.end('');
}
}).listen(3000);
console.log('Server started on 3000');You can also check your rate limit status by calling the following.
client.limit(function (err, left, max) {
console.log(left); // 4999
console.log(max); // 5000
});All the callbacks for the following will take first an error argument, then a data argument, like this:
ghme.info(function(err, data) {
console.log("error: " + err);
console.log("data: " + data);
});Token/Credentials required for the following:
ghme.info(callback); //jsonghme.update({
"name": "monalisa octocat",
"email": "octocat@github.com",
}, callback);ghme.emails(callback); //array of emailsghme.emails(['new1@ma.il', 'new2@ma.il'], callback); //array of emails
ghme.emails('new@ma.il', callback); //array of emailsghme.emails(['new1@ma.il', 'new2@ma.il']);
ghme.emails('new@ma.il');ghme.followers(callback); //array of github usersghme.following(callback); //array of github usersghme.following('marak', callback); //booleanghme.follow('marak');ghme.unfollow('marak');ghme.keys(callback); //array of keysghme.keys(1, callback); //keyghme.keys({"title":"laptop", "key":"ssh-rsa AAA..."}, callback); //keyghme.keys(1, {"title":"desktop", "key":"ssh-rsa AAA..."}, callback); //keyghme.keys(1);ghme.orgs(callback); // array of orgsghme.repos(callback); //array of reposghme.repos({
"name": "Hello-World",
"description": "This is your first repo",
}, callback); //repoghme.fork('pksunkara/hub', callback); //forked repoNo token required for the following
ghuser.info(callback); //jsonghuser.followers(callback); //array of github usersghuser.following(callback); //array of github usersghuser.orgs(callback); //array of organizationsghrepo.info(callback); //jsonghrepo.collaborators(callback); //array of github usersghrepo.collaborators('marak', callback); //booleanghrepo.commits(callback); //array of commitsghrepo.tags(callback); //array of tagsghrepo.languages(callback); //array of languagesghrepo.contributors(callback); //array of github usersghrepo.branches(callback); //array of branchesIssues are arranged in pages. The page argument is optional and is used to specify which page of issues to retrieve. The perPage argument is also optional and is used to specify how many issues per page. Alternatively, you can pass in parameters as an object.
ghrepo.issues(page, perPage, callback); //array of issues
ghrepo.issues(1, 100, callback); //array of first 100 issues
ghrepo.issues(10, callback); //array of 30 issues from page 10
ghrepo.issues(callback); //array of first 30 issues
ghrepo.issues({
page: 2,
per_page: 100,
state: 'closed'
}, callback); //array of issues from page 2 of all closed issuesghrepo.readme(callback); //file
ghrepo.readme('v0.1.0', callback); //fileghrepo.contents('lib/index.js', callback); //path
ghrepo.contents('lib/index.js', 'v0.1.0', callback); //pathghrepo.archive('tarball', callback); //link to archive
ghrepo.archive('zipball', 'v0.1.0', callback); //link to archiveghrepo.blob('18293abcd72', callback); //blobghrepo.stargazers(1, 100, callback); //array of users
ghrepo.stargazers(10, callback); //array of users
ghrepo.stargazers(callback); //array of usersghrepo.teams(callback); //array of teamsghrepo.tree('18293abcd72', callback); //tree
ghrepo.tree('18293abcd72', true, callback); //recursive treeghrepo.destroy();ghrepo.statuses('master', callback); // array of statusesghrepo.status('18e129c213848c7f239b93fe5c67971a64f183ff', {
"state": "success",
"target_url": "http://ci.mycompany.com/job/hub/3",
"description": "Build success."
}, callback); // created statusghorg.info(callback); //jsonghorg.update({
blog: 'https://blog.com'
}, callback); // orgghorg.repos(callback); //array of reposghorg.repos({
name: 'Hello-world',
description: 'My first world program'
}, callback); //repoghorg.teams(callback); //array of teamsghorg.members(callback); //array of github usersghorg.member('pksunkara', callback); //booleanghgist.list(callback); //array of gistsghgist.public(callback); //array of gistsghgist.starred(callback); //array of gistsghgist.user('pksunkara', callback); //array of gistsghgist.get(37, callback); //gistghgist.create({
description: "the description",
files: { ... }
}), callback); //gistghgist.edit(37, {
description: "hello gist"
}, callback); //gistghgist.delete(37);ghgist.fork(37, callback); //gistghgist.star(37);ghgist.unstar(37);ghgist.check(37); //booleanghgist.comments(37, callback); //array of commentsghgist.comments(37, {
body: "Just commenting"
}, callback); //commentghgist.comment(1, callback); //commentghgist.comment(1, {
body: "lol at commenting"
}, callback); //commentghgist.comment(1);ghteam.info(callback); //jsonghteam.members(callback); //array of github usersghteam.member('pksunkara'); //booleanghsearch.issues('pksunkara/hub', 'open', 'git', callback); //array of issuesghsearch.repos('git', 'javascript', 1, callback); //array of repositoriesghsearch.users('git', callback); //array of usersghsearch.emails('pavan.sss1991@gmail.com', callback); //usernpm test
If you like this project, please watch this and follow me.
Here is a list of Contributors
The following method names use underscore as an example. The library contains camel cased method names.
// public repos for unauthenticated, private and public for authenticated
me.get_watched_repositories(callback);
me.is_watching('repo', callback);
me.start_watching('repo', callback);
me.stop_watching('repo', callback);
me.get_issues(params, callback);
// organization data
var org = octonode.Organization('bulletjs');
org.update(dict_with_update_properties, callback);
org.add_member('user', 'team', callback);
org.remove_member('user', callback);
org.get_public_members(callback);
org.is_public_member('user', callback);
org.make_member_public('user', callback);
org.conceal_member('user', callback);
org.get_team('team', callback);
org.create_team({name:'', repo_names:'', permission:''}, callback);
org.edit_team({name:'', permission:''}, callback);
org.delete_team('name', callback);
org.get_team_members('team', callback);
org.get_team_member('team', 'user', callback);
org.remove_member_from_team('user', 'team', callback);
org.get_repositories(callback);
org.create_repository({name: ''}, callback);
org.get_team_repositories('team', callback);
org.get_team_repository('team', 'name', callback);
org.add_team_repository('team', 'name', callback);
org.remove_team_repository('team', 'name', callback);
var repo = octonode.Repository('pksunkara/octonode');
repo.update({name: ''}, callback);
// collaborator information
repo.add_collaborator('name', callback);
repo.remove_collaborator('name', callback);
// commit data
repo.get_commit('sha-id', callback);
repo.get_all_comments(callback);
repo.get_commit_comments('SHA ID', callback);
repo.comment_on_commit({body: '', commit_id: '', line: '', path: '', position: ''}, callback);
repo.get_single_comment('comment id', callback);
repo.edit_single_comment('comment id', callback);
repo.delete_single_comment('comment id', callback);
// downloads
repo.get_downloads(callback);
repo.get_download(callback);
repo.create_download({name: ''}, 'filepath', callback);
repo.delete_download(callback);
// keys
repo.get_deploy_keys(callback);
repo.get_deploy_key('id', callback);
repo.create_deploy_key({title: '', key: ''}, callback);
repo.edit_deploy_key({title: '', key: ''}, callback);
repo.delete_deploy_key('id', callback);
// watcher data
repo.get_watchers(callback);
// pull requests
repo.get_all_pull_request_comments(callback);
repo.get_pull_request_comment('id', callback);
repo.create_pull_request_comment('id', {body:'', commit_id:'', path:'', position:''}, callback);
repo.reply_to_pull_request_comment('id', 'body', callback);
repo.edit_pull_request_comment('id', 'body', callback);
repo.delete_pull_request_comment('id', callback);
repo.get_issues(params, callback);
repo.get_issue('id', callback);
repo.create_issue({title: ''}, callback);
repo.edit_issue({title: ''}, callback);
repo.get_issue_comments('issue', callback);
repo.get_issue_comment('id', callback);
repo.create_issue_comment('id', 'comment', callback);
repo.edit_issue_comment('id', 'comment', callback);
repo.delete_issue_comment('id', callback);
repo.get_issue_events('id', callback);
repo.get_events(callback);
repo.get_event('id', callback);
repo.get_labels(callback);
repo.get_label('id', callback);
repo.create_label('name', 'color', callback);
repo.edit_label('name', 'color', callback);
repo.delete_label('id', callback);
repo.get_issue_labels('issue', callback);
repo.add_labels_to_issue('issue', ['label1', 'label2'], callback);
repo.remove_label_from_issue('issue', 'labelid', callback);
repo.set_labels_for_issue('issue', ['label1', 'label2'], callback);
repo.remove_all_labels_from_issue('issue', callback);
repo.get_labels_for_milestone_issues('milestone', callback);
repo.get_milestones(callback);
repo.get_milestone('id', callback);
repo.create_milestone('title', callback);
repo.edit_milestone('title', callback);
repo.delete_milestone('id', callback);
// raw git access
repo.create_blob('content', 'encoding', callback);
repo.get_commit('sha-id', callback);
repo.create_commit('message', 'tree', [parents], callback);
repo.get_reference('ref', callback);
repo.get_all_references(callback);
repo.create_reference('ref', 'sha', callback);
repo.update_reference('ref', 'sha', force, callback);I accept pull requests and guarantee a reply back within a day
MIT/X11
Report here. Guaranteed reply within a day.
Pavan Kumar Sunkara (pavan.sss1991@gmail.com)