xpzouying/xiaohongshu-mcp · error

解压后未找到二进制 %s

Error message

解压后未找到二进制 %s

What it means

EnsureBrowser 解压成功后在缓存目录中 findBinary 找不到预期名称的二进制文件(binName):压缩包内容结构与预期不符,或解压产物路径与查找规则不匹配,属打包/版本错位问题。

Source

Thrown at browser/browser_download.go:122

		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 {
		return err
	}
	defer f.Close()
	h := sha256.New()
	if _, err := io.Copy(h, f); err != nil {

View on GitHub (pinned to 332d196854)

Solutions

  1. 解压后手动检查缓存目录结构,确认二进制实际名称与位置
  2. 更新 findBinary 的搜索逻辑以匹配新布局
  3. 清空缓存目录重新下载,排除旧版本残留干扰

Example fix

// before
return "", fmt.Errorf("解压后未找到二进制 %s", binName)
// after
return "", fmt.Errorf("解压后未找到二进制 %s (cache: %s)", binName, cacheDir)
Defensive patterns

Strategy: validation

Validate before calling

// 升级浏览器资产后先本地解压验证产物
// tar -tf linux-x64.tar.xz | grep -E 'chrome$' 确认二进制路径

Prevention

When it happens

Trigger: extractArchive 解压出的目录结构与 findBinary 搜索逻辑不匹配:资产版本更新后内部路径变化、解压多套一层目录、二进制文件名变更(如 chrome → chrome-headless-shell)。

Common situations: 上游浏览器版本升级改变了压缩包内部结构;手动放置文件时目录层级不对;解压未保留可执行位导致 findBinary 判断失败。

Related errors


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