@@ -33,42 +33,71 @@ func (u *UserProfileAction) UserProfile(ctx context.Context, userID, xsecToken s
3333func (u * UserProfileAction ) extractUserProfileData (page * rod.Page ) (* UserProfileResponse , error ) {
3434 page .MustWait (`() => window.__INITIAL_STATE__ !== undefined` )
3535
36- // 获取 window.__INITIAL_STATE__ 并转换为 JSON 字符串
37- result := page .MustEval (`() => {
38- if (window.__INITIAL_STATE__) {
39- return JSON.stringify(window.__INITIAL_STATE__);
36+ userDataResult := page .MustEval (`() => {
37+ if (window.__INITIAL_STATE__ &&
38+ window.__INITIAL_STATE__.user &&
39+ window.__INITIAL_STATE__.user.userPageData) {
40+ const userPageData = window.__INITIAL_STATE__.user.userPageData;
41+ const data = userPageData.value !== undefined ? userPageData.value : userPageData._value;
42+ if (data) {
43+ return JSON.stringify(data);
4044 }
41- return "";
42- }` ).String ()
45+ }
46+ return "";
47+ }` ).String ()
4348
44- if result == "" {
45- return nil , fmt .Errorf ("__INITIAL_STATE__ not found" )
49+ if userDataResult == "" {
50+ return nil , fmt .Errorf ("user.userPageData.value not found in __INITIAL_STATE__ " )
4651 }
47- // 定义响应结构并直接反序列化
48- var initialState = struct {
49- User struct {
50- UserPageData UserPageData `json:"userPageData"`
51- Notes struct {
52- Feeds [][]Feed `json:"_rawValue"` // 帖子为双重数组
53- } `json:"notes"`
54- } `json:"user"`
55- }{}
56- if err := json .Unmarshal ([]byte (result ), & initialState ); err != nil {
57- return nil , fmt .Errorf ("failed to unmarshal __INITIAL_STATE__: %w" , err )
52+
53+ // 2. 获取用户帖子:window.__INITIAL_STATE__.user.notes.value
54+ notesResult := page .MustEval (`() => {
55+ if (window.__INITIAL_STATE__ &&
56+ window.__INITIAL_STATE__.user &&
57+ window.__INITIAL_STATE__.user.notes) {
58+ const notes = window.__INITIAL_STATE__.user.notes;
59+ // 优先使用 value(getter),如果不存在则使用 _value(内部字段)
60+ const data = notes.value !== undefined ? notes.value : notes._value;
61+ if (data) {
62+ return JSON.stringify(data);
63+ }
64+ }
65+ return "";
66+ }` ).String ()
67+
68+ if notesResult == "" {
69+ return nil , fmt .Errorf ("user.notes.value not found in __INITIAL_STATE__" )
70+ }
71+
72+ // 解析用户信息
73+ var userPageData struct {
74+ Interactions []UserInteractions `json:"interactions"`
75+ BasicInfo UserBasicInfo `json:"basicInfo"`
5876 }
77+ if err := json .Unmarshal ([]byte (userDataResult ), & userPageData ); err != nil {
78+ return nil , fmt .Errorf ("failed to unmarshal userPageData: %w" , err )
79+ }
80+
81+ // 解析帖子数据(帖子为双重数组)
82+ var notesFeeds [][]Feed
83+ if err := json .Unmarshal ([]byte (notesResult ), & notesFeeds ); err != nil {
84+ return nil , fmt .Errorf ("failed to unmarshal notes: %w" , err )
85+ }
86+
87+ // 组装响应
5988 response := & UserProfileResponse {
60- UserBasicInfo : initialState . User . UserPageData . RawValue .BasicInfo ,
61- Interactions : initialState . User . UserPageData . RawValue .Interactions ,
89+ UserBasicInfo : userPageData .BasicInfo ,
90+ Interactions : userPageData .Interactions ,
6291 }
63- // 添加用户贴子
64- for _ , feeds := range initialState .User .Notes .Feeds {
92+
93+ // 添加用户帖子(展平双重数组)
94+ for _ , feeds := range notesFeeds {
6595 if len (feeds ) != 0 {
6696 response .Feeds = append (response .Feeds , feeds ... )
6797 }
6898 }
6999
70100 return response , nil
71-
72101}
73102
74103func makeUserProfileURL (userID , xsecToken string ) string {
0 commit comments