jackwener/OpenCLI · error · CommandExecutionError

Xianyu /personal rendered but no user identity extractable —

Error message

Xianyu /personal rendered but no user identity extractable — stale unb or layout drift

What it means

The /personal page rendered (not a login prompt) but neither a DOM user id nor a nickname could be extracted, meaning the identity cannot be confirmed. The library throws CommandExecutionError because the page layout changed (layout drift) or a stale unb cookie produces no matching profile data.

Source

Thrown at clis/xianyu/auth.js:50

  `);
  if (probe.blocked) {
    throw new AuthRequiredError('goofish.com', 'Xianyu blocked by verification / risk control');
  }
  if (probe.requiresAuth) {
    throw new AuthRequiredError('goofish.com', 'Xianyu /personal shows login prompt — anonymous');
  }
  const userId = probe.domUserId || unb;
  let decodedTracknick = '';
  if (tracknick) {
    try {
      decodedTracknick = JSON.parse('"' + tracknick.replace(/\\/g, '\\\\') + '"');
    } catch {
      decodedTracknick = tracknick;
    }
  }
  const nickname = probe.domNick || decodedTracknick;
  if (!userId && !nickname) {
    throw new CommandExecutionError('Xianyu /personal rendered but no user identity extractable — stale unb or layout drift');
  }
  return { user_id: String(userId), nickname: String(nickname) };
}

registerSiteAuthCommands({
  site: 'xianyu',
  domain: 'goofish.com',
  loginUrl: 'https://www.goofish.com/login',
  columns: ['user_id', 'nickname'],
  quickCheck: hasXianyuIdentityCookie,
  verify: verifyXianyuIdentity,
  poll: async (page) => {
    if (!await hasXianyuIdentityCookie(page)) {
      throw new AuthRequiredError('goofish.com', 'Waiting for Xianyu unb/tracknick cookie');
    }
    return verifyXianyuIdentity(page);
  },
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Log out and back in to refresh unb/tracknick cookies
  2. Re-run after clearing cookies and re-authenticating
  3. Check for goofish.com layout updates and update the DOM extraction selectors in the probe script
  4. Retry later in case of transient anti-bot rendering

Example fix

// before
const identity = await verifyXianyuIdentity(page); // throws on layout drift
// after
if (!(await hasXianyuIdentityCookie(page))) {
  await reLogin(page);
}
const identity = await verifyXianyuIdentity(page);
Defensive patterns

Strategy: retry

Validate before calling

if (!(await hasXianyuIdentityCookie(page))) await reLogin(page);

Type guard

function hasIdentity(x) {
  return x != null && (x.user_id || x.nickname);
}

Try / catch

try {
  return await verifyXianyuIdentity(page);
} catch (e) {
  if (/no user identity extractable/.test(e.message)) {
    await reLogin(page); // refresh stale unb cookie
    return verifyXianyuIdentity(page);
  }
  throw e;
}

Prevention

When it happens

Trigger: verifyXianyuIdentity finds userId (domUserId or unb cookie) and nickname (domNick or decoded tracknick) both empty after the page renders.

Common situations: goofish.com changed its /personal DOM structure; stale/expired unb cookie kept the session half-authenticated; anti-bot rendering served a degraded page.

Related errors


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