From d84bf2e9a2c88b4a8eb0aa15340e1c7f997f07fd Mon Sep 17 00:00:00 2001 From: zy Date: Sat, 4 Oct 2025 23:22:28 +0800 Subject: [PATCH] update rm popup window (#202) --- xiaohongshu/publish.go | 114 ++++++++++++++++++++++++++++------------- 1 file changed, 77 insertions(+), 37 deletions(-) diff --git a/xiaohongshu/publish.go b/xiaohongshu/publish.go index 1cf126f..a8d1439 100644 --- a/xiaohongshu/publish.go +++ b/xiaohongshu/publish.go @@ -38,7 +38,10 @@ func NewPublishImageAction(page *rod.Page) (*PublishAction, error) { pp.MustNavigate(urlOfPublic).MustWaitIdle().MustWaitDOMStable() time.Sleep(1 * time.Second) - mustClickPublishTab(page, "上传图文") + if err := mustClickPublishTab(page, "上传图文"); err != nil { + logrus.Errorf("点击上传图文 TAB 失败: %v", err) + return nil, err + } time.Sleep(1 * time.Second) @@ -77,62 +80,99 @@ func removePopCover(page *rod.Page) { } // 兜底:点击一下空位置吧 - clickEmptyPosition(page) // 点击空位置 + clickEmptyPosition(page) } func clickEmptyPosition(page *rod.Page) { x := 380 + rand.Intn(100) y := 20 + rand.Intn(60) page.Mouse.MustMoveTo(float64(x), float64(y)).MustClick(proto.InputMouseButtonLeft) - logrus.Infof("点击空位置: x=%d, y=%d", x, y) } func mustClickPublishTab(page *rod.Page, tabname string) error { - - removePopCover(page) // 移除弹窗封面 - page.MustElement(`div.upload-content`).MustWaitVisible() - time.Sleep(1 * time.Second) - - createElems := page.MustElements("div.creator-tab") - - // 过滤掉隐藏的元素 - var visibleElems []*rod.Element - for _, elem := range createElems { - if isElementVisible(elem) { - visibleElems = append(visibleElems, elem) - } - } - - if len(visibleElems) == 0 { - return errors.Errorf("没有找到发布 TAB - %s", tabname) - } - - var clicked bool - - for _, elem := range visibleElems { - text, err := elem.Text() + deadline := time.Now().Add(15 * time.Second) + for time.Now().Before(deadline) { + tab, blocked, err := getTabElement(page, tabname) if err != nil { - logrus.Errorf("获取元素文本失败: %v", err) + logrus.Warnf("获取发布 TAB 元素失败: %v", err) + time.Sleep(200 * time.Millisecond) continue } - if text == tabname { - if err := elem.Click(proto.InputMouseButtonLeft, 1); err != nil { - logrus.Errorf("点击元素失败: %v", err) - continue - } - clicked = true - break + if tab == nil { + time.Sleep(200 * time.Millisecond) + continue } + + if blocked { + logrus.Info("发布 TAB 被遮挡,尝试移除遮挡") + removePopCover(page) + time.Sleep(200 * time.Millisecond) + continue + } + + if err := tab.Click(proto.InputMouseButtonLeft, 1); err != nil { + logrus.Warnf("点击发布 TAB 失败: %v", err) + time.Sleep(200 * time.Millisecond) + continue + } + + return nil } - if !clicked { - return errors.Errorf("没有找到发布 TAB - %s", tabname) + return errors.Errorf("没有找到发布 TAB - %s", tabname) +} + +func getTabElement(page *rod.Page, tabname string) (*rod.Element, bool, error) { + elems, err := page.Elements("div.creator-tab") + if err != nil { + return nil, false, err } - return nil + for _, elem := range elems { + if !isElementVisible(elem) { + continue + } + + text, err := elem.Text() + if err != nil { + logrus.Debugf("获取发布 TAB 文本失败: %v", err) + continue + } + + if strings.TrimSpace(text) != tabname { + continue + } + + blocked, err := isElementBlocked(elem) + if err != nil { + return nil, false, err + } + + return elem, blocked, nil + } + + return nil, false, nil +} + +func isElementBlocked(elem *rod.Element) (bool, error) { + result, err := elem.Eval(`() => { + const rect = this.getBoundingClientRect(); + if (rect.width === 0 || rect.height === 0) { + return true; + } + const x = rect.left + rect.width / 2; + const y = rect.top + rect.height / 2; + const target = document.elementFromPoint(x, y); + return !(target === this || this.contains(target)); + }`) + if err != nil { + return false, err + } + + return result.Value.Bool(), nil } func uploadImages(page *rod.Page, imagesPaths []string) error {