package xiaohongshu import ( "context" "encoding/json" "fmt" "time" "github.com/go-rod/rod" ) type FeedsListAction struct { page *rod.Page } // FeedsResult 定义页面初始状态结构 type FeedsResult struct { Feed FeedData `json:"feed"` } func NewFeedsListAction(page *rod.Page) *FeedsListAction { pp := page.Timeout(60 * time.Second) pp.MustNavigate("https://www.xiaohongshu.com") pp.MustWaitDOMStable() return &FeedsListAction{page: pp} } // GetFeedsList 获取页面的 Feed 列表数据 func (f *FeedsListAction) GetFeedsList(ctx context.Context) ([]Feed, error) { page := f.page.Context(ctx) time.Sleep(1 * time.Second) // 获取 window.__INITIAL_STATE__ 并转换为 JSON 字符串 result := page.MustEval(`() => { if (window.__INITIAL_STATE__) { return JSON.stringify(window.__INITIAL_STATE__); } return ""; }`).String() if result == "" { return nil, fmt.Errorf("__INITIAL_STATE__ not found") } // 解析完整的 InitialState var state FeedsResult if err := json.Unmarshal([]byte(result), &state); err != nil { return nil, fmt.Errorf("failed to unmarshal __INITIAL_STATE__: %w", err) } // 返回 feed.feeds._value return state.Feed.Feeds.Value, nil }