feat: 删除不再使用的浏览器代理插件导出;添加使用指南文档

This commit is contained in:
2026-01-22 12:49:00 +08:00
parent dde98e437b
commit d95452b807
3 changed files with 403 additions and 3 deletions

View File

@@ -1,3 +0,0 @@
import { browserAgentPlugin } from './../../src/index.ts';
export { browserAgentPlugin }

401
AGENTS.md Normal file
View File

@@ -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

View File

@@ -3,6 +3,8 @@ export { app, db } from './app.ts';
export { Core } from './playwright/core.ts'; export { Core } from './playwright/core.ts';
import './routes/index.ts'; import './routes/index.ts';
// 如果是直接运行,则启动应用 // 如果是直接运行,则启动应用
// better-sqlite3 不支持 bun
// playwright 也不支持 bun
import { createRouterAgentPluginFn } from '@kevisual/router/src/opencode.ts' import { createRouterAgentPluginFn } from '@kevisual/router/src/opencode.ts'
app.route({ app.route({
id: 'auth', id: 'auth',