jackwener/OpenCLI · error · AuthRequiredError

www.zhihu.com

Error message

www.zhihu.com

What it means

This AuthRequiredError is thrown by requireSearchPayload when the Zhihu search response carries __httpError with status 401 or 403, meaning Zhihu refused the request because the session lacks valid authentication. The 'www.zhihu.com' message is the host marker for the auth-requirement error; the remedy is signing in via the connected Chrome profile.

Solutions

  1. Open www.zhihu.com in the connected Chrome profile and log in (scan QR if needed), then rerun the search
  2. Clear the risk-control state by browsing manually once, then retry
  3. If recently logged in but still 401/403, check for cookie-clearing extensions or privacy settings
  4. Retry later if Zhihu is enforcing temporary login walls on search

Example fix

// before: retrying blindly on auth error
await searchZhihu(q);
// after
catch (err) {
  if (err instanceof AuthRequiredError) {
    console.error('Log in to www.zhihu.com in the connected Chrome profile, then rerun.');
    return;
  }
  throw err;
}
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-flight: check the session is authenticated
const me = await bridge.evaluate("fetch('https://www.zhihu.com/api/v4/me').then(r => r.status)");
if (me === 401) throw new Error('Log in to www.zhihu.com in the connected Chrome profile first');

Type guard

function isAuthRequiredError(err) {
  return err instanceof AuthRequiredError || (err instanceof Error && err.message.includes('www.zhihu.com'));
}

Try / catch

try {
  const results = await searchZhihu(q);
} catch (err) {
  if (isAuthRequiredError(err)) {
    console.error('Zhihu session expired. Sign in at www.zhihu.com in the connected Chrome profile, then rerun.');
    return null;
  }
  throw err;
}

Prevention

When it happens

Trigger: Running zhihu search while logged out (or with expired Zhihu cookies) and the in-page fetch of the search API returns HTTP 401/403, surfacing as payload.__httpError.

Common situations: Zhihu session expired after days of inactivity; using a clean/incognito Chrome profile with no login; Zhihu now requiring login for search; cookies cleared by browser hygiene tooling.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/5aec0af6a0496063. Report an issue: GitHub.

Appendix: source

Thrown at clis/zhihu/search.js:83

        throw new ArgumentError(`zhihu search --type must be one of: ${TYPES.join(', ')}`, 'Example: opencli zhihu search codex --type answer');
    }
    return type;
}

function unwrapEvaluateResult(payload) {
    if (payload && typeof payload === 'object' && 'data' in payload && 'session' in payload) return payload.data;
    return payload;
}

function requireSearchPayload(data, url) {
    const payload = unwrapEvaluateResult(data);
    if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
        throw new CommandExecutionError('Zhihu search returned malformed payload');
    }
    if (payload.__httpError) {
        const status = payload.__httpError;
        if (status === 401 || status === 403) {
            throw new AuthRequiredError('www.zhihu.com', 'Failed to fetch search results from Zhihu');
        }
        throw new CommandExecutionError(`Zhihu search request failed${status ? ` (HTTP ${status})` : ''}`, 'Try again later or rerun with -v for more detail');
    }
    if (payload.__fetchError) {
        throw new CommandExecutionError('Zhihu search request failed', String(payload.__fetchError));
    }
    if (!Array.isArray(payload.data)) {
        throw new CommandExecutionError('Zhihu search returned malformed data list', `URL: ${url}`);
    }
    if (!payload.paging || typeof payload.paging !== 'object') {
        throw new CommandExecutionError('Zhihu search returned malformed paging data', `URL: ${url}`);
    }
    return payload;
}

function normalizeResultItem(item) {
    if (!item || typeof item !== 'object' || item.type !== 'search_result' || !item.object || typeof item.object !== 'object') {
        return null;

View on GitHub (pinned to 49907e53dc)