fix(desktop): handle deepseek phone-number login in account name extractor
Phone-number logins return id_profile=null, mobile_number="177******08", and
email="" (empty string, not null). The previous fallback used `??`, which only
short-circuits on null/undefined, so an empty email string clobbered the
mobile_number fallback and the displayName ended up null — leaving the
DeepSeek card stuck on the "${label} 会话" placeholder.
Switch to a truthy pickString helper that requires a non-empty trimmed string
before accepting a candidate, and prefer mobile_number over email so the
masked phone number shows up exactly the way DeepSeek's own sidebar renders it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -17,7 +17,12 @@ function normalizeText(value: unknown): string | null {
|
|||||||
// DeepSeek (chat.deepseek.com) 没有 Redux/Pinia/window state,登录态只有 localStorage
|
// DeepSeek (chat.deepseek.com) 没有 Redux/Pinia/window state,登录态只有 localStorage
|
||||||
// 里的 `userToken`(JSON 包了 value 字段)。账号信息要走 /api/v0/users/current,
|
// 里的 `userToken`(JSON 包了 value 字段)。账号信息要走 /api/v0/users/current,
|
||||||
// 用 Authorization: Bearer <token> 调。Cookie 不带 token,因此只能在页面上下文里
|
// 用 Authorization: Bearer <token> 调。Cookie 不带 token,因此只能在页面上下文里
|
||||||
// 执行 fetch(自带 token),返回 biz_data.id_profile.{name, picture}。
|
// 执行 fetch(自带 token)。
|
||||||
|
//
|
||||||
|
// 不同登录方式响应差异较大:
|
||||||
|
// 微信登录: id_profile = { provider: 'WECHAT', name: '阿白', picture: '...' }
|
||||||
|
// 手机登录: id_profile = null, mobile_number = '177******08'(其它字段是空串而非 null)
|
||||||
|
// 所以这里 fallback 必须用 truthy 判断而不是 ??,否则空串会击穿后续兜底。
|
||||||
//
|
//
|
||||||
// probe 通常在隐藏窗口、刚加载完就跑,React app 可能还没把 userToken 写入 localStorage,
|
// probe 通常在隐藏窗口、刚加载完就跑,React app 可能还没把 userToken 写入 localStorage,
|
||||||
// 所以要 poll 一下直到 token 出现,再调 API。
|
// 所以要 poll 一下直到 token 出现,再调 API。
|
||||||
@@ -60,14 +65,16 @@ export async function readDeepseekAccountIdentity(
|
|||||||
});
|
});
|
||||||
if (!response.ok) return null;
|
if (!response.ok) return null;
|
||||||
const payload = await response.json().catch(() => null);
|
const payload = await response.json().catch(() => null);
|
||||||
const profile = payload?.data?.biz_data?.id_profile ?? null;
|
|
||||||
const bizData = payload?.data?.biz_data ?? null;
|
const bizData = payload?.data?.biz_data ?? null;
|
||||||
const name = profile?.name ?? bizData?.email ?? bizData?.mobile_number ?? null;
|
const profile = bizData?.id_profile ?? null;
|
||||||
const picture = profile?.picture ?? null;
|
const pickString = (value) =>
|
||||||
return {
|
typeof value === 'string' && value.trim() ? value : null;
|
||||||
displayName: typeof name === 'string' ? name : null,
|
const name =
|
||||||
avatarUrl: typeof picture === 'string' ? picture : null,
|
pickString(profile?.name) ??
|
||||||
};
|
pickString(bizData?.mobile_number) ??
|
||||||
|
pickString(bizData?.email);
|
||||||
|
const picture = pickString(profile?.picture);
|
||||||
|
return { displayName: name, avatarUrl: picture };
|
||||||
} catch {
|
} catch {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user