* feat: add feed detail page functionality with gin and MCP interfaces Add comprehensive Feed detail page support: - Create new FeedDetailAction in xiaohongshu/feed_detail.go - Add HTTP API endpoint POST /api/v1/feeds/detail - Add MCP tool 'get_feed_detail' for MCP protocol support - Support feed_id and xsec_token parameters (both required) - Raw __INITIAL_STATE__ JSON data saved to feed_detail.json - Return structured data for both HTTP and MCP interfaces 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * feat: enhance feed detail functionality with MCP interface improvements - Add comprehensive feed detail page support with proper data extraction - Create dedicated feed_detail.go file for FeedDetailAction - Optimize Go struct definitions based on actual JSON data analysis - Remove unnecessary fields from FeedDetail, DetailImageInfo, CommentList, and Comment structs - Update MCP interface description to reflect comment retrieval capability - Support both HTTP REST API and MCP protocol interfaces - Implement proper Vue 3 reactive data extraction from window.__INITIAL_STATE__ - Include feed content, user info, interaction data, and comment lists 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: restore JSON file writing for testing and improve code structure - Restore feed_detail.json file writing for testing purposes - Improve error handling by separating marshal and unmarshal steps - Keep the original data extraction logic for complex Vue reactive data structure 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: simplify JSON unmarshaling using struct instead of map[string]any - Replace complex map[string]any extraction with direct struct unmarshaling - Define inline struct matching the actual JSON response structure - Remove unnecessary extractFeedDetailData and extractNestedValue methods - Significantly reduce code complexity and improve readability 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * docs: improve MCP interface descriptions for better usability - Enhance get_feed_detail parameter descriptions with clear source information - Clarify publish_content images parameter supports both local paths and URLs - Improve search_feeds description to specify supported search types - Keep descriptions concise and practical without over-complication 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> * fix: revert search_feeds keyword description to keep it simple - Remove unnecessary details from keyword description - Keep interface descriptions concise and clear 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
139 lines
3.9 KiB
Go
139 lines
3.9 KiB
Go
package xiaohongshu
|
|
|
|
// 小红书 Feed 相关的数据结构定义
|
|
|
|
// FeedResponse 表示从 __INITIAL_STATE__ 中获取的完整 Feed 响应
|
|
type FeedResponse struct {
|
|
Feed FeedData `json:"feed"`
|
|
}
|
|
|
|
// FeedData 表示 feed 数据结构
|
|
type FeedData struct {
|
|
Feeds FeedsValue `json:"feeds"`
|
|
}
|
|
|
|
// FeedsValue 表示 feeds 的值结构
|
|
type FeedsValue struct {
|
|
Value []Feed `json:"_value"`
|
|
}
|
|
|
|
// Feed 表示单个 Feed 项目
|
|
type Feed struct {
|
|
XsecToken string `json:"xsecToken"`
|
|
ID string `json:"id"`
|
|
ModelType string `json:"modelType"`
|
|
NoteCard NoteCard `json:"noteCard"`
|
|
Index int `json:"index"`
|
|
}
|
|
|
|
// NoteCard 表示笔记卡片信息
|
|
type NoteCard struct {
|
|
Type string `json:"type"`
|
|
DisplayTitle string `json:"displayTitle"`
|
|
User User `json:"user"`
|
|
InteractInfo InteractInfo `json:"interactInfo"`
|
|
Cover Cover `json:"cover"`
|
|
Video *Video `json:"video,omitempty"` // 视频内容,可能为空
|
|
}
|
|
|
|
// User 表示用户信息
|
|
type User struct {
|
|
UserID string `json:"userId"`
|
|
Nickname string `json:"nickname"`
|
|
NickName string `json:"nickName"`
|
|
Avatar string `json:"avatar"`
|
|
XsecToken string `json:"xsecToken"`
|
|
}
|
|
|
|
// InteractInfo 表示互动信息
|
|
type InteractInfo struct {
|
|
Liked bool `json:"liked"`
|
|
LikedCount string `json:"likedCount"`
|
|
|
|
SharedCount string `json:"sharedCount"`
|
|
CommentCount string `json:"commentCount"`
|
|
|
|
CollectedCount string `json:"collectedCount"`
|
|
Collected bool `json:"collected"`
|
|
}
|
|
|
|
// Cover 表示封面信息
|
|
type Cover struct {
|
|
Width int `json:"width"`
|
|
Height int `json:"height"`
|
|
URL string `json:"url"`
|
|
FileID string `json:"fileId"`
|
|
URLPre string `json:"urlPre"`
|
|
URLDefault string `json:"urlDefault"`
|
|
InfoList []ImageInfo `json:"infoList"`
|
|
}
|
|
|
|
// ImageInfo 表示图片信息
|
|
type ImageInfo struct {
|
|
ImageScene string `json:"imageScene"`
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
// Video 表示视频信息
|
|
type Video struct {
|
|
Capa VideoCapability `json:"capa"`
|
|
}
|
|
|
|
// VideoCapability 表示视频能力信息
|
|
type VideoCapability struct {
|
|
Duration int `json:"duration"` // 视频时长,单位秒
|
|
}
|
|
|
|
// ================ Feed 详情页相关结构体 ================
|
|
|
|
// FeedDetailResponse 表示 Feed 详情页完整响应
|
|
type FeedDetailResponse struct {
|
|
Note FeedDetail `json:"note"`
|
|
Comments CommentList `json:"comments"`
|
|
}
|
|
|
|
// FeedDetail 表示详情页的笔记内容
|
|
type FeedDetail struct {
|
|
NoteID string `json:"noteId"`
|
|
XsecToken string `json:"xsecToken"`
|
|
Title string `json:"title"`
|
|
Desc string `json:"desc"`
|
|
Type string `json:"type"`
|
|
Time int64 `json:"time"`
|
|
IPLocation string `json:"ipLocation"`
|
|
User User `json:"user"`
|
|
InteractInfo InteractInfo `json:"interactInfo"`
|
|
ImageList []DetailImageInfo `json:"imageList"`
|
|
}
|
|
|
|
// DetailImageInfo 表示详情页的图片信息
|
|
type DetailImageInfo struct {
|
|
Width int `json:"width"`
|
|
Height int `json:"height"`
|
|
URLDefault string `json:"urlDefault"`
|
|
URLPre string `json:"urlPre"`
|
|
LivePhoto bool `json:"livePhoto,omitempty"`
|
|
}
|
|
|
|
// CommentList 表示评论列表
|
|
type CommentList struct {
|
|
List []Comment `json:"list"`
|
|
Cursor string `json:"cursor"`
|
|
HasMore bool `json:"hasMore"`
|
|
}
|
|
|
|
// Comment 表示单条评论
|
|
type Comment struct {
|
|
ID string `json:"id"`
|
|
NoteID string `json:"noteId"`
|
|
Content string `json:"content"`
|
|
LikeCount string `json:"likeCount"`
|
|
CreateTime int64 `json:"createTime"`
|
|
IPLocation string `json:"ipLocation"`
|
|
Liked bool `json:"liked"`
|
|
UserInfo User `json:"userInfo"`
|
|
SubCommentCount string `json:"subCommentCount"`
|
|
SubComments []Comment `json:"subComments"`
|
|
ShowTags []string `json:"showTags"`
|
|
}
|