Skip to content

feat(nodeseek): add NodeSeek adapter#1995

Open
dengshu2 wants to merge 1 commit into
jackwener:mainfrom
dengshu2:feat/nodeseek-adapter
Open

feat(nodeseek): add NodeSeek adapter#1995
dengshu2 wants to merge 1 commit into
jackwener:mainfrom
dengshu2:feat/nodeseek-adapter

Conversation

@dengshu2

Copy link
Copy Markdown

Description

Adds a NodeSeek (www.nodeseek.com) adapter — a Chinese community for VPS / hosting / server and geek topics.

NodeSeek is a Vue SSR app behind Cloudflare: page content (posts, comments, search results, profiles) is server-rendered into the HTML and read off the DOM, while a few JSON endpoints are fetched from within the authenticated page context. The logged-in identity is injected as window.__config__.user; pjwt is the session cookie.

Related issue: none

Commands (9)

Command Strategy Source
latest [--category --limit] 🌐 public rss.nodeseek.com (no login / no browser)
categories 🌐 public static board list
login / whoami 🔐 cookie pjwt cookie + window.__config__.user
me 🔐 cookie window.__config__.user
user <id> 🔐 cookie GET /api/account/getInfo/<id>
notifications [--unread] 🔐 cookie GET /api/notification/at-me/list
post <id> [--page --full] 🔐 cookie thread body + comment floors (li.content-item)
search <query> 🔐 cookie full-text post search

latest/categories need no login or browser via the open RSS mirror. post captures the full comment thread, not just the first post.

Type of Change

  • 🌐 New site adapter

Checklist

  • I ran the checks relevant to this PR
  • I updated tests or docs if needed
  • I included output or screenshots when useful

Documentation

  • Added doc page under docs/adapters/ (browser/nodeseek.md)
  • Updated docs/adapters/index.md table
  • Updated sidebar in docs/.vitepress/config.mts
  • README unchanged (no site list to update)
  • Used positional args for each command's primary subject (id, query)
  • Normalized expected failures to CliError subclasses (ArgumentError, AuthRequiredError, EmptyResultError, CommandExecutionError)

Screenshots / Output

$ opencli nodeseek latest --limit 1
- post_id: '787542'
  title: 周末余额严重不足,各位大佬这两天都在折腾啥?
  category: daily
  author: 我嚟同你玩
  excerpt: 愉快的周末马上就要结束了,准备迎接新一周的搬砖生活。
  link: https://www.nodeseek.com/post-787542-1

$ opencli nodeseek post 779413        # body (floor 0) + every comment floor
$ opencli nodeseek search kamatera    # full-text post search

Gates

  • npx tsc --noEmit → clean
  • npx vitest run --project adapter → all green (incl. 19 new nodeseek tests)
  • opencli validate nodeseek → PASS, 0 errors, 0 warnings
  • check-silent-column-drop / check-typed-error-lint → no new violations
  • check-doc-coverage --strict → all adapters documented
  • npm run build-manifest → +9 nodeseek entries, 0 removals

Every command was verified against a live logged-in session.

@dengshu2 dengshu2 force-pushed the feat/nodeseek-adapter branch 4 times, most recently from 97a61a3 to 2a261a2 Compare June 26, 2026 11:33
NodeSeek (www.nodeseek.com) is a Chinese VPS / hosting / geek community.
It is a Vue SSR app behind Cloudflare, so content is read off the rendered
DOM and a few JSON endpoints are fetched from the authenticated page context.

Commands:
- latest / categories  — public RSS (rss.nodeseek.com), no login or browser
- login / whoami        — pjwt cookie + window.__config__.user
- me                    — full self profile
- user <id>             — GET /api/account/getInfo/<id>
- notifications         — GET /api/notification/at-me/list
- post <id>             — thread body + comment floors (li.content-item)
- search <query>        — full-text post search

Shared browser helpers live in client.js. Pure parsing/mapping logic is
unit-tested incl. pagination/auth/error-path func tests (37 tests); `opencli validate nodeseek` passes with 0 warnings.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dengshu2 dengshu2 force-pushed the feat/nodeseek-adapter branch from 2a261a2 to 0293c74 Compare June 26, 2026 11:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant