jackwener/OpenCLI · error · CommandExecutionError
Jianyu whoami failed: ${probe.detail}
Error message
Jianyu whoami failed: ${probe.detail} What it means
CommandExecutionError thrown by verifyJianyuIdentity when the in-page probe function itself threw an exception (the probe catches its own errors and returns { kind: 'exception', detail }). This means the identity check could not even complete — the probe wraps the fetch to the sess endpoint and JSON parsing of window.__USER__ in try/catch, and any failure (network error inside page, fetch rejection, CSP block) surfaces here.
Source
Thrown at clis/jianyu/auth.js:44
if (userScript) {
try {
const u = JSON.parse(userScript);
userId = userId || String(u.id || u.userId || '');
name = String(u.name || u.realName || u.nickName || '');
} catch {}
}
const cookieUid = (document.cookie.split('; ').find(c => c.startsWith('userid_secure=')) || '').split('=')[1] || '';
userId = userId || cookieUid;
if (!userId && !name) {
return { kind: 'auth', detail: 'Jianyu protected page 200 but no user identity surface' };
}
return { ok: true, user_id: userId, name };
} catch (e) {
return { kind: 'exception', detail: String(e && e.message || e) };
}
})()`);
if (probe?.kind === 'auth') throw new AuthRequiredError('jianyu360.cn', probe.detail);
if (probe?.kind === 'exception') throw new CommandExecutionError(`Jianyu whoami failed: ${probe.detail}`);
if (!probe?.ok) throw new CommandExecutionError(`Unexpected Jianyu probe: ${JSON.stringify(probe)}`);
return { user_id: probe.user_id, name: probe.name };
}
registerSiteAuthCommands({
site: 'jianyu',
domain: 'jianyu360.cn',
loginUrl: 'https://www.jianyu360.cn/',
columns: ['user_id', 'name'],
quickCheck: hasJianyuUserCookie,
verify: verifyJianyuIdentity,
poll: async (page) => {
if (!await hasJianyuUserCookie(page)) {
throw new AuthRequiredError('jianyu360.cn', 'Waiting for Jianyu userid_secure cookie');
}
return verifyJianyuIdentity(page);
},
});View on GitHub (pinned to 49907e53dc)
Solutions
- Read probe.detail in the message to identify the underlying exception and fix that cause (DNS, proxy, 5xx)
- Retry after confirming https://www.jianyu360.cn/ loads in the automated browser
- Disable or relax proxy/VPN/ad-blockers that may block the in-page fetch
- Verify the sess endpoint still exists; if the site changed it, update the fetch URL in verifyJianyuIdentity
- Wrap verification in retry with backoff for transient network errors
Example fix
// before
const probe = await page.evaluate(...); // detail: 'Failed to fetch'
// after (retry transient failures)
for (let i = 0; i < 3; i++) {
try { return await verifyJianyuIdentity(page); }
catch (e) { if (!/Failed to fetch/.test(e.message) || i === 2) throw e; await page.wait(2); }
} Defensive patterns
Strategy: retry
Validate before calling
await page.goto('https://www.jianyu360.cn/');
await page.wait(2); // ensure page is stable and on-domain before probing
if (!page.url().includes('jianyu360.cn')) throw new Error('Page navigated away; probe would fail'); Type guard
function isProbeException(probe) {
return probe != null && typeof probe === 'object' && probe.kind === 'exception' && typeof probe.detail === 'string';
} Try / catch
try {
const identity = await verifyJianyuIdentity(page);
} catch (e) {
if (/Jianyu whoami failed: (Failed to fetch|NetworkError)/.test(e.message)) {
await page.wait(3); // retry transient network failures
return verifyJianyuIdentity(page);
}
throw e;
} Prevention
- Ensure stable network and no proxy/VPN interference with in-page fetches
- Keep the page parked on www.jianyu360.cn during verification (no concurrent navigation)
- Retry transient 'Failed to fetch' details with backoff
- Monitor the sess endpoint URL for site changes
When it happens
Trigger: The page.evaluate probe's internal fetch to /swordfish/frontPage/customer/sess/index with credentials: 'include' rejects (network failure, redirect, CORS/CSP), or another runtime error occurs inside the probe's try block; detail contains the exception message.
Common situations: Jianyu site temporarily down or returning 5xx; proxy/VPN blocking the in-page request; browser page navigated away mid-probe; site removed or moved the sess endpoint; page context destroyed by a redirect during page.goto.
Related errors
- coingecko categories request failed: ${err?.message ?? err}
- coingecko exchanges request failed: ${err?.message ?? err}
- coingecko global request failed: ${err?.message ?? err}
- ${label} request failed: ${err?.message ?? err}
- DuckDuckGo suggest request failed: ${err instanceof Error ?
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/50e8cdddb7b2139f.
Report an issue: GitHub.