jackwener/OpenCLI · error · CommandExecutionError
Zhihu answer detail request failed (HTTP ${status})
Error message
Zhihu answer detail request failed (HTTP ${status}) What it means
This CommandExecutionError is the fallback for the answer detail API responding with an unexpected HTTP status — any code other than 401/403/404 (and no network-level rejection). The status code is interpolated into the message so the developer can see exactly what Zhihu returned (e.g. 429 rate limit, 5xx server error).
Source
Thrown at clis/zhihu/answer-detail.js:99
} catch (error) {
return { __malformedJson: error instanceof Error ? error.message : String(error) };
}
})()
`).catch((err) => {
throw new CommandExecutionError(
`Zhihu answer detail request failed: ${err instanceof Error ? err.message : String(err)}`,
'Try again later or rerun with -v for more detail.',
);
});
if (!data || data.__httpError) {
const status = data?.__httpError;
if (status === 401 || status === 403) {
throw new AuthRequiredError('www.zhihu.com', 'Failed to fetch Zhihu answer detail');
}
if (status === 404) {
throw new EmptyResultError('zhihu answer-detail', `No Zhihu answer was found for ${answerId}.`);
}
throw new CommandExecutionError(
status
? `Zhihu answer detail request failed (HTTP ${status})`
: 'Zhihu answer detail request failed',
'Try again later or rerun with -v for more detail',
);
}
if (data.__malformedJson) {
throw new CommandExecutionError(
`Zhihu answer detail returned malformed JSON: ${data.__malformedJson}`,
'Try again later or rerun with -v for more detail',
);
}
if (typeof data !== 'object' || Array.isArray(data)) {
throw new CommandExecutionError(
'Zhihu answer detail returned a malformed payload',
'Try again later or rerun with -v for more detail',
);
}View on GitHub (pinned to 49907e53dc)
Solutions
- Retry later or with backoff, especially if status is 429 or 5xx.
- Rerun with -v for more detail about the request and response.
- Reduce request frequency / add delays between calls to avoid rate limiting.
- Check zhihu.com availability in a browser to rule out a site-wide outage.
Defensive patterns
Strategy: retry
Type guard
function isHttpServerError(err) { const m = err?.message?.match(/HTTP (\d{3})/); return !!m && Number(m[1]) >= 500 || (m && m[1] === '429'); } Try / catch
try {
const detail = await answerDetail(id);
} catch (err) {
const m = err.message.match(/HTTP (\d{3})/);
if (m && (Number(m[1]) >= 500 || m[1] === '429')) {
return retryWithBackoff(() => answerDetail(id), { attempts: 5, baseMs: 2000 });
}
throw err;
} Prevention
- Throttle request rate to avoid 429 responses.
- Retry 5xx/429 with exponential backoff and jitter.
- Monitor zhihu.com status during long-running scrapes.
- Rerun with -v to confirm which status code was returned.
When it happens
Trigger: The in-page fetch returns __httpError set to a status like 429, 500, 502, or 503 from the Zhihu answer detail endpoint.
Common situations: Hitting Zhihu too frequently (429 rate limiting), Zhihu server-side incidents (5xx), or maintenance windows returning unusual statuses.
Understand the failure class
Background: "API error: {status}" and "HTTP 401/403/404/429/5xx" errors: non-2xx HTTP responses explained — this error's family across 27 libraries.
Related errors
- Zhihu identity probe failed (HTTP ${status ?? 'unknown'})
- Zhihu collection request failed (HTTP ${status})
- ${errorLabel} from Zhihu failed (HTTP ${status})
- autohome ${contextHint} HTTP ${resp.status}
- Chess.com callback returned HTTP ${resp.status} for ${url}
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/92a9b03863ee468c.
Report an issue: GitHub.