# Xiaohongshu Automation

> 小红书自动化控制 - 通过 Playwright CDP 连接 OpenClaw 浏览器实现发布、搜索、评论等功能

- Skill: `wrt820232/xiaohongshu-automation` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add wrt820232/xiaohongshu-automation`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wrt820232/xiaohongshu-automation/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: wrt820232 (https://skillmd.com/u/wrt820232)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wrt820232/xiaohongshu-automation

---


# 小红书自动化控制 Skill

## 概述

通过 Playwright MCP 工具连接到 OpenClaw 浏览器（CDP 端口 18800），实现小红书的自动化操作，包括发布内容、搜索、获取推荐、评论等功能。

## 前置条件

1. **OpenClaw 浏览器已启动**：确保 OpenClaw 浏览器运行并开启 CDP 端口 18800
2. **已登录小红书**：首次使用需在 OpenClaw 浏览器中手动登录小红书账号
3. **Playwright MCP 可用**：确保 `mcp__Playwright__*` 工具集已配置

## 连接方式

使用 Playwright 的 `browser_run_code` 工具通过 CDP 连接到 OpenClaw 浏览器：

```javascript
// 连接到 OpenClaw 浏览器
const { chromium } = require('playwright');
const browser = await chromium.connectOverCDP('http://localhost:18800');
const context = browser.contexts()[0];
const page = context.pages()[0] || await context.newPage();
```

## 功能清单

| 功能 | 参数 | 说明 |
|------|------|------|
| `check_login_status` | 无 | 检查小红书登录状态 |
| `publish_content` | title, content, images | 发布图文内容 |
| `publish_with_video` | title, content, video | 发布视频内容 |
| `list_feeds` | 无 | 获取首页推荐列表 |
| `search_feeds` | keyword | 搜索小红书内容 |
| `get_feed_detail` | feed_id, xsec_token | 获取帖子详情 |
| `post_comment_to_feed` | feed_id, xsec_token, content | 发表评论 |
| `user_profile` | user_id, xsec_token | 获取用户主页信息 |
| `get_hot_topics` | category (可选) | 获取热门话题列表 |
| `download_stock_images` | keyword, count | 从图库下载无水印图片 |

---

## 功能实现指南

### 1. check_login_status - 检查登录状态

**步骤：**
1. 使用 `mcp__Playwright__browser_navigate` 导航到 `https://www.xiaohongshu.com`
2. 使用 `mcp__Playwright__browser_snapshot` 获取页面快照
3. 检查快照中是否包含用户头像或登录按钮
4. 返回登录状态

**实现代码：**
```javascript
async (page) => {
  await page.goto('https://www.xiaohongshu.com');
  await page.waitForLoadState('networkidle');

  // 检查是否有登录用户的头像
  const userAvatar = await page.$('.user-avatar, .login-btn');
  const isLoggedIn = await page.$('.user-avatar') !== null;

  return { isLoggedIn, message: isLoggedIn ? '已登录' : '未登录，请先登录' };
}
```

---

### 2. publish_content - 发布图文内容

**参数：**
- `title` (必需): 标题，**不超过 20 字**
- `content` (必需): 正文内容，**不超过 1000 字**
- `images` (必需): 图片数组，支持本地绝对路径或 HTTP 链接

**步骤：**
1. 导航到发布页面 `https://creator.xiaohongshu.com/publish/publish`
2. 等待页面加载完成
3. 上传图片（点击上传区域，选择文件）
4. 填写标题
5. 填写正文内容
6. 点击发布按钮
7. 等待发布完成

**实现代码：**
```javascript
async (page) => {
  const title = '你的标题';  // ≤20字
  const content = '你的正文内容';  // ≤1000字
  const images = ['/path/to/image1.jpg', '/path/to/image2.jpg'];

  // 1. 导航到发布页面
  await page.goto('https://creator.xiaohongshu.com/publish/publish');
  await page.waitForLoadState('networkidle');

  // 2. 上传图片
  const uploadInput = await page.$('input[type="file"]');
  await uploadInput.setInputFiles(images);
  await page.waitForTimeout(3000); // 等待上传完成

  // 3. 填写标题
  const titleInput = await page.$('[placeholder*="标题"]');
  await titleInput.fill(title);

  // 4. 填写正文
  const contentInput = await page.$('[placeholder*="正文"], .ql-editor');
  await contentInput.fill(content);

  // 5. 点击发布
  const publishBtn = await page.$('button:has-text("发布")');
  await publishBtn.click();

  // 6. 等待发布完成
  await page.waitForTimeout(5000);

  return { success: true, message: '发布成功' };
}
```

