diff --git a/.opencode/plugin/agent.ts b/.opencode/plugin/agent.ts index 999ca5e..e69de29 100644 --- a/.opencode/plugin/agent.ts +++ b/.opencode/plugin/agent.ts @@ -1,3 +0,0 @@ -import { browserAgentPlugin } from './../../src/index.ts'; - -export { browserAgentPlugin } \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..2dc021b --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,401 @@ +# Browser Helper - 浏览器自动化助手使用指南 + +## 项目简介 + +browser-helper 是一个基于 Playwright 的浏览器自动化助手工具,主要用于自动化收集和整理小红书平台信息。通过 AI 辅助过滤无效信息,帮助用户高效收集和整理数据。 + +## 核心功能 + +- **浏览器自动化控制**:通过 Playwright 控制浏览器执行自动化操作 +- **小红书数据采集**:自动搜索、收集笔记、用户、标签等信息 +- **本地数据存储**:使用 SQLite + Drizzle ORM 持久化存储 +- **API 接口服务**:提供 RESTful API 供 AI 助手调用 + +## 技术栈 + +- **运行时**: Bun / Node.js +- **数据库**: SQLite + Drizzle ORM +- **浏览器自动化**: Playwright +- **API 框架**: @kevisual/router +- **缓存**: LRU Cache + +## 快速开始 + +### 环境初始化 + +```bash +# 安装依赖 +pnpm install + +# 初始化项目(安装依赖、数据库、浏览器) +pnpm run init +``` + +### 启动服务 + +```bash +# 开发模式启动服务 +pnpm run dev + +# 启动浏览器(生产模式,使用 pm2) +pnpm run browser + +# 开发模式启动浏览器 +pnpm run dev:browser + +# 启动 Drizzle Studio(数据库可视化工具) +pnpm run studio +``` + +## API 接口文档 + +### 认证 + +所有接口都需要通过 `auth` 中间件认证(当前为临时 Token 验证)。 + +### 小红书笔记接口 + +#### 搜索笔记 + +``` +POST /xhs/search-notes +``` + +**参数**: +- `keyword`: 搜索关键词(必填) +- `pushTime`: 发布时间筛选(一天内/一周内/半年内),默认一天内 +- `sort`: 排序方式(综合/最新/最多点赞/最多评论),默认最新 +- `distance`: 距离筛选(不限/同城/附近),默认不限 +- `searchRange`: 搜索范围(不限/已看过/未看过/已关注),默认不限 +- `scrollTimes`: 滚动次数,默认5次 + +#### 获取笔记列表 + +``` +GET /xhs/list +``` + +**参数**: +- `page`: 页码,默认1 +- `pageSize`: 每页数量,默认20 +- `search`: 搜索关键词 +- `sort`: 排序方式(ASC/DESC),默认DESC + +#### 获取单条笔记 + +``` +GET /xhs/get +``` + +**参数**: +- `data.id`: 笔记ID + +#### 创建/更新笔记 + +``` +POST /xhs/update +``` + +**参数**: +- `data.id`: 笔记ID(更新时必填) +- `data.title`: 笔记标题 +- `data.summary`: 笔记摘要 +- `data.description`: 笔记描述 +- `data.tags`: 标签数组 +- `data.data`: 笔记完整数据 + +#### 删除笔记 + +``` +POST /xhs/delete +``` + +**参数**: +- `data.id`: 笔记ID + +### 小红书用户接口 + +#### 获取用户列表 + +``` +GET /xhs-users/list +``` + +**参数**: +- `page`: 页码,默认1 +- `pageSize`: 每页数量,默认20 +- `search`: 搜索关键词(模糊匹配昵称、用户名、描述) +- `sort`: 排序方式(ASC/DESC),默认DESC + +#### 获取单个用户 + +``` +GET /xhs-users/get +``` + +**参数**: +- `data.id`: 用户ID + +#### 创建/更新用户 + +``` +POST /xhs-users/update +``` + +**参数**: +- `data.id`: 用户ID(更新时必填) +- `data.nickname`: 用户昵称 +- `data.username`: 用户名 +- `data.avatar`: 用户头像 +- `data.description`: 用户描述 +- `data.tags`: 标签数组 + +#### 删除用户 + +``` +POST /xhs-users/delete +``` + +**参数**: +- `data.id`: 用户ID + +### 小红书标签接口 + +#### 获取标签列表 + +``` +GET /xhs-tags/list +``` + +**参数**: +- `page`: 页码,默认1 +- `pageSize`: 每页数量,默认20 +- `search`: 搜索关键词 +- `sort`: 排序方式(ASC/DESC),默认DESC + +#### 创建/更新标签 + +``` +POST /xhs-tags/update +``` + +**参数**: +- `data.id`: 标签ID(更新时必填) +- `data.title`: 标签标题 +- `data.description`: 标签描述 + +#### 删除标签 + +``` +POST /xhs-tags/delete +``` + +**参数**: +- `data.id`: 标签ID + +### 预设搜索场景 + +#### 信息差搜索 + +``` +POST /good/searchInfo +``` + +**参数**: +- `keyword`: 搜索关键词,默认"信息差" + +#### 工作招聘搜索 + +``` +POST /good/searchWork +``` + +**参数**: +- `keyword`: 搜索关键词,默认"工作 杭州" + +#### 交友相亲搜索 + +``` +POST /good/searchDate +``` + +**参数**: +- `keyword`: 搜索关键词,默认"相亲 杭州" + +#### 拼豆搜索 + +``` +POST /good/searchBean +``` + +**参数**: +- `keyword`: 搜索关键词,默认"拼豆" + +#### 网站模板搜索 + +``` +POST /good/searchTemplate +``` + +**参数**: +- `keyword`: 搜索关键词,默认"网站模板" + +## 数据库结构 + +### xhs_note(小红书笔记表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | text | 笔记ID(主键) | +| title | text | 笔记标题 | +| summary | text | 笔记摘要 | +| description | text | 笔记描述/搜索关键词 | +| link | text | 笔记链接 | +| data | text | 完整数据(JSON) | +| tags | text | 标签 | +| status | text | 状态(正常笔记/归档/禁止用户/删除/不相关) | +| authorUrl | text | 作者主页链接 | +| cover | text | 封面图 | +| syncStatus | integer | 同步状态 | +| syncAt | integer | 同步时间 | +| star | integer | 标记 | +| userId | text | 用户ID | +| createdAt | integer | 创建时间 | +| updatedAt | integer | 更新时间 | + +### xhs_user(小红书用户表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | text | 用户ID(主键) | +| xsec_token | text | XSEC Token | +| username | text | 用户名 | +| nickname | text | 昵称 | +| avatar | text | 头像 | +| title | text | 标题 | +| summary | text | 摘要 | +| description | text | 描述 | +| link | text | 主页链接 | +| data | text | 完整数据(JSON) | +| tags | text | 标签 | +| bunTags | text | 屏蔽标签 | +| followersCount | integer | 粉丝数 | +| followingCount | integer | 关注数 | +| status | text | 状态 | +| syncStatus | integer | 同步状态 | +| syncAt | integer | 同步时间 | +| star | integer | 标记 | + +### xhs_tags(小红书标签表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| id | text | 标签ID(主键) | +| title | text | 标签标题 | +| description | text | 标签描述 | +| createdAt | integer | 创建时间 | +| updatedAt | integer | 更新时间 | + +### cache(缓存表) + +| 字段 | 类型 | 说明 | +|------|------|------| +| key | text | 缓存键(主键) | +| value | text | 缓存值 | +| expireAt | integer | 过期时间 | +| createdAt | integer | 创建时间 | + +## 项目结构 + +``` +browser-helper/ +├── src/ +│ ├── app.ts # 应用入口和核心配置 +│ ├── index.ts # 主入口,导出 API 插件 +│ ├── db/ +│ │ ├── schema.ts # 数据库表结构定义 +│ │ └── cache.ts # 数据库缓存模块 +│ ├── modules/ +│ │ └── cache.ts # 会话缓存(LRU Cache) +│ ├── playwright/ +│ │ ├── core.ts # 浏览器核心控制类 +│ │ ├── browser.ts # 浏览器启动逻辑 +│ │ ├── actions.ts # 浏览器操作封装 +│ │ └── index.ts # 导出 +│ └── routes/ +│ ├── index.ts # 路由入口 +│ ├── xhs/ # 小红书相关路由 +│ │ ├── index.ts +│ │ ├── search-notes.ts # 笔记搜索 +│ │ ├── xhs-list.ts # 笔记 CRUD +│ │ ├── xhs-user-list.ts # 用户 CRUD +│ │ └── xhs-tags-list.ts # 标签 CRUD +│ └── good/ # 预设搜索场景 +│ └── index.ts +├── storage/ +│ └── browser-helper/ +│ └── data.sqlite3 # SQLite 数据库文件 +├── browser-context/ # 浏览器上下文数据 +├── dist/ # 构建输出目录 +├── typings/ # TypeScript 类型定义 +├── drizzle.config.ts # Drizzle 配置 +├── bun.config.ts # Bun 构建配置 +├── package.json # 项目配置 +└── pnpm-lock.yaml # 依赖锁定 +``` + +## 浏览器控制 + +### Core 类 + +`Core` 类是浏览器自动化的核心组件,提供以下功能: + +```typescript +// 连接浏览器 +await core.connect(); + +// 获取页面实例 +const page = await core.getPage(); + +// 设置记录就绪状态 +await core.setReady(true); + +// 监听响应 +core.on('search/notes', (data) => { + console.log('捕获响应:', data); +}); +``` + +### 启动流程 + +1. 启动浏览器进程(通过 `start-browser.js`) +2. Playwright 通过 CDP 协议连接到浏览器 +3. 加载浏览器上下文和页面 +4. 注册请求/响应监听器 +5. 开始执行自动化任务 + +## 常见问题 + +### 1. 浏览器无法连接 + +确保浏览器进程已启动: +```bash +pnpm run browser # 生产模式 +# 或 +pnpm run dev:browser # 开发模式 +``` + +### 2. 数据库初始化失败 + +运行数据库迁移: +```bash +pnpm run push +``` + +### 3. 搜索无结果 + +检查搜索关键词是否正确,确保小红书搜索页面能正常访问。 + +## License + +MIT diff --git a/src/index.ts b/src/index.ts index ea12084..e0e523c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,8 @@ export { app, db } from './app.ts'; export { Core } from './playwright/core.ts'; import './routes/index.ts'; // 如果是直接运行,则启动应用 +// better-sqlite3 不支持 bun +// playwright 也不支持 bun import { createRouterAgentPluginFn } from '@kevisual/router/src/opencode.ts' app.route({ id: 'auth',