{"record":{"id":"f7886b407b9bef60","repo":"xpzouying/xiaohongshu-mcp","slug":"w-f7886b","errorCode":null,"errorMessage":"校验失败: %w","messagePattern":"校验失败: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"browser/browser_download.go","lineNumber":112,"sourceCode":"\tvar dlErr error\n\tfor attempt := 1; attempt <= 3; attempt++ {\n\t\tif dlErr = downloadFile(browserURL(asset), archivePath); dlErr == nil {\n\t\t\tbreak\n\t\t}\n\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)","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/browser/browser_download.go#L94-L130","documentation":"EnsureBrowser 下载完成后用官方 SHA256SUMS 校验压缩包完整性失败：文件在传输中被损坏或截断，也可能是下载源返回了错误页内容。校验是完整性保护的必要步骤，失败则放弃本次下载产物。","triggerScenarios":"verifySHA256 返回任何 error：下载的 SHA256SUMS 获取失败（fetchExpectedSHA 网络错误）、本地压缩包无法读取/打开、哈希计算 io.Copy 失败。","commonSituations":"下载中断产生截断文件；SHA256SUMS 下载被防火墙拦截；缓存目录权限异常导致文件不可读。","solutions":["删除缓存目录中损坏的压缩包后重跑（触发重新下载）","确认 SHA256SUMS 的下载地址可达","检查缓存目录读写权限"],"exampleFix":"// before\nbin, err := browser.EnsureBrowser() // 校验失败\n// after\nif strings.Contains(err.Error(), \"校验失败\") {\n\tos.RemoveAll(cacheDir) // 清理损坏缓存\n\tbin, err = browser.EnsureBrowser()\n}","handlingStrategy":"retry","validationCode":"// 下载后先用本地工具预校验\n// sha256sum <archive> 与官方 SHA256SUMS 对比，一致再进入流程","typeGuard":null,"tryCatchPattern":"bin, err := browser.EnsureBrowser()\nif err != nil && strings.Contains(err.Error(), \"校验失败\") {\n\tos.RemoveAll(cacheDir) // 清理可疑缓存后重试\n\tbin, err = browser.EnsureBrowser()\n}","preventionTips":["下载中断后删除残留压缩包再重试","确保 SHA256SUMS 与资产 URL 同源同版本","定期清理浏览器缓存目录"],"tags":["checksum","integrity","download"],"backgroundTag":"checksum-verification-failed","analyzedSha":"332d196854a9eac0d2b8c2c0e3d0cc43139d724c","analyzedAt":"2026-09-05T22:22:55.988Z","contentChangedAt":"2026-09-05T22:22:55.988Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}