Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
An API over hacker news's site
Ruby HTML
Tree: e1f4266907

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
spec
.gemspec
.gitignore
README.rdoc
Rakefile
test.rb

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

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

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.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.