Commit 3fe25414 authored by 郭阔's avatar 郭阔

Check creator editor readiness before publishing

parent 64170d5f
package xiaohongshu package xiaohongshu
import ( import (
"net/url"
"time" "time"
"github.com/go-rod/rod" "github.com/go-rod/rod"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/xpzouying/xiaohongshu-mcp/humanize"
) )
const ( const creatorSessionTimeout = 15 * time.Second
urlOfCreatorHome = `https://creator.xiaohongshu.com/?source=official`
creatorSessionCookie = "galaxy_creator_session_id" // ensureCreatorSession verifies the authenticated editor instead of relying on a
creatorSessionTimeout = 15 * time.Second // cookie whose name and presence are controlled by the platform.
)
// ensureCreatorSession 浏览器里没有创作者中心会话时,先打开创作者中心首页,等会话建立
func ensureCreatorSession(page *rod.Page) error { func ensureCreatorSession(page *rod.Page) error {
if hasCreatorSession(page) { if err := page.Navigate(urlOfPublic); err != nil {
return nil return errors.Wrap(err, "打开创作者中心编辑器失败")
}
if err := page.Navigate(urlOfCreatorHome); err != nil {
return errors.Wrap(err, "打开创作者中心失败")
} }
deadline := time.Now().Add(creatorSessionTimeout) deadline := time.Now().Add(creatorSessionTimeout)
var lastPath string
for time.Now().Before(deadline) { for time.Now().Before(deadline) {
time.Sleep(500 * time.Millisecond) info, err := page.Info()
if hasCreatorSession(page) { if err != nil {
humanize.Delay(page.GetContext(), humanize.AfterNavigate) return errors.Wrap(err, "读取创作者中心页面地址失败")
return nil
} }
} current, err := url.Parse(info.URL)
return errors.New("创作者中心登录失效,请重新扫码登录") if err != nil {
} return errors.New("无法解析创作者中心页面地址")
func hasCreatorSession(page *rod.Page) bool {
cks, err := page.Browser().GetCookies()
if err != nil {
return false
}
for _, c := range cks {
if c.Name == creatorSessionCookie {
return true
} }
lastPath = current.Host + current.Path
if current.Scheme == "https" && current.Host == "creator.xiaohongshu.com" &&
current.Path == "/publish/publish" {
found, _, err := page.Has("div.creator-tab, .upload-input")
if err != nil {
return errors.Wrap(err, "检查创作者中心编辑器失败")
}
if found {
return nil
}
}
time.Sleep(500 * time.Millisecond)
} }
return false return errors.Errorf("创作者中心编辑器未就绪(当前页面:%s),请检查页面是否要求登录", lastPath)
} }
...@@ -54,10 +54,6 @@ func NewPublishImageAction(page *rod.Page) (*PublishAction, error) { ...@@ -54,10 +54,6 @@ func NewPublishImageAction(page *rod.Page) (*PublishAction, error) {
return nil, err return nil, err
} }
if err := pp.Navigate(urlOfPublic); err != nil {
return nil, errors.Wrap(err, "导航到发布页面失败")
}
if err := pp.WaitLoad(); err != nil { if err := pp.WaitLoad(); err != nil {
logrus.Warnf("等待页面加载出现问题: %v,继续尝试", err) logrus.Warnf("等待页面加载出现问题: %v,继续尝试", err)
} }
......
...@@ -32,10 +32,6 @@ func NewPublishVideoAction(page *rod.Page) (*PublishAction, error) { ...@@ -32,10 +32,6 @@ func NewPublishVideoAction(page *rod.Page) (*PublishAction, error) {
return nil, err return nil, err
} }
if err := pp.Navigate(urlOfPublic); err != nil {
return nil, errors.Wrap(err, "导航到发布页面失败")
}
// 使用 WaitLoad 代替 WaitIdle(更宽松) // 使用 WaitLoad 代替 WaitIdle(更宽松)
if err := pp.WaitLoad(); err != nil { if err := pp.WaitLoad(); err != nil {
logrus.Warnf("等待页面加载出现问题: %v,继续尝试", err) logrus.Warnf("等待页面加载出现问题: %v,继续尝试", err)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment