xpzouying/xiaohongshu-mcp · error

页面状态里没有分区 %s,可能未登录或页面结构已变化

Error message

页面状态里没有分区 %s,可能未登录或页面结构已变化

What it means

readTab 的空值守卫:page.Eval 成功但 notificationMap 中没有请求的 tab 分区(返回空串):大概率未登录(无通知数据注入)或前端状态结构变化导致分区缺失。

Source

Thrown at xiaohongshu/notification.go:298

		return r.UserInfo
	}
	return r.User
}

// readTab 读取指定分区的原始数据,字段映射由结构体承担。
func (n *NotificationAction) readTab(page *rod.Page, tab NotificationTab) (*notificationPayload, error) {
	res, err := page.Eval(`(tab) => {
		const s = window.__INITIAL_STATE__;
		const m = s && s.notification && s.notification.notificationMap;
		return m && m[tab] ? JSON.stringify(m[tab]) : "";
	}`, string(tab))
	if err != nil {
		return nil, fmt.Errorf("读取通知列表失败: %w", err)
	}

	raw := res.Value.String()
	if raw == "" {
		return nil, fmt.Errorf("页面状态里没有分区 %s,可能未登录或页面结构已变化", tab)
	}

	var payload notificationPayload
	if err := json.Unmarshal([]byte(raw), &payload); err != nil {
		return nil, fmt.Errorf("解析通知列表失败: %w", err)
	}
	return &payload, nil
}

// visible 判断一条通知的内容是否仍然正常可见。
func (r rawNotification) visible() bool {
	if r.Comment.ID != "" && r.Comment.Illegal.Status != "" && r.Comment.Illegal.Status != statusNormal {
		return false
	}
	if r.Item.ID != "" && r.Item.Illegal.Status != "" && r.Item.Illegal.Status != statusNormal {
		return false
	}
	return true

View on GitHub (pinned to 332d196854)

Solutions

  1. 先调用确认登录态的接口或检查 Cookie 是否有效,重新注入登录态
  2. 手动打开 https://www.xiaohongshu.com/notification 检查 __INITIAL_STATE__ 结构
  3. 确认传入的 tab 值与 NotificationTab 常量一致
  4. 等待页面加载完成(MustWaitLoad + sleep)后重试一次

Example fix

// before
raw := res.Value.String()
if raw == "" { return nil, fmt.Errorf("页面状态里没有分区 %s,可能未登录或页面结构已变化", tab) }
// after
raw := res.Value.String()
if raw == "" {
    if !loggedIn(page) { refreshCookies(); page.MustNavigate(notificationURL).MustWaitLoad() }
    return nil, fmt.Errorf("页面状态里没有分区 %s,可能未登录或页面结构已变化", tab)
}
Defensive patterns

Strategy: fallback

Validate before calling

// 调用前检查登录态
info, err := page.Eval(`() => !!window.__INITIAL_STATE__ && !!window.__INITIAL_STATE__.user && window.__INITIAL_STATE__.user.loggedIn`)

Try / catch

items, err := n.List(ctx)
if err != nil && strings.Contains(err.Error(), "可能未登录") {
    // 刷新登录态/Cookie 后 fallback 重试
    reloadCookies()
    items, err = n.List(ctx)
}

Prevention

When it happens

Trigger: List/locate/likedMatches 调用 readTab 且 notificationMap[tab] 不存在:未登录被重定向、页面未完成水合、小红书改版后 __INITIAL_STATE__ 结构变化、tab 名对应分区在当前账号不可见。

Common situations: Cookie 过期导致未登录状态;自动化访问太快页面停留在异常/验证页;前端版本升级把 notificationMap 改名或移动。

Related errors


AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05). Data as JSON: /api/errors/9eaf0366b825d5dc. Report an issue: GitHub.