57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
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
|
|
}
|