{"record":{"id":"31c62a281b12238f","repo":"xpzouying/xiaohongshu-mcp","slug":"error-31c62a","errorCode":null,"errorMessage":"回复未确认成功：提交后未在评论区出现（可能账号被限制或发送失败）","messagePattern":"回复未确认成功：提交后未在评论区出现（可能账号被限制或发送失败）","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"xiaohongshu/comment_feed.go","lineNumber":186,"sourceCode":"\n\thumanize.Delay(ctx, humanize.AfterType)\n\n\t// 查找并点击提交按钮\n\tsubmitBtn, err := page.Element(\"div.bottom button.submit\")\n\tif err != nil {\n\t\treturn fmt.Errorf(\"无法找到提交按钮: %w\", err)\n\t}\n\n\tif err := humanize.Click(submitBtn); err != nil {\n\t\treturn fmt.Errorf(\"点击提交按钮失败: %w\", err)\n\t}\n\n\thumanize.Delay(ctx, humanize.AfterClick)\n\n\t// 就地校验：回复应在评论区渲染出现，否则判定未成功。\n\tif !waitCommentRendered(page, content, 4*time.Second) {\n\t\tlogrus.Warnf(\"回复提交后未在评论区渲染，判定未成功: feed=%s\", feedID)\n\t\treturn fmt.Errorf(\"回复未确认成功：提交后未在评论区出现（可能账号被限制或发送失败）\")\n\t}\n\n\tlogrus.Infof(\"回复评论成功并已确认\")\n\treturn nil\n}\n\n// findCommentElement 滚动查找指定评论：优先按 commentID 命中，否则按 userID 匹配。\n// 二级评论折叠在「展开 N 条回复」后面，未展开时不在 DOM 里，因此查找过程中要展开。\nfunc findCommentElement(ctx context.Context, page *rod.Page, commentID, userID string) (*rod.Element, error) {\n\tlogrus.Infof(\"开始查找评论 - commentID: %s, userID: %s\", commentID, userID)\n\n\tscrollToCommentsArea(page)\n\thumanize.Delay(ctx, humanize.BetweenScroll)\n\n\tlastCommentCount := 0\n\tstagnantChecks := 0\n\texpandRounds := 0\n\tdeadline := time.Now().Add(maxSearchDuration)","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/xpzouying/xiaohongshu-mcp/blob/332d196854a9eac0d2b8c2c0e3d0cc43139d724c/xiaohongshu/comment_feed.go#L168-L204","documentation":"ReplyToComment 的就地成功校验：点击提交后 4 秒内评论区未渲染出所发内容。代码无法区分是发送失败还是账号被限流/风控屏蔽，故提示两种可能。","triggerScenarios":"ReplyToComment 中点击提交按钮并等待 AfterClick 后，waitCommentRendered(page, content, 4s) 返回 false：回复未出现在评论区。包括服务端拒绝发送、账号被禁言/限制、或 4 秒超时太短而网络慢。","commonSituations":"账号被风控限流（提交无响应）；评论内容含 emoji/特殊字符导致 innerText 匹配不上；服务器响应慢于 4 秒；重复内容被去重拦截。","solutions":["人工检查该账号是否被禁言或限制回复，换账号验证","适当延长确认超时（把 4s 提高到 8-10s）排除网络慢导致的误判","检查回复内容是否含被转义或过滤的字符，导致 innerText 匹配失败","降低发布频率，避免触发风控；对重复内容做去重"],"exampleFix":"// before\nif !waitCommentRendered(page, content, 4*time.Second) {\n    return fmt.Errorf(\"回复未确认成功：提交后未在评论区出现（可能账号被限制或发送失败）\")\n}\n\n// after\n// 延长确认窗口，减少慢网络下的误判\nif !waitCommentRendered(page, content, 10*time.Second) {\n    return fmt.Errorf(\"回复未确认成功：提交后未在评论区出现（可能账号被限制或发送失败）\")\n}","handlingStrategy":"fallback","validationCode":"if content == \"\" || len([]rune(content)) > 500 {\n    return errors.New(\"回复内容为空或过长，跳过提交\")\n}\n// 提交前先确认账号健康（近期无禁言/限流记录）","typeGuard":null,"tryCatchPattern":"err := action.ReplyToComment(ctx, feedID, token, commentID, userID, content)\nif err != nil && strings.Contains(err.Error(), \"回复未确认成功\") {\n    // 提交结果未知：标记账号待人工核验，回滚本地\"已回复\"状态\n    markAccountNeedsReview(accountID)\n    markReplyPending(commentID)\n    return\n}\nreturn err","preventionTips":["不要把该错误当成功静默吞掉——回复状态未知，需二次核验","维护账号健康度监控，禁言/限流账号及时下线","回复内容避免高频重复文本，降低被风控概率","慢网络环境下延长确认窗口而不是立即判失败"],"tags":["verification","comment","risk-control","timeout"],"backgroundTag":"comment-submit-unconfirmed","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"}