xpzouying/xiaohongshu-mcp · error
小红书上传视频失败
Error message
小红书上传视频失败
What it means
PublishVideo 流程中 uploadVideo 上传视频文件失败(文件不存在、找不到上传输入框或 SetFiles 失败)时被 Wrap 上抛:视频未能传到发布页,具体原因看错误链底层。
Source
Thrown at xiaohongshu/publish_video.go:64
return nil, errors.Wrap(err, "切换到上传视频失败")
}
time.Sleep(1 * time.Second)
return &PublishAction{page: pp}, nil
}
// PublishVideo 上传视频并提交
func (p *PublishAction) PublishVideo(ctx context.Context, content PublishVideoContent) error {
if content.VideoPath == "" {
return errors.New("视频不能为空")
}
// 重设超时:.Context(ctx) 会替换掉 NewPublishVideoAction 里 Timeout(300s) 的 deadline
page := p.page.Context(ctx).Timeout(300 * time.Second)
if err := uploadVideo(page, content.VideoPath); err != nil {
return errors.Wrap(err, "小红书上传视频失败")
}
if err := submitPublishVideo(ctx, page, content.Title, content.Content, content.Tags, content.ScheduleTime, content.Visibility, content.Products); err != nil {
return errors.Wrap(err, "小红书发布失败")
}
return nil
}
// uploadVideo 上传单个本地视频
func uploadVideo(page *rod.Page, videoPath string) error {
pp := page.Timeout(5 * time.Minute) // 视频处理耗时更长
if _, err := os.Stat(videoPath); os.IsNotExist(err) {
return errors.Wrapf(err, "视频文件不存在: %s", videoPath)
}
// 寻找文件上传输入框(与图文一致的 class,或退回到 input[type=file])
var fileInput *rod.ElementView on GitHub (pinned to 332d196854)
Solutions
- 上传前用 os.Stat 校验 VideoPath 存在且转为绝对路径(filepath.Abs),并检查扩展名/大小
- 确认已完成「上传视频」tab 切换(NewPublishVideoAction 返回成功)再调 PublishVideo
- 确认视频格式为 mp4/mov 且时长、大小符合平台限制,必要时转码
- 延长 uploadVideo 的超时(>5 分钟)或改善网络环境后重试
Example fix
// before
if err := uploadVideo(page, content.VideoPath); err != nil {
return errors.Wrap(err, "小红书上传视频失败")
}
// after
absPath, err := filepath.Abs(content.VideoPath)
if err != nil {
return errors.Wrap(err, "解析视频路径失败")
}
if fi, statErr := os.Stat(absPath); statErr != nil {
return errors.Wrapf(statErr, "视频文件不存在: %s", absPath)
} else if fi.Size() == 0 {
return errors.New("视频文件为空")
}
if err := uploadVideo(page, absPath); err != nil {
return errors.Wrap(err, "小红书上传视频失败")
} Defensive patterns
Strategy: validation
Validate before calling
func validateVideo(path string) error {
abs, err := filepath.Abs(path)
if err != nil {
return err
}
fi, err := os.Stat(abs)
if err != nil {
return fmt.Errorf("视频不存在: %w", err)
}
if fi.Size() == 0 {
return errors.New("视频文件为空")
}
if fi.Size() > 2<<30 {
return errors.New("视频超过平台大小限制")
}
ext := strings.ToLower(filepath.Ext(abs))
if ext != ".mp4" && ext != ".mov" {
return fmt.Errorf("不支持的视频格式: %s", ext)
}
return nil
} Try / catch
if err := action.PublishVideo(ctx, content); err != nil {
if strings.Contains(err.Error(), "视频文件不存在") {
return fmt.Errorf("请检查 VideoPath 配置: %w", err)
}
if strings.Contains(err.Error(), "未找到视频上传输入框") {
// 页面状态问题:重建 action 后重试一次
action, nerr := NewPublishVideoAction(page)
if nerr != nil {
return nerr
}
return action.PublishVideo(ctx, content)
}
return err
} Prevention
- 发布前统一做内容预检:路径存在、非空、格式/大小合规
- 使用绝对路径传入 VideoPath
- 确保 NewPublishVideoAction 成功后再调用 PublishVideo
- 上传耗时操作设置充足的 context deadline 并与库内超时协调
When it happens
Trigger: content.VideoPath 指向的文件不存在(os.Stat 失败);页面找不到 .upload-input 或 input[type='file'];input.SetFiles 失败;视频过大或格式不受支持导致平台处理异常;5 分钟上传超时到期。
Common situations: 传入的是相对路径而工作目录不对;视频文件在上传前被移动/删除;页面仍在「上传图文」tab 没有视频上传入口(前面切换 tab 失败但被继续执行);视频编码/分辨率不符合小红书要求;网络慢大文件上传超时。
Related errors
AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05).
Data as JSON: /api/errors/83c272e526817258.
Report an issue: GitHub.