{"record":{"id":"e7afeb90d807b035","repo":"xpzouying/xiaohongshu-mcp","slug":"w-e7afeb","errorCode":null,"errorMessage":"解压失败: %w","messagePattern":"解压失败: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"browser/browser_download.go","lineNumber":117,"sourceCode":"\t\tlogrus.Warnf(\"下载失败（第 %d/3 次）: %v\", attempt, dlErr)\n\t\t_ = os.Remove(archivePath)\n\t\ttime.Sleep(2 * time.Second)\n\t}\n\tif dlErr != nil {\n\t\treturn \"\", fmt.Errorf(\"下载内置浏览器失败: %w\\n\"+\n\t\t\t\"  本项目只用内置浏览器，缺它不继续。请检查网络后重试；\\n\"+\n\t\t\t\"  离线环境可手动下载 %s，解压到 %s 后重启。\", dlErr, browserURL(asset), cacheDir)\n\t}\n\tdefer os.Remove(archivePath)\n\n\t// 校验 SHA256（本地已成分发点，必须校验完整性）\n\tif err := verifySHA256(archivePath, asset); err != nil {\n\t\treturn \"\", fmt.Errorf(\"校验失败: %w\", err)\n\t}\n\n\tlogrus.Infof(\"解压内置浏览器 ...\")\n\tif err := extractArchive(archivePath, cacheDir); err != nil {\n\t\treturn \"\", fmt.Errorf(\"解压失败: %w\", err)\n\t}\n\n\tbin := findBinary(cacheDir, binName)\n\tif bin == \"\" {\n\t\treturn \"\", fmt.Errorf(\"解压后未找到二进制 %s\", binName)\n\t}\n\tlogrus.Infof(\"内置浏览器就绪: %s\", bin)\n\treturn bin, nil\n}\n\n// verifySHA256 下载同目录的 SHA256SUMS，校验 asset 的哈希。\nfunc verifySHA256(archivePath, asset string) error {\n\twant, err := fetchExpectedSHA(asset)\n\tif err != nil {\n\t\treturn err\n\t}\n\tf, err := os.Open(archivePath)\n\tif err != nil {","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/browser/browser_download.go#L99-L135","documentation":"EnsureBrowser 在 SHA256 校验通过后解压浏览器压缩包到缓存目录时 extractArchive 失败：磁盘空间不足、权限问题或压缩包格式异常。","triggerScenarios":"extractArchive 出错：.tar.xz/.zip/.dmg 解压依赖缺失或库不支持该格式、目标磁盘满、缓存目录权限不足、压缩包虽校验通过但结构异常。","commonSituations":"磁盘配额耗尽的 CI/容器环境；只读文件系统挂载缓存目录；环境缺少 xz 解压依赖。","solutions":["检查磁盘剩余空间并清理","确认缓存目录（os.UserCacheDir 下）可写","手动下载资产并解压到缓存目录，跳过下载/解压路径","确认解压库支持对应格式（dmg/tar.xz/zip）"],"exampleFix":"// before\nbin, err := browser.EnsureBrowser() // 解压失败\n// after\n// 预先检查空间与可写性\nif err := checkDiskSpace(cacheDir, 500<<20); err != nil { return err }\nbin, err := browser.EnsureBrowser()","handlingStrategy":"validation","validationCode":"// 运行前检查磁盘与缓存目录可写\nf, err := os.CreateTemp(cacheDir, \".wtest\")\nif err != nil { return fmt.Errorf(\"缓存目录不可写: %w\", err) }\nf.Close(); os.Remove(f.Name())","typeGuard":null,"tryCatchPattern":null,"preventionTips":["确保缓存盘剩余空间充足","不要把缓存目录挂载为只读","确认解压库支持 dmg/tar.xz/zip 三种格式","离线环境可手动解压到缓存目录绕过该路径"],"tags":["extraction","filesystem","disk-space"],"backgroundTag":"archive-extraction-failed","analyzedSha":"332d196854a9eac0d2b8c2c0e3d0cc43139d724c","analyzedAt":"2026-09-05T22:22:55.988Z","contentChangedAt":"2026-09-05T22:22:55.988Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}