{"record":{"id":"47a8a7bbd5f85349","repo":"xpzouying/xiaohongshu-mcp","slug":"w","errorCode":null,"errorMessage":"下载内置浏览器失败: %w\n  本项目只用内置浏览器，缺它不继续。请检查网络后重试；\n  离线环境可手动下载 %s，解压到 %s 后重启。","messagePattern":"下载内置浏览器失败: %w\n  本项目只用内置浏览器，缺它不继续。请检查网络后重试；\n  离线环境可手动下载 (.+?)，解压到 (.+?) 后重启。","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"browser/browser_download.go","lineNumber":104,"sourceCode":"\n\tif err := os.MkdirAll(cacheDir, 0o755); err != nil {\n\t\treturn \"\", err\n\t}\n\n\t// 下载（重试 3 次）\n\tlogrus.Infof(\"首次运行：下载内置浏览器 %s（%s，约 140-190MB，仅一次）...\", browserVersion, asset)\n\tarchivePath := filepath.Join(cacheDir, asset)\n\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)","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/browser/browser_download.go#L86-L122","documentation":"EnsureBrowser 连续 3 次下载内置浏览器压缩包均失败（每次失败已删除半成品文件并间隔 2s 重试）。本项目只使用内置浏览器、不回退系统浏览器，所以网络不可用即无法继续；错误中附带手动下载 URL 与缓存目录供离线环境自救。","triggerScenarios":"浏览器资产下载 3 次均失败：无外网/防火墙拦截下载域名、DNS 解析失败、代理不可用、下载服务器 5xx、带宽中断导致超时。","commonSituations":"离线/内网服务器部署；公司代理未配置 HTTPS_PROXY；下载 CDN 临时故障；容器内缺少 CA 证书导致 TLS 失败。","solutions":["检查网络连通性后重试","按错误信息中的 URL 手动下载资产，解压到提示的缓存目录后重启","配置正确的代理环境变量（HTTPS_PROXY/HTTP_PROXY）","容器环境安装 ca-certificates"],"exampleFix":"// before\n./app # 下载失败\n// after\nexport HTTPS_PROXY=http://proxy:8080\n./app # 或手动下载 asset 解压到 UserCacheDir 下的缓存目录后重启","handlingStrategy":"retry","validationCode":"// 下载前探测网络可达\nresp, err := http.Head(assetURL)\nif err != nil { return fmt.Errorf(\"网络不可达: %w\", err) }\nresp.Body.Close()","typeGuard":null,"tryCatchPattern":"bin, err := browser.EnsureBrowser()\nif err != nil && strings.Contains(err.Error(), \"下载内置浏览器失败\") {\n\tslog.Warn(err.Error()) // 错误信息含手动下载 URL 与缓存目录\n\treturn manualFallback()\n}","preventionTips":["在离线环境预先手动下载资产放入缓存目录","配置正确的 HTTPS_PROXY","容器镜像内安装 ca-certificates","部署脚本里先做下载连通性探测"],"tags":["network","download","browser","offline"],"backgroundTag":"download-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"}