xpzouying/xiaohongshu-mcp · error

解压失败: %w

Error message

解压失败: %w

What it means

EnsureBrowser 在 SHA256 校验通过后解压浏览器压缩包到缓存目录时 extractArchive 失败:磁盘空间不足、权限问题或压缩包格式异常。

Source

Thrown at browser/browser_download.go:117

		logrus.Warnf("下载失败(第 %d/3 次): %v", attempt, dlErr)
		_ = os.Remove(archivePath)
		time.Sleep(2 * time.Second)
	}
	if dlErr != nil {
		return "", fmt.Errorf("下载内置浏览器失败: %w\n"+
			"  本项目只用内置浏览器,缺它不继续。请检查网络后重试;\n"+
			"  离线环境可手动下载 %s,解压到 %s 后重启。", dlErr, browserURL(asset), cacheDir)
	}
	defer os.Remove(archivePath)

	// 校验 SHA256(本地已成分发点,必须校验完整性)
	if err := verifySHA256(archivePath, asset); err != nil {
		return "", fmt.Errorf("校验失败: %w", err)
	}

	logrus.Infof("解压内置浏览器 ...")
	if err := extractArchive(archivePath, cacheDir); err != nil {
		return "", fmt.Errorf("解压失败: %w", err)
	}

	bin := findBinary(cacheDir, binName)
	if bin == "" {
		return "", fmt.Errorf("解压后未找到二进制 %s", binName)
	}
	logrus.Infof("内置浏览器就绪: %s", bin)
	return bin, nil
}

// verifySHA256 下载同目录的 SHA256SUMS,校验 asset 的哈希。
func verifySHA256(archivePath, asset string) error {
	want, err := fetchExpectedSHA(asset)
	if err != nil {
		return err
	}
	f, err := os.Open(archivePath)
	if err != nil {

View on GitHub (pinned to 332d196854)

Solutions

  1. 检查磁盘剩余空间并清理
  2. 确认缓存目录(os.UserCacheDir 下)可写
  3. 手动下载资产并解压到缓存目录,跳过下载/解压路径
  4. 确认解压库支持对应格式(dmg/tar.xz/zip)

Example fix

// before
bin, err := browser.EnsureBrowser() // 解压失败
// after
// 预先检查空间与可写性
if err := checkDiskSpace(cacheDir, 500<<20); err != nil { return err }
bin, err := browser.EnsureBrowser()
Defensive patterns

Strategy: validation

Validate before calling

// 运行前检查磁盘与缓存目录可写
f, err := os.CreateTemp(cacheDir, ".wtest")
if err != nil { return fmt.Errorf("缓存目录不可写: %w", err) }
f.Close(); os.Remove(f.Name())

Prevention

When it happens

Trigger: extractArchive 出错:.tar.xz/.zip/.dmg 解压依赖缺失或库不支持该格式、目标磁盘满、缓存目录权限不足、压缩包虽校验通过但结构异常。

Common situations: 磁盘配额耗尽的 CI/容器环境;只读文件系统挂载缓存目录;环境缺少 xz 解压依赖。

Related errors


AI-assisted analysis of xpzouying/xiaohongshu-mcp@332d196854 (2026-09-05). Data as JSON: /api/errors/e7afeb90d807b035. Report an issue: GitHub.