mirror of
https://github.com/jackwener/OpenCLI.git
synced 2026-09-14 18:25:42 +08:00
4fac911425
* feat(zhihu): add answer-detail to fetch a single answer's full content The existing `zhihu answer` adapter is a write (post an answer); the listing `zhihu question` truncates each answer's body to 200 chars. There was no way to fetch one specific answer's full content by id. New read adapter `zhihu answer-detail`: - Accepts a bare numeric answer id, a typed target `answer:<qid>:<aid>`, or a full Zhihu answer URL (the form you paste from a browser). - Calls `/api/v4/answers/<aid>?include=content,voteup_count,...,question` inside the cookie-bearing page context (Strategy.COOKIE). - Returns a single row with id / author / votes / comments / question_id / question_title / url / created_at / updated_at / content. The content column is the full stripped answer body by default — no silent truncation. `--max-content N` is an opt-in user cap (mirroring the wikipedia `page` flag), and `--max-content 0` (the default) means "no cap, full content". Important precision note: Zhihu answer ids since 2024 routinely exceed `Number.MAX_SAFE_INTEGER` (the test fixture uses the real id `1937205528846655537`). `data.id` is round-tripped through browser `JSON.parse` and would round to `1937205528846655500`, so the adapter deliberately ignores `data.id` for the canonical row id and anchors it to the already-validated input string instead. A regression test locks this contract in by mocking `data.id = 0` and asserting the row still carries the parsed input id. Typed errors: bad input → INVALID_INPUT; 401/403 → AuthRequiredError; other HTTP / null → FETCH_ERROR. No silent fallbacks, no sentinel strings. Live-verified against the example URL — fetched 5547 votes / 165 comments / 1937205528846655537-end-to-end. 16 unit tests, audits unchanged (typed-error-lint 189/189, silent-column-drop 103/103), manifest 816→817. * fix(zhihu): tighten answer-detail contracts