**使用 Playwright MCP 工具的方式：**
```
1. mcp__Playwright__browser_navigate: url="https://creator.xiaohongshu.com/publish/publish"
2. mcp__Playwright__browser_snapshot: 获取页面结构
3. mcp__Playwright__browser_file_upload: paths=["/path/to/image.jpg"]
4. mcp__Playwright__browser_type: ref="标题输入框ref", text="标题内容"
5. mcp__Playwright__browser_type: ref="正文输入框ref", text="正文内容"
6. mcp__Playwright__browser_click: ref="发布按钮ref"
```

---

### 3. publish_with_video - 发布视频内容

**参数：**
- `title` (必需): 标题，**不超过 20 字**
- `content` (必需): 正文内容，**不超过 1000 字**
- `video` (必需): 视频文件**本地绝对路径**（不支持 HTTP 链接）

**步骤：**
1. 导航到发布页面
2. 上传视频文件
3. **等待视频处理完成**（可能需要较长时间）
4. 填写标题和正文
5. 点击发布

**注意事项：**
- 仅支持本地视频文件
- 视频处理时间较长，建议文件大小不超过 1GB
- 需要等待视频处理完成后才能发布

---

### 4. list_feeds - 获取首页推荐列表

**步骤：**
1. 导航到 `https://www.xiaohongshu.com`
2. 等待页面加载
3. 获取页面快照
4. 解析推荐列表中的帖子信息

**返回数据结构：**
```json
{
  "feeds": [
    {
      "feed_id": "帖子ID",
      "xsec_token": "安全令牌",
      "title": "帖子标题",
      "author": "作者名称",
      "likes": "点赞数",
      "cover_url": "封面图URL"
    }
  ]
}
```

**实现代码：**
```javascript
async (page) => {
  await page.goto('https://www.xiaohongshu.com');
  await page.waitForLoadState('networkidle');

  // 获取推荐列表
  const feeds = await page.$$eval('.note-item, .feed-item', items => {
    return items.map(item => ({
      feed_id: item.getAttribute('data-id') || item.querySelector('a')?.href?.match(/\/explore\/(\w+)/)?.[1],
      title: item.querySelector('.title')?.textContent,
      author: item.querySelector('.author')?.textContent,
      likes: item.querySelector('.like-count')?.textContent
    }));
  });

  return { feeds };
}
```

---

### 5. search_feeds - 搜索小红书内容

**参数：**
- `keyword` (必需): 搜索关键词

**步骤：**
1. 导航到搜索页面 `https://www.xiaohongshu.com/search_result?keyword={keyword}`
2. 等待搜索结果加载
3. 解析搜索结果列表
4. 返回帖子列表（包含 feed_id 和 xsec_token）

**实现代码：**
```javascript
async (page) => {
  const keyword = '搜索关键词';

  await page.goto(`https://www.xiaohongshu.com/search_result?keyword=${encodeURIComponent(keyword)}`);
  await page.waitForLoadState('networkidle');

  // 解析搜索结果
  const results = await page.$$eval('.note-item', items => {
    return items.map(item => {
      const link = item.querySelector('a')?.href || '';
      const match = link.match(/\/explore\/(\w+)\?xsec_token=([^&]+)/);
      return {
        feed_id: match?.[1],
        xsec_token: match?.[2],
        title: item.querySelector('.title')?.textContent,
        author: item.querySelector('.author')?.textContent
      };
    });
  });

  return { keyword, results };
}
```

---

### 6. get_feed_detail - 获取帖子详情

**参数：**
- `feed_id` (必需): 帖子 ID
- `xsec_token` (必需): 安全令牌（从 list_feeds 或 search_feeds 获取）

**步骤：**
1. 导航到帖子详情页 `https://www.xiaohongshu.com/explore/{feed_id}?xsec_token={xsec_token}`
2. 等待页面加载
3. 获取帖子内容、互动数据、评论列表

**返回数据结构：**
```json
{
  "feed_id": "帖子ID",
  "title": "标题",
  "content": "正文内容",
  "images": ["图片URL数组"],
  "author": {
    "user_id": "用户ID",
    "nickname": "昵称",
    "avatar": "头像URL"
  },
  "stats": {
    "likes": "点赞数",
    "collects": "收藏数",
    "comments": "评论数",
    "shares": "分享数"
  },
  "comments": [
    {
      "user": "评论用户",
      "content": "评论内容",
      "time": "评论时间"
    }
  ]
}
```

---

### 7. post_comment_to_feed - 发表评论

**参数：**
- `feed_id` (必需): 帖子 ID
- `xsec_token` (必需): 安全令牌
- `content` (必需): 评论内容

**步骤：**
1. 导航到帖子详情页
2. 定位评论输入框
3. 输入评论内容
4. 点击发送按钮
5. 等待评论发布成功

**实现代码：**
```javascript
async (page) => {
  const feed_id = '帖子ID';
  const xsec_token = '安全令牌';
  const comment = '评论内容';

  await page.goto(`https://www.xiaohongshu.com/explore/${feed_id}?xsec_token=${xsec_token}`);
  await page.waitForLoadState('networkidle');

  // 定位评论输入框
  const commentInput = await page.$('[placeholder*="评论"], .comment-input');
  await commentInput.click();
  await commentInput.fill(comment);

  // 点击发送
  const sendBtn = await page.$('button:has-text("发送"), .send-btn');
  await sendBtn.click();

  await page.waitForTimeout(2000);

  return { success: true, message: '评论发布成功' };
}
```

---

### 8. user_profile - 获取用户主页信息

**参数：**
- `user_id` (必需): 用户 ID
- `xsec_token` (必需): 安全令牌

**步骤：**
1. 导航到用户主页 `https://www.xiaohongshu.com/user/profile/{user_id}?xsec_token={xsec_token}`
2. 获取用户基本信息
3. 获取统计数据
4. 获取笔记列表

**返回数据结构：**
```json
{
  "user_id": "用户ID",
  "nickname": "昵称",
  "bio": "简介",
  "avatar": "头像URL",
  "verified": "是否认证",
  "stats": {
    "following": "关注数",
    "followers": "粉丝数",
    "likes": "获赞数",
    "notes": "笔记数"
  },
  "notes": [
    {
      "feed_id": "笔记ID",
      "title": "标题",
      "cover": "封面图"
    }
  ]
}
```

---

### 9. get_hot_topics - 获取热门话题

**参数：**
- `category` (可选): 话题分类，可选值：美食、美妆、时尚、出行、知识、兴趣爱好

**入口URL：**
`https://creator.xiaohongshu.com/new/inspiration`

**步骤：**
1. 导航到创作者中心笔记灵感页面
2. 等待页面加载完成
3. 如果指定了分类，点击对应分类标签
4. 解析热门话题列表

**返回数据结构：**
```json
{
  "category": "美食",
  "topics": [
    {
      "name": "早餐吃什么",
      "participants": "275.9万人",
      "views": "101.6亿次",
      "hot_notes": [
        {
          "title": "十分钟搞定✅好吃到光盘的番茄荷包蛋焖面‼️",
          "likes": "4.3万"
        }
      ]
    },
    {
      "name": "高颜值巧克力",
      "participants": "27.9万人",
      "views": "13.5亿次",
      "hot_notes": [...]
    }
  ]
}
```

**实现代码：**
```javascript
async (page) => {
  const category = '美食'; // 可选：美食、美妆、时尚、出行、知识、兴趣爱好

  // 1. 导航到笔记灵感页面
  await page.goto('https://creator.xiaohongshu.com/new/inspiration');
  await page.waitForLoadState('networkidle');

  // 2. 如果指定分类，点击分类标签
  if (category) {
    const categoryTab = await page.$(`h6:has-text("${category}")`);
    if (categoryTab) await categoryTab.click();
    await page.waitForTimeout(1000);
  }

  // 3. 解析话题列表
  const topics = await page.$$eval('[class*="topic-card"]', cards => {
    return cards.map(card => ({
      name: card.querySelector('[class*="topic-name"]')?.textContent,
      participants: card.querySelector('[class*="participants"]')?.textContent,
      views: card.querySelector('[class*="views"]')?.textContent
    }));
  });

  return { category, topics };
}
```

**使用 Playwright MCP 工具的方式：**
```
1. mcp__Playwright__browser_navigate: url="https://creator.xiaohongshu.com/new/inspiration"
2. mcp__Playwright__browser_wait_for: time=2
3. mcp__Playwright__browser_snapshot: 获取页面结构
4. 解析快照中的话题信息
```

**可用分类：**
| 分类 | 包含话题示例 |
|------|-------------|
| 美食 | 早餐吃什么、高颜值巧克力、面条的花式做法、咖啡topping |
| 美妆 | 化妆教程、护肤心得、美甲分享 |
| 时尚 | 穿搭分享、包包推荐、饰品搭配 |
| 出行 | 旅行攻略、酒店推荐、景点打卡 |
| 知识 | 学习方法、职场技能、理财知识 |
| 兴趣爱好 | 手工DIY、摄影技巧、宠物日常 |

---

### 10. download_stock_images - 下载无水印图片

**参数：**
- `keyword` (必需): 搜索关键词（必须用英文）
- `count` (可选): 下载数量，默认 3 张
- `save_dir` (可选): 保存目录，默认当前项目目录

**图片来源：Unsplash（唯一来源）**

Unsplash 是全球最大的免费高清图库，所有图片均可免费商用，无需标注来源。

**方式一：使用 Playwright 从 Unsplash 下载**

```javascript
async (page) => {
  const keyword = 'coffee shop'; // 搜索关键词（英文）
  const count = 3; // 下载数量
  const saveDir = '/Users/zee/Desktop/小红书自动化控制/images';

  // 1. 导航到 Unsplash 搜索页
  await page.goto(`https://unsplash.com/s/photos/${encodeURIComponent(keyword)}`);
  await page.waitForLoadState('networkidle');
  await page.waitForTimeout(2000);

  // 2. 获取图片下载链接
  const imageUrls = await page.$$eval('figure a[itemprop="contentUrl"]', (links, max) => {
    return links.slice(0, max).map(link => link.href + '/download?force=true');
  }, count);

  // 3. 逐个下载图片
  for (let i = 0; i < imageUrls.length; i++) {
    const downloadPage = await page.context().newPage();
    await downloadPage.goto(imageUrls[i]);
    // 图片会自动下载到默认下载目录
    await downloadPage.waitForTimeout(3000);
    await downloadPage.close();
  }

  return { success: true, count: imageUrls.length };
}
```

**方式二：使用 Unsplash Source API（简单直接）**

```bash
# 从 Unsplash 随机下载指定主题的图片
keyword="coffee,cafe"  # 用逗号分隔多个关键词
save_dir="/Users/zee/Desktop/小红书自动化控制/images"
mkdir -p "$save_dir"

# 下载 3 张 1080x1440 的竖版图片（适合小红书 3:4 比例）
for i in 1 2 3; do
  curl -L "https://source.unsplash.com/random/1080x1440/?${keyword}" \
    -o "${save_dir}/unsplash_$(date +%s)_${i}.jpg"
  echo "Downloaded image ${i}"
  sleep 2  # 避免请求过快，确保获取不同图片
done

echo "Done! Images saved to ${save_dir}"
```

**方式三：使用 Unsplash API（需要免费 API Key，推荐）**

1. 注册获取 API Key: https://unsplash.com/developers
2. 使用以下代码：

```bash
# Unsplash API 下载（更精准的搜索结果）
ACCESS_KEY="your_unsplash_access_key"
keyword="coffee shop dali"
save_dir="/Users/zee/Desktop/小红书自动化控制/images"
mkdir -p "$save_dir"

# 搜索图片
response=$(curl -s -H "Authorization: Client-ID ${ACCESS_KEY}" \
  "https://api.unsplash.com/search/photos?query=${keyword}&per_page=3&orientation=portrait")

# 解析并下载原图
echo "$response" | jq -r '.results[].urls.full' | while read url; do
  filename="${save_dir}/unsplash_$(date +%s%N).jpg"
  curl -L "$url" -o "$filename"
  echo "Downloaded: $filename"
  sleep 1
done
```

**Playwright MCP 工具实现步骤：**

```
1. mcp__Playwright__browser_navigate: url="https://unsplash.com/s/photos/coffee"
2. mcp__Playwright__browser_wait_for: time=2
3. mcp__Playwright__browser_snapshot: 获取页面结构，找到图片链接
4. mcp__Playwright__browser_click: 点击下载按钮
5. 或者直接获取图片 URL 后用 curl 下载
```

**关键词转换规则：**

根据话题/主题内容，AI 自动将中文转换为合适的英文搜索关键词。

**转换原则：**
1. 将中文话题翻译成对应的英文词汇
2. 添加相关的场景词（如 photography, aesthetic, lifestyle）
3. 使用 2-4 个关键词组合，用空格分隔
4. 优先使用具体、描述性的词汇

**自动转换示例：**
```
话题: "早餐吃什么" → 关键词: "breakfast food morning meal"
话题: "咖啡探店" → 关键词: "coffee shop cafe interior latte"
话题: "穿搭分享" → 关键词: "outfit fashion style ootd"
话题: "旅行攻略" → 关键词: "travel landscape adventure"
话题: "家居装饰" → 关键词: "home interior decor cozy"
```

**图片尺寸参数：**

| 参数 | 尺寸 | 适用场景 |
|------|------|---------|
| `1080x1440` | 3:4 竖版 | 小红书推荐比例 |
| `1080x1080` | 1:1 方形 | 小红书方形图 |
| `1440x1080` | 4:3 横版 | 横版展示 |
| `1920x1080` | 16:9 宽屏 | 视频封面 |

**完整工作流程示例：**
```
用户: 获取最新的小红书热点，发布图文并且寻找配图

AI 执行步骤:
1. 调用 get_hot_topics 获取热门话题
   → 获取到话题: "早餐吃什么"

2. 将话题转换为英文关键词
   → "breakfast food morning delicious"

3. 调用 Unsplash 搜索并下载相关图片
   → searchAndDownload("breakfast food morning", "./images", 3, {orientation: "portrait"})

4. 根据话题生成文章内容
   → 标题、正文、推荐话题标签

5. 使用下载的图片发布到小红书
   → publish_content(title, content, images)
```

**注意事项：**
- Unsplash 图片完全免费商用，无需标注来源
- AI 根据话题内容智能生成英文关键词，无需固定映射表
- 下载间隔建议 2 秒以上，避免被限流
- 小红书推荐使用 3:4 竖版图片（orientation: portrait）

---

## AI 内容生成提示词

### 评论生成提示词

生成评论时使用以下提示词，确保评论自然、真实：

```
你是一个小红书用户，正在浏览别人的帖子。请根据以下文章内容，写一条真实、自然的评论。

要求：
1. 像真人一样说话，口语化，不要书面语
2. 适当使用表情符号（1-3个即可，如😂🔥👍❤️✨😭）
3. 评论要和文章内容强相关，提到文章中的具体细节
4. 长度适中，1-2句话，不超过50字
5. 可以表达：共鸣、提问、分享类似经历、表示想去/想试
6. 使用口语词汇如："绝了"、"太真实了"、"蹲一个"、"马住"、"冲了"、"爱住"、"救命"、"笑死"
7. 不要用"哈哈哈"开头，不要太夸张
8. 偶尔可以用不完整句子或省略主语

文章标题：{title}
文章内容：{content}

直接输出评论内容，不要任何解释或引号：
```

**评论示例（好的）：**
- "5r美式也太香了吧 下次去大理必冲！"
- "救命这个院子就是我梦想中的样子😭"
- "蹲一个具体地址 想去打卡"
- "同款体验！上次去也是一呆一下午"
- "看完立马收藏了 下个月就去✨"

**评论示例（不好的）：**
- "哈哈哈哈哈写得真好！" ❌ 太空洞
- "感谢博主的分享，非常有帮助！" ❌ 太正式
- "这篇文章写得很详细，我学到了很多。" ❌ 像机器人

---

### 发布文章提示词

生成小红书文章时使用以下提示词：

```
你是一个小红书博主，正在分享自己的真实体验。请根据主题写一篇小红书笔记。

