From 0e4450b12cf8d3608269967acf20b710be5cfd49 Mon Sep 17 00:00:00 2001 From: zy Date: Sun, 17 Aug 2025 15:30:16 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=94=B9=E8=BF=9B=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E5=AE=9E=E4=BE=8B=E7=AE=A1=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E6=8C=89=E9=9C=80=E5=88=9B=E5=BB=BA=E6=B5=8F=E8=A7=88=E5=99=A8?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=20(#12)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除全局浏览器单例,改为按需创建浏览器实例 - 添加 configs/browser.go 用于管理无头模式配置 - 更新 service.go 中所有方法,每次调用时创建新的浏览器实例 - 更新测试文件,使用新的浏览器管理方式 - 确保每个浏览器实例使用后正确关闭,避免资源泄漏 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Claude --- browser/browser.go | 19 ++----------------- cmd/login/main.go | 10 ++++------ configs/browser.go | 14 ++++++++++++++ main.go | 8 ++------ service.go | 19 +++++++++++++------ xiaohongshu/feeds_test.go | 6 +++--- xiaohongshu/publish_test.go | 6 +++--- 7 files changed, 41 insertions(+), 41 deletions(-) create mode 100644 configs/browser.go diff --git a/browser/browser.go b/browser/browser.go index b1c79cb..0cd380b 100644 --- a/browser/browser.go +++ b/browser/browser.go @@ -1,17 +1,12 @@ package browser import ( - "github.com/go-rod/rod" "github.com/sirupsen/logrus" "github.com/xpzouying/headless_browser" "github.com/xpzouying/xiaohongshu-mcp/cookies" ) -var ( - browser *headless_browser.Browser -) - -func Init(headless bool) error { +func NewBrowser(headless bool) *headless_browser.Browser { opts := []headless_browser.Option{ headless_browser.WithHeadless(headless), @@ -28,15 +23,5 @@ func Init(headless bool) error { logrus.Warnf("failed to load cookies: %v", err) } - browser = headless_browser.New(opts...) - - return nil -} - -func NewPage() *rod.Page { - return browser.NewPage() -} - -func Close() { - browser.Close() + return headless_browser.New(opts...) } diff --git a/cmd/login/main.go b/cmd/login/main.go index 49592c0..a096203 100644 --- a/cmd/login/main.go +++ b/cmd/login/main.go @@ -13,13 +13,11 @@ import ( func main() { - headlessModel := false - if err := browser.Init(headlessModel); err != nil { - logrus.Fatalf("failed to init browser: %v", err) - } - defer browser.Close() + // 登录的时候,需要界面,所以不能无头模式 + b := browser.NewBrowser(false) + defer b.Close() - page := browser.NewPage() + page := b.NewPage() defer page.Close() action := xiaohongshu.NewLogin(page) diff --git a/configs/browser.go b/configs/browser.go new file mode 100644 index 0000000..0e80071 --- /dev/null +++ b/configs/browser.go @@ -0,0 +1,14 @@ +package configs + +var ( + useHeadless = true +) + +func InitHeadless(h bool) { + useHeadless = h +} + +// IsHeadless 是否无头模式。 +func IsHeadless() bool { + return useHeadless +} diff --git a/main.go b/main.go index b4c101e..2b2d6a0 100644 --- a/main.go +++ b/main.go @@ -3,9 +3,8 @@ package main import ( "flag" - "github.com/xpzouying/xiaohongshu-mcp/browser" - "github.com/sirupsen/logrus" + "github.com/xpzouying/xiaohongshu-mcp/configs" ) func main() { @@ -16,10 +15,7 @@ func main() { flag.BoolVar(&headless, "headless", true, "是否无头模式") flag.Parse() - if err := browser.Init(headless); err != nil { - logrus.Fatalf("failed to init browser: %v", err) - } - defer browser.Close() + configs.InitHeadless(headless) if err := startServer(); err != nil { logrus.Fatalf("failed to run server: %v", err) diff --git a/service.go b/service.go index 104dd53..6bc2ce1 100644 --- a/service.go +++ b/service.go @@ -47,9 +47,12 @@ type FeedsListResponse struct { // CheckLoginStatus 检查登录状态 func (s *XiaohongshuService) CheckLoginStatus(ctx context.Context) (*LoginStatusResponse, error) { - // 使用全局单例浏览器创建新页面 - page := browser.NewPage() + b := browser.NewBrowser(configs.IsHeadless()) + defer b.Close() + + page := b.NewPage() defer page.Close() + loginAction := xiaohongshu.NewLogin(page) isLoggedIn, err := loginAction.CheckLoginStatus(ctx) @@ -103,8 +106,10 @@ func (s *XiaohongshuService) processImages(images []string) ([]string, error) { // publishContent 执行内容发布 func (s *XiaohongshuService) publishContent(ctx context.Context, content xiaohongshu.PublishImageContent) error { - // 使用全局单例浏览器创建新页面 - page := browser.NewPage() + b := browser.NewBrowser(configs.IsHeadless()) + defer b.Close() + + page := b.NewPage() defer page.Close() action, err := xiaohongshu.NewPublishImageAction(page) @@ -118,8 +123,10 @@ func (s *XiaohongshuService) publishContent(ctx context.Context, content xiaohon // ListFeeds 获取Feeds列表 func (s *XiaohongshuService) ListFeeds(ctx context.Context) (*FeedsListResponse, error) { - // 使用全局单例浏览器创建新页面 - page := browser.NewPage() + b := browser.NewBrowser(configs.IsHeadless()) + defer b.Close() + + page := b.NewPage() defer page.Close() // 创建 Feeds 列表 action diff --git a/xiaohongshu/feeds_test.go b/xiaohongshu/feeds_test.go index bf7fac9..6ec0695 100644 --- a/xiaohongshu/feeds_test.go +++ b/xiaohongshu/feeds_test.go @@ -14,10 +14,10 @@ func TestGetFeedsList(t *testing.T) { t.Skip("SKIP: 测试发布") - _ = browser.Init(false) - defer browser.Close() + b := browser.NewBrowser(false) + defer b.Close() - page := browser.NewPage() + page := b.NewPage() defer page.Close() // NewFeedsListAction 内部已经处理导航 diff --git a/xiaohongshu/publish_test.go b/xiaohongshu/publish_test.go index ba9ba6e..e5248fc 100644 --- a/xiaohongshu/publish_test.go +++ b/xiaohongshu/publish_test.go @@ -14,10 +14,10 @@ func TestPublish(t *testing.T) { t.Skip("SKIP: 测试发布") - _ = browser.Init(false) - defer browser.Close() + b := browser.NewBrowser(false) + defer b.Close() - page := browser.NewPage() + page := b.NewPage() defer page.Close() action, err := NewPublishImageAction(page)