Skip to content

feat(sinafinance): rewrite stock as public API, no browser required#563

Merged
jackwener merged 3 commits intomainfrom
feat/sinafinance-stock-public-api
Mar 28, 2026
Merged

feat(sinafinance): rewrite stock as public API, no browser required#563
jackwener merged 3 commits intomainfrom
feat/sinafinance-stock-public-api

Conversation

@jackwener
Copy link
Copy Markdown
Owner

Summary

sinafinance stock 命令从 Browser 模式重写为 Public API 模式。

动机

原实现(#546 合入)通过浏览器自动化:打开搜索页 → 操作 suggest DOM → 跳转股票页 → 抓取页面 DOM,存在以下问题:

  • 需要 Chrome + Browser Bridge extension + 登录
  • 两次 page.wait(5) = 至少 10s 延迟
  • 依赖 #fcSuggest_140418 等动态生成 DOM ID,脆弱

方案

新浪本身提供两个无需认证的公开 API:

API 用途 编码
suggest3.sinajs.cn/suggest?type=11,31,41&key=... 股票搜索 GBK
hq.sinajs.cn/list={symbol} 实时行情 GBK

变化

  • Strategy.COOKIEStrategy.PUBLICbrowser: false
  • 无需浏览器、无需登录、无 DOM 依赖
  • A股 symbol 直接来自 suggest(sh600519),港股加 hk 前缀,美股加 gb_ 前缀
  • US 市值从 hq API field[12] 解析,格式化为 T/B/M
  • 代码从 ~200 行降至 ~100 行

字段来源

市场 Price Change Open High Low Volume
A股 f[3] f[3]-f[2] f[1] f[4] f[5] f[8]
港股 f[2] f[7] f[6] f[4] f[5] f[11]
美股 f[1] f[4] f[6] f8 f9 f[10]

Replace browser-based DOM scraping with direct Sina public APIs:
  suggest3.sinajs.cn — symbol search (GBK, no auth)
  hq.sinajs.cn       — real-time quote (GBK, no auth)

Strategy.PUBLIC, browser: false — no Chrome or login required.
Supports A股 (sh/sz), 港股 (hk prefix), 美股 (gb_ prefix).
US MarketCap parsed from hq field [12]; formatted as T/B/M.
Introduce EXIT_CODES constant table (sysexits.h conventions) and wire
exitCode into every CliError subclass so the process exit code reflects
the semantic type of failure:

  0   success (default)
  1   generic / unexpected error
  2   argument / usage error        (ArgumentError)
 66   empty result / not found      (EmptyResultError, SelectorError)
 69   service unavailable           (BrowserConnectError, AdapterLoadError)
 77   permission / auth required    (AuthRequiredError)
 78   configuration error           (ConfigError)
124   timeout                       (TimeoutError)
130   Ctrl-C / SIGINT               (unchanged, tui.ts)

resolveExitCode() in commanderAdapter.ts reads err.exitCode for typed
CliErrors, and falls back to pattern-matching message text for untyped
adapter errors (auth pattern → 77, not-found pattern → 66, else → 1).

Shell scripts can now distinguish error categories:
  opencli spotify status || echo "exit $?"   # 69 if browser not running
  opencli github issues --repo x 2>/dev/null; [ $? -eq 77 ] && opencli github auth
@jackwener jackwener merged commit 5c655ee into main Mar 28, 2026
9 checks passed
@jackwener jackwener deleted the feat/sinafinance-stock-public-api branch March 28, 2026 13:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant