Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

An API over hacker news's site

branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 lib
Octocat-spinner-32 spec
Octocat-spinner-32 .gitignore
Octocat-spinner-32 Gemfile added bundler March 24, 2013
Octocat-spinner-32 README.rdoc
Octocat-spinner-32 Rakefile added bundler March 24, 2013
Octocat-spinner-32 ruby-hackernews.gemspec added bundler March 24, 2013
README.rdoc

An API over Hacker News

Requirements

mechanize (>= 1.0.0)
require_all (>= 1.1.0)

Installation

gem install ruby-hackernews

then, in your script:

require 'ruby-hackernews'

before using it. If you want to include the namespace (RubyHackernews), add

include RubyHackernews

otherwise, you'll have to access the gem's classes adding the module, like this:

RubyHackernews::Entry.all

Entries

You can get entries on the main page with:

Entry.all       # returns the main page's entries as an array

You can provide a number of pages:

Entry.all(3)    # will return the entries on the first 3 pages

There are methods for getting specific entry types:

Entry.questions # gets the first page of questions (ask NH)
Entry.newest    # gets the first page of new links (new)
Entry.jobs      # gets the first page of job offerts (jobs)

You can also get a single entry by its ID:

Entry.find(3102321) # gets that specific entry (warning: number will be 0!)

Each Entry instance has the following data:

entry = Entry.all.first # gets the top entry on the mainpage

entry.number       # the entry's position on HN

entry.link.title   # the link's name on HN
entry.link.href    # the actual link
entry.link.site    # the referring site, if any

entry.voting.score # the entry's score on HN

entry.user.name    # the submitter's user name

entry.time         # the elapsed time from submission

entry.text         # the text of the submission (ask/jobs only)
                   # NOTE: it will fetch the inner page

After you've logged in (see below) you can do the following

entry.upvote                                # votes the entry
entry.write_comment("mycomment")            # adds a comment to the entry
Entry.submit("mytitle", "myurl")            # submit a new link
Entry.submit("myquestion", "question text") # submit a new question 

user.submissions.first.comments_url         # returns the url to the current user's comments

Comments

You get an entry's comments with:

entry.comments

You can also get a specific comment by id with:

Comment.find("1234") # returns the comments with id 1234,
                     # and its subcomments.

Note that the method above will send a request to HN. If you just need the comments' count or url, you can instead use:

entry.comments_count

and

entry.comment_url

Either of which will not issue a request to HN's site.

You can also get the newest comments on HN with:

Comments.newest
Comments.newest(3)  # gets the first 3 pages of new comments

Each Comment instance has the following data:

comment = Entry.all.first.comments.first # gets the first comment of the first entry on HN's main page

comment.id             # comment's unique identifier
comment.text           # comment's body
comment.user.name      # poster's user name on HN
comment.voting.score   # comment's score

Comments are enumerable and threaded, so you can do like:

comment[2][0]          # gets the third reply to this comment, then the first reply to the reply
comment.first          # gets the first reply to this comment
comment.select do |c|  # gets all the comment replies which text contains "test"
  text ~= /test/
end
comment.parent         # gets the comment's parent (nil if no parent)

Once you're logged in (see below), you can do the following:

comment.upvote
comment.downvote
comment.reply("mycomment")

Logging in

You define a user with:

user = User.new("username")

Then, you log in with:

user.login("password")

Or, you can create a new use with that name:

user.signup("password") # don't abuse this!

You will be also logged in with the new user. So, no need to call user#login after user#signup.

You can log out with:

user.logout

You have to log out before logging in with a different user.

You can also get the current users submission list by doing this:

user.submissions

This will return a new Entry instance. For example:

user.submissions.first.comment_url

Will return the HN comment url of the last submitted story of that user

TO DO

Get user info (comments, saved)
Change user info/settings

THANKS TO

Something went wrong with that request. Please try again.