
Research
Security News
Malicious npm Packages Use Telegram to Exfiltrate BullX Credentials
Socket uncovers an npm Trojan stealing crypto wallets and BullX credentials via obfuscated code and Telegram exfiltration.
Unofficial Python wrapper for official Hacker News API.
pip install haxor
from hackernews import HackerNews
hn = HackerNews()
Stories, comments, jobs, Ask HNs and even polls are just items with unique item id.
To query item information by id:
item = hn.get_item(8863)
# >>> item.title
# 'My YC app: Dropbox - Throw away your USB drive'
# >>> item.item_type
# 'story'
# >>> item.kids
# [ 8952, 9224, 8917, ...]
Since most results are returned as integer IDs (like item.kids above), these results require further iteration. Instead of doing this yourself, use the expand
flag to get object-oriented, detailed item info by id:
item = hn.get_item(8863, expand=True)
# >>> item.kids
# [<hackernews.Item: 9224 - None>, <hackernews.Item: 8952 - None>, ...]
# >>> item.by
# <hackernews.User: dhouston>
To query a list of Item IDs:
items = hn.get_items_by_ids([8863, 37236, 2345])
# >>> items
# [<hackernews.Item: 8863 - My YC app: Dropbox - Throw away your USB drive>, <hackernews.Item:
# 37236 - None>, <hackernews.Item: 2345 - The Best Buy Scam.>]
Use the item_type
filter to specifically select 'story', 'comment', 'job', or 'poll' items:
items = hn.get_items_by_ids([8863, 37236, 2345], item_type='story')
# >>> items
# [<hackernews.Item: 8863 - My YC app: Dropbox - Throw away your USB drive>, <hackernews.Item: # 2345 - The Best Buy Scam.>]
The HN API allows for real-time querying for New, Top, Best, Ask HN, Show HN, and Jobs stories.
As an example, to get Item objects of current top stories:
top_stories = hn.top_stories()
# >>> top_stories
# [<hackernews.Item: 16924667 - Ethereum Sharding FAQ>, ...]
To get current largest Item id (most recent story, comment, job, or poll):
max_item = hn.get_max_item()
# >>> max_item
# 16925673
Once again, use the expand
flag to get an object-oriented, detailed Item representation:
max_item = hn.get_max_item(expand=True)
# >>> max_item
# <hackernews.Item: 16925673 - None>
To get the x most recent Items:
last_ten = hn.get_last(10)
# >>> last_ten
# [<hackernews.Item: 16925688 - Show HN: Eventbot – Group calendar for Slack teams>, ...]
HN users are also queryable.
To query users by user_id (i.e. username on Hacker News):
user = hn.get_user('pg')
# >>> user.user_id
# 'pg'
# >>> user.karma
# 155040
Use the expand
flag to get an object-oriented, detailed Item representation for User attributes:
user = hn.get_user('dhouston', expand=True)
# >>> user.stories
# [<hackernews.Item: 1481914 - Dropbox is hiring a Web Engineer>, ...]
# >>> user.comments
# [<hackernews.Item: 16660140 - None>, <hackernews.Item: 15692914 - None>, ...]
# >>> user.jobs
# [<hackernews.Item: 3955262 - Dropbox seeking iOS and Android engineers>, ...]
To query a list of users:
users = hn.get_users_by_ids(['pg','dhouston'])
# >>> users
# [<hackernews.User: pg>, <hackernews.User: dhouston>]
Get top 10 stories:
hn.top_stories(limit=10)
# [<hackernews.Item: 16924667 - Ethereum Sharding FAQ>, <hackernews.Item: 16925499 - PipelineDB # v0.9.9 – One More Release Until PipelineDB Is a PostgreSQL Extension>, ...]
Find all the 'jobs' post from Top Stories:
stories = hn.top_stories()
for story in stories:
if story.item_type == 'job':
print(story)
# <hackernews.Item: 16925047 - Taplytics (YC W14) is solving hard engineering problems in
# Toronto and hiring>
# ...
# ...
Find Python jobs from monthly who is hiring thread:
# Who is hiring - April 2018
# https://news.ycombinator.com/item?id=16735011
who_is_hiring = hn.get_item(16735011, expand=True)
for comment in who_is_hiring.kids:
if 'python' in comment.text.lower():
print(comment)
# <hackernews.Item: 16735358 - None>
# <hackernews.Item: 16737152 - None>
# ...
# ...
HackerNews
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
version | string | No | specifies Hacker News API version | v0 |
get_item
Description: Returns Item
object
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
item_id | string/int | Yes | unique item id of Hacker News story, comment etc | None |
expand | bool | No | flag to indicate whether to transform all IDs into objects | False |
get_items_by_ids
Description: Returns list of Item
objects
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
item_ids | list of string/int | Yes | unique item ids of Hacker News stories, comments etc | None |
item_type | string | No | item type to filter results with | None |
get_user
Description: Returns User
object
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
user_id | string | Yes | unique user id of a Hacker News user | None |
expand | bool | No | flag to indicate whether to transform all IDs into objects | False |
get_users_by_ids
Description: Returns list of User
objects
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
user_ids | list of string/int | Yes | unique user ids of Hacker News users | None |
top_stories
Description: Returns list of Item
objects of current top stories
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
raw | bool | No | indicate whether to represent all objects in raw json | False |
limit | int | No | specifies the number of stories to be returned | None |
new_stories
Description: Returns list of Item
objects of current new stories
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
raw | bool | No | indicate whether to represent all objects in raw json | False |
limit | int | No | specifies the number of stories to be returned | None |
ask_stories
Description: Returns list of Item
objects of latest Ask HN stories
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
raw | bool | No | indicate whether to represent all objects in raw json | False |
limit | int | No | specifies the number of stories to be returned | None |
show_stories
Description: Returns list of Item
objects of latest Show HN stories
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
raw | bool | No | indicate whether to represent all objects in raw json | False |
limit | int | No | specifies the number of stories to be returned | None |
job_stories
Description: Returns list of Item
objects of latest Job stories
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
raw | bool | No | indicate whether to represent all objects in raw json | False |
limit | int | No | specifies the number of stories to be returned | None |
updates
Description: Returns list of Item
and User
objects that have been changed/updated recently.
Parameters: N/A
get_max_item
Description: Returns current largest item id or current largest Item
object
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
expand | bool | No | flag to indicate whether to transform ID into object | False |
get_all
Description: Returns all Item
objects from HN
Parameters: N/A
get_last
Description: Returns list of num
most recent Item
objects
Parameters:
Name | Type | Required | Description | Default |
---|---|---|---|---|
num | int | No | numbr of most recent records to pull from HN | 10 |
Item
From Official HackerNews Item:
Property | Description |
---|---|
item_id | The item’s unique id. |
deleted | true if the item is deleted. |
item_type | The type of item. One of “job”, “story”, “comment”, “poll”, or “pollopt”. |
by | The username of the item’s author. |
submission_time | Creation date of the item, in Python datetime . |
text | The comment, Ask HN, or poll text. HTML. |
dead | true if the item is dead. |
parent | The item’s parent. For comments, either another comment or the relevant story. For pollopts, the relevant poll. |
poll | The ids of poll's. |
kids | The ids of the item’s comments, in ranked display order. |
url | The URL of the story. |
score | The story’s score, or the votes for a pollopt. |
title | The title of the story or poll. |
parts | A list of related pollopts, in display order. |
descendants | In the case of stories or polls, the total comment count. |
raw | original JSON response. |
User
From Official HackerNews User:
Property | Description |
---|---|
user_id | The user’s unique username. Case-sensitive. |
delay | Delay in minutes between a comment’s creation and its visibility to other users. |
created | Creation date of the user, in Python datetime . |
karma | The user’s karma. |
about | The user’s optional self-description. HTML. |
submitted | List of the user’s stories, polls and comments. |
raw | original JSON response. |
Additional properties when expand
is used
Property | Description |
---|---|
stories | The user’s submitted stories. |
comments | The user's submitted comments. |
jobs | The user's submitted jobs. |
polls | The user's submitted polls. |
pollopts | The user's submitted poll options. |
For local development do pip
installation of requirements-dev.txt
:
pip install -r requirements-dev.txt
Run the test suite by running:
echo "0.0.0-dev" > version.txt
python setup.py develop
pytest tests
The mighty MIT license. Please check LICENSE
for more details.
FAQs
Unofficial Python wrapper for Hacker News API
We found that haxor demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket uncovers an npm Trojan stealing crypto wallets and BullX credentials via obfuscated code and Telegram exfiltration.
Research
Security News
Malicious npm packages posing as developer tools target macOS Cursor IDE users, stealing credentials and modifying files to gain persistent backdoor access.
Security News
AI-generated slop reports are making bug bounty triage harder, wasting maintainer time, and straining trust in vulnerability disclosure programs.