要求：
1. 标题：不超过20字，要有吸引力，可用｜分隔，适当加emoji
2. 正文：口语化、有画面感、像在和朋友聊天
3. 分段清晰，每段2-3句话，用空行分隔
4. 适当使用emoji点缀（每段1-2个），不要堆砌
5. 内容要具体：有细节、有感受、有实用信息
6. 结尾可以互动：提问或邀请评论
7. 不要在正文里写#标签（标签要单独通过话题按钮添加）

主题：{topic}
关键词：{keywords}
图片内容描述：{image_description}

输出格式：
标题：xxx
正文：xxx
推荐话题：xxx, xxx, xxx（3-5个相关话题）
```

**文章示例（好的）：**
```
标题：大理旅居｜终于找到我的咖啡乌托邦☕

正文：
在大理的第15天，每天最期待的就是去这家小店坐坐

推门进去就是阳光和咖啡香，老板是个不爱说话的大叔，但手冲技术一绝。点了杯云南日晒，果香炸裂，才18块😭

最喜欢下午四五点来，坐在院子里看苍山的云慢慢飘，时间好像停住了

有没有姐妹也在大理？求组队探店！
```

---

### 话题标签添加方式（重要！）

**错误方式**：直接在正文里写 `#大理旅居 #咖啡`
- 这样写只是普通文本，不会生成可点击的话题标签

**正确方式**：
1. 写完正文后，点击输入框下方的「话题」按钮
2. 搜索并选择相关话题
3. 或者点击系统推荐的话题标签

**Playwright 实现步骤**：
```
1. 填写完正文后
2. 点击「话题」按钮 (button "话题")
3. 在弹出的搜索框中输入话题关键词
4. 点击搜索结果中的话题进行添加
5. 重复添加3-5个相关话题
```

---

## 小红书运营知识

### 内容限制
- **标题**: 不超过 **20 字**
- **正文**: 不超过 **1000 字**（不含话题标签）
- **话题标签**: 建议 **3-5 个**
- **每日发帖上限**: 约 **50 篇**

### 最佳实践
- **图文优于视频**: 图文内容的流量通常比视频更好
- **话题标签**: 通过话题按钮添加，不要直接写在正文里
- **热门话题**: 选择浏览量高的话题能获得更多曝光
- **单设备登录**: 同一账号不允许在多个网页端登录，否则会被踢出
- **发布时间**: 晚上7-10点是流量高峰

### 风险提示
- 避免频繁操作，建议间隔发布（2-5分钟）
- 不要发布违规内容
- Cookie 过期需要重新登录
- 评论内容不要太模板化，容易被识别

---

## 使用示例

### 示例 1: 检查登录状态
```
用户: 检查小红书登录状态
AI: 使用 check_login_status 功能...
```

### 示例 2: 发布图文
```
用户: 帮我发布一篇小红书，标题是"今日美食分享"，内容是"今天做了一道红烧肉..."，图片用 /Users/zee/Pictures/food.jpg
AI: 使用 publish_content 功能...
```

### 示例 3: 搜索内容
```
用户: 搜索小红书上关于"旅行攻略"的内容
AI: 使用 search_feeds 功能，keyword="旅行攻略"...
```

### 示例 4: 获取帖子详情并评论
```
用户: 获取这个帖子的详情 feed_id=xxx, xsec_token=yyy，然后发表评论"写得真好！"
AI:
1. 使用 get_feed_detail 获取详情
2. 使用 post_comment_to_feed 发表评论
```

---

## 故障排除

### 问题 1: 无法连接到浏览器
**解决方案**: 确保 OpenClaw 浏览器已启动并开启 CDP 端口 18800

### 问题 2: 显示未登录
**解决方案**: 在 OpenClaw 浏览器中手动登录小红书账号

### 问题 3: 发布失败
**解决方案**:
1. 检查标题是否超过 20 字
2. 检查正文是否超过 1000 字
3. 检查图片路径是否正确
4. 检查账号是否被风控

### 问题 4: 获取不到 xsec_token
**解决方案**: xsec_token 需要从 list_feeds 或 search_feeds 的结果中获取，不能自己构造

---

## 相关资源

- [xiaohongshu-mcp 参考项目](https://github.com/xpzouying/xiaohongshu-mcp)
- [Playwright 文档](https://playwright.dev/docs/api/class-browsertype#browser-type-connect-over-cdp)

