Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ Run `opencli list` for the live registry.
| **devto** | `top` `tag` `user` | Public |
| **arxiv** | `search` `paper` | Public |
| **wikipedia** | `search` `summary` | Public |
| **hackernews** | `top` | Public |
| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | Public |
| **linkedin** | `search` | Browser |
| **reuters** | `search` | Browser |
| **smzdm** | `search` | Browser |
Expand Down
2 changes: 1 addition & 1 deletion README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ npm install -g @jackwener/opencli@latest
| **devto** | `top` `tag` `user` | 公开 |
| **arxiv** | `search` `paper` | 公开 |
| **wikipedia** | `search` `summary` | 公开 |
| **hackernews** | `top` | 公共 API |
| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | 公共 API |
| **linkedin** | `search` | 浏览器 |
| **reuters** | `search` | 浏览器 |
| **smzdm** | `search` | 浏览器 |
Expand Down
24 changes: 20 additions & 4 deletions docs/adapters/browser/hackernews.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,35 @@

| Command | Description |
|---------|-------------|
| `opencli hackernews top` | |
| `opencli hackernews top` | Hacker News top stories |
| `opencli hackernews new` | Hacker News newest stories |
| `opencli hackernews best` | Hacker News best stories |
| `opencli hackernews ask` | Hacker News Ask HN posts |
| `opencli hackernews show` | Hacker News Show HN posts |
| `opencli hackernews jobs` | Hacker News job postings |
| `opencli hackernews search <query>` | Search Hacker News stories |
| `opencli hackernews user <username>` | Hacker News user profile |

## Usage Examples

```bash
# Quick start
# Top stories
opencli hackernews top --limit 5

# Newest stories
opencli hackernews new --limit 10

# Search stories
opencli hackernews search "machine learning" --limit 5

# User profile
opencli hackernews user pg

# JSON output
opencli hackernews top -f json

# Verbose mode
opencli hackernews top -v
# Sort search by date
opencli hackernews search "rust" --sort date
```

## Prerequisites
Expand Down
2 changes: 1 addition & 1 deletion docs/adapters/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Run `opencli list` for the live registry.

| Site | Commands | Mode |
|------|----------|------|
| **[hackernews](/adapters/browser/hackernews)** | `top` | 🌐 Public |
| **[hackernews](/adapters/browser/hackernews)** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | 🌐 Public |
| **[bbc](/adapters/browser/bbc)** | `news` | 🌐 Public |
| **[devto](/adapters/browser/devto)** | `top` `tag` `user` | 🌐 Public |
| **[apple-podcasts](/adapters/browser/apple-podcasts)** | `search` `episodes` `top` | 🌐 Public |
Expand Down
38 changes: 38 additions & 0 deletions src/clis/hackernews/ask.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
site: hackernews
name: ask
description: Hacker News Ask HN posts
domain: news.ycombinator.com
strategy: public
browser: false

args:
limit:
type: int
default: 20
description: Number of stories

pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/askstories.json

- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"

- map:
id: ${{ item }}

- fetch:
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json

- filter: item.title && !item.deleted && !item.dead

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
score: ${{ item.score }}
author: ${{ item.by }}
comments: ${{ item.descendants }}
url: ${{ item.url }}

- limit: ${{ args.limit }}

columns: [rank, title, score, author, comments]
38 changes: 38 additions & 0 deletions src/clis/hackernews/best.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
site: hackernews
name: best
description: Hacker News best stories
domain: news.ycombinator.com
strategy: public
browser: false

args:
limit:
type: int
default: 20
description: Number of stories

pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/beststories.json

- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"

- map:
id: ${{ item }}

- fetch:
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json

- filter: item.title && !item.deleted && !item.dead

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
score: ${{ item.score }}
author: ${{ item.by }}
comments: ${{ item.descendants }}
url: ${{ item.url }}

- limit: ${{ args.limit }}

columns: [rank, title, score, author, comments]
36 changes: 36 additions & 0 deletions src/clis/hackernews/jobs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
site: hackernews
name: jobs
description: Hacker News job postings
domain: news.ycombinator.com
strategy: public
browser: false

args:
limit:
type: int
default: 20
description: Number of job postings

pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/jobstories.json

- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"

- map:
id: ${{ item }}

- fetch:
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json

- filter: item.title && !item.deleted && !item.dead

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
author: ${{ item.by }}
url: ${{ item.url }}

- limit: ${{ args.limit }}

columns: [rank, title, author, url]
38 changes: 38 additions & 0 deletions src/clis/hackernews/new.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
site: hackernews
name: new
description: Hacker News newest stories
domain: news.ycombinator.com
strategy: public
browser: false

args:
limit:
type: int
default: 20
description: Number of stories

pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/newstories.json

- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"

- map:
id: ${{ item }}

- fetch:
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json

- filter: item.title && !item.deleted && !item.dead

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
score: ${{ item.score }}
author: ${{ item.by }}
comments: ${{ item.descendants }}
url: ${{ item.url }}

- limit: ${{ args.limit }}

columns: [rank, title, score, author, comments]
44 changes: 44 additions & 0 deletions src/clis/hackernews/search.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
site: hackernews
name: search
description: Search Hacker News stories
domain: news.ycombinator.com
strategy: public
browser: false

args:
query:
type: str
required: true
positional: true
description: Search query
limit:
type: int
default: 20
description: Number of results
sort:
type: str
default: relevance
choices: [relevance, date]
description: Sort by relevance or date

pipeline:
- fetch:
url: "https://hn.algolia.com/api/v1/${{ args.sort === 'date' ? 'search_by_date' : 'search' }}"
params:
query: ${{ args.query }}
tags: story
hitsPerPage: ${{ args.limit }}

- select: hits

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
score: ${{ item.points }}
author: ${{ item.author }}
comments: ${{ item.num_comments }}
url: ${{ item.url }}

- limit: ${{ args.limit }}

columns: [rank, title, score, author, comments]
38 changes: 38 additions & 0 deletions src/clis/hackernews/show.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
site: hackernews
name: show
description: Hacker News Show HN posts
domain: news.ycombinator.com
strategy: public
browser: false

args:
limit:
type: int
default: 20
description: Number of stories

pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/showstories.json

- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"

- map:
id: ${{ item }}

- fetch:
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json

- filter: item.title && !item.deleted && !item.dead

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
score: ${{ item.score }}
author: ${{ item.by }}
comments: ${{ item.descendants }}
url: ${{ item.url }}

- limit: ${{ args.limit }}

columns: [rank, title, score, author, comments]
4 changes: 3 additions & 1 deletion src/clis/hackernews/top.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,16 @@ pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/topstories.json

- limit: 30
- limit: "${{ Math.min((args.limit ? args.limit : 20) + 10, 50) }}"

- map:
id: ${{ item }}

- fetch:
url: https://hacker-news.firebaseio.com/v0/item/${{ item.id }}.json

- filter: item.title && !item.deleted && !item.dead

- map:
rank: ${{ index + 1 }}
title: ${{ item.title }}
Expand Down
25 changes: 25 additions & 0 deletions src/clis/hackernews/user.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
site: hackernews
name: user
description: Hacker News user profile
domain: news.ycombinator.com
strategy: public
browser: false

args:
username:
type: str
required: true
positional: true
description: HN username

pipeline:
- fetch:
url: https://hacker-news.firebaseio.com/v0/user/${{ args.username }}.json

- map:
username: ${{ item.id }}
karma: ${{ item.karma }}
created: "${{ item.created ? new Date(item.created * 1000).toISOString().slice(0, 10) : '' }}"
about: ${{ item.about }}

columns: [username, karma, created, about]
Loading
Loading