refactor: improve comment posting logic with enhanced error handling and stability checks
- Updated the PostComment method to include error handling for navigation and element interactions. - Replaced sleep calls with more reliable wait mechanisms to ensure page stability. - Added checks for the presence of input elements and improved logging for better debugging.
This commit is contained in:
@@ -23,28 +23,66 @@ func NewCommentFeedAction(page *rod.Page) *CommentFeedAction {
|
|||||||
// PostComment 发表评论到 Feed
|
// PostComment 发表评论到 Feed
|
||||||
func (f *CommentFeedAction) PostComment(ctx context.Context, feedID, xsecToken, content string) error {
|
func (f *CommentFeedAction) PostComment(ctx context.Context, feedID, xsecToken, content string) error {
|
||||||
page := f.page.Context(ctx).Timeout(60 * time.Second)
|
page := f.page.Context(ctx).Timeout(60 * time.Second)
|
||||||
|
|
||||||
// 构建详情页 URL
|
// 构建详情页 URL
|
||||||
url := makeFeedDetailURL(feedID, xsecToken)
|
url := makeFeedDetailURL(feedID, xsecToken)
|
||||||
|
|
||||||
logrus.Infof("Opening feed detail page: %s", url)
|
logrus.Infof("Opening feed detail page: %s", url)
|
||||||
|
|
||||||
// 导航到详情页
|
// 导航到详情页
|
||||||
page.MustNavigate(url)
|
if err := page.Navigate(url); err != nil {
|
||||||
page.MustWaitDOMStable()
|
logrus.Warnf("Failed to navigate to feed detail page: %v", err)
|
||||||
time.Sleep(3 * time.Second) // 增加等待时间确保页面完全加载
|
return fmt.Errorf("无法打开帖子详情页,该帖子可能在网页端不可访问: %w", err)
|
||||||
|
}
|
||||||
// 等待评论容器加载
|
|
||||||
waitForCommentsContainer(page)
|
if err := page.WaitStable(2 * time.Second); err != nil {
|
||||||
|
logrus.Warnf("Failed to wait for page stable: %v", err)
|
||||||
elem := page.MustElement("div.input-box div.content-edit span")
|
return fmt.Errorf("页面加载超时,该帖子可能在网页端不可访问: %w", err)
|
||||||
elem.MustClick()
|
}
|
||||||
elem2 := page.MustElement("div.input-box div.content-edit p.content-input")
|
|
||||||
elem2.MustInput(content)
|
time.Sleep(1 * time.Second)
|
||||||
time.Sleep(2 * time.Second) // 增加等待时间
|
|
||||||
submitButton := page.MustElement("div.bottom button.submit")
|
// 查找评论输入框
|
||||||
submitButton.MustClick()
|
elem, err := page.Element("div.input-box div.content-edit span")
|
||||||
time.Sleep(2 * time.Second) // 增加等待时间确保提交完成
|
if err != nil {
|
||||||
|
logrus.Warnf("Failed to find comment input box: %v", err)
|
||||||
|
return fmt.Errorf("未找到评论输入框,该帖子可能不支持评论或网页端不可访问: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := elem.Click(proto.InputMouseButtonLeft, 1); err != nil {
|
||||||
|
logrus.Warnf("Failed to click comment input box: %v", err)
|
||||||
|
return fmt.Errorf("无法点击评论输入框: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
elem2, err := page.Element("div.input-box div.content-edit p.content-input")
|
||||||
|
if err != nil {
|
||||||
|
logrus.Warnf("Failed to find comment input field: %v", err)
|
||||||
|
return fmt.Errorf("未找到评论输入区域: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := elem2.Input(content); err != nil {
|
||||||
|
logrus.Warnf("Failed to input comment content: %v", err)
|
||||||
|
return fmt.Errorf("无法输入评论内容: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
|
submitButton, err := page.Element("div.bottom button.submit")
|
||||||
|
if err != nil {
|
||||||
|
logrus.Warnf("Failed to find submit button: %v", err)
|
||||||
|
return fmt.Errorf("未找到提交按钮: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := submitButton.Click(proto.InputMouseButtonLeft, 1); err != nil {
|
||||||
|
logrus.Warnf("Failed to click submit button: %v", err)
|
||||||
|
return fmt.Errorf("无法点击提交按钮: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
|
logrus.Infof("Comment posted successfully to feed: %s", feedID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReplyToComment 回复指定评论
|
// ReplyToComment 回复指定评论
|
||||||
func (f *CommentFeedAction) ReplyToComment(ctx context.Context, feedID, xsecToken, commentID, userID, content string) error {
|
func (f *CommentFeedAction) ReplyToComment(ctx context.Context, feedID, xsecToken, commentID, userID, content string) error {
|
||||||
page := f.page.Context(ctx).Timeout(60 * time.Second)
|
page := f.page.Context(ctx).Timeout(60 * time.Second)
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode"
|
||||||
|
"unicode/utf8"
|
||||||
|
|
||||||
"github.com/go-rod/rod"
|
"github.com/go-rod/rod"
|
||||||
"github.com/go-rod/rod/lib/input"
|
"github.com/go-rod/rod/lib/input"
|
||||||
@@ -55,6 +57,11 @@ func (p *PublishAction) Publish(ctx context.Context, content PublishImageContent
|
|||||||
return errors.New("图片不能为空")
|
return errors.New("图片不能为空")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trimmedContent := strings.TrimRightFunc(content.Content, unicode.IsSpace)
|
||||||
|
if utf8.RuneCountInString(trimmedContent) > 1000 {
|
||||||
|
return errors.New("正文内容不能超过1000个字符")
|
||||||
|
}
|
||||||
|
|
||||||
page := p.page.Context(ctx)
|
page := p.page.Context(ctx)
|
||||||
|
|
||||||
if err := uploadImages(page, content.ImagePaths); err != nil {
|
if err := uploadImages(page, content.ImagePaths); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user