登入成功後 CookieContainer 擁有三個域:.xiaomi.com、account.xiaomi.com、.account.xiaomi.com。關鍵 pwdToken、passToken 在 .account.xiaomi.com 下,但後續 GET 請求僅發送 account.xiaomi.com 的 Cookie,導致未登入態。
CookieContainer 依據 域名尾碼匹配規則 自動篩選 Cookie。請求 https://account.xiaomi.com/... 時:
.account.xiaomi.com 為「點開頭」域,匹配 account.xiaomi.com 及其子域。account.xiaomi.com(無點)優先級更高,導致容器僅取該域下的 Cookie,忽略 .account.xiaomi.com。CookieContainer,將 .account.xiaomi.com 下的 Cookie 手動加入 account.xiaomi.com 域。foreach (Cookie c in m_Cookie.GetCookies(new Uri("https://.account.xiaomi.com"))) {
m_Cookie.Add(new Uri("https://account.xiaomi.com"), c);
}https://account.xiaomi.com/...(無 www),確保 Set-Cookie 域一致。System.Net.Http.HttpClient 配合 CookieContainer 處理更符合 RFC 6265,較少此類坑。// 登入後
var loginUri = new Uri("https://account.xiaomi.com/pass/serviceLoginAuth2");
var cookies = m_Cookie.GetCookies(loginUri);
foreach (Cookie c in cookies) {
// 強制同步到無點域
if (c.Domain.StartsWith(".")) {
var fixedDomain = c.Domain.TrimStart('.');
m_Cookie.Add(new Uri("https://" + fixedDomain), c);
}
}
// 後續請求直接用 m_Cookie
new CookieContainer(),需全程共用同一實例。