Files
browser-helper/AGENTS.md

402 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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