Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,12 @@ node_modules/
dist/
.env
*.log

# Internal development docs
docs/

# Playwright persistent profile (login session cache)
.chromium-profile/

# SQLite runtime database
data/
190 changes: 128 additions & 62 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,100 @@
# 🕊️ RedNoteDanmuBot

小红书直播间弹幕机器人 — 通过 Web 控制面板自动发送弹幕。
小红书直播间弹幕机器人 — Web 控制面板自动发送弹幕,支持 Chrome / Edge / Safari

## 功能
## 功能一览

- **Web 控制面板**:浏览器操作界面,实时控制
- **自动发弹幕**:用户指定前缀 + 随机字符串(防吞弹幕)
- **频率控制**:可调发送间隔 + 随机抖动(防风控)
- **随机字符串**:字母、符号、表情混搭,不含数字,用户可自定义字符集
- **实时日志**:发送状态、计数、错误信息一目了然
| 功能 | 说明 |
|------|------|
| 🎮 **三面板控制** | 控制 / 关键词 / 数据,标签页切换 |
| 🧠 **三模式消息** | 直接 / 关键词 / 全随机 三种消息模式 |
| 📝 **关键词管理** | 增删改关键词,iOS 开关启用/禁用 |
| 📊 **数据看板** | 实时折线图 + 7 日柱状图 + 4 张统计卡 |
| 💾 **自动持久化** | SQLite 存储发送记录,重启不丢 |
| 🎯 **智能防检测** | 随机抖动 ±30%、每次消息不同、真人化 |
| 🔄 **免重复扫码** | 浏览器会话持久化,一次登录长期使用 |
| 🌐 **多浏览器** | Chrome / Edge / Safari 任意切换 |

## 快速开始

### macOS

```bash
# 1. 安装后端依赖
# 1. 克隆项目
git clone https://github.com/sekiwhat/RedNoteDanmuBot.git
cd RedNoteDanmuBot

# 2. 安装后端依赖
npm install

# 2. 安装前端依赖并构建
# 3. 安装前端依赖并构建
cd client && npm install && npx vite build && cd ..

# 3. 启动服务
# 4. 启动
npm run server
```

打开浏览器访问 **http://localhost:3000**

## 使用说明
### Windows

```bash
# 步骤同上,完全一致
npm install
cd client && npm install && npx vite build && cd ..
npm run server
```

### macOS 特别说明

| 浏览器 | 是否需要额外操作 |
|--------|----------------|
| **Chrome** | ✅ 即开即用(需已安装 Chrome) |
| **Edge** | ✅ 即开即用 |
| **Safari / WebKit** | 运行 `npx playwright install webkit`(首次) |

> 💡 macOS 上 Safari 模式使用的是 Playwright 自带的 WebKit 引擎(非系统 Safari),表现与 Chrome 一致。

## 使用指南

### 第一步:连接直播间

```
① 启动服务 → ② 打开 http://localhost:3000
③ 选择浏览器 → ④ 输入直播间 URL → ⑤ 点击「连接」
⑥ 在 Playwright 打开的浏览器窗口中扫码登录小红书
```

### 第二步:选择消息模式

**直接模式**:仅发送前缀,不加任何后缀

```
"76" → "76"
"大家好" → "大家好"
```

1. **启动服务**后,浏览器打开控制面板
2. 在小红书直播间页面**扫码登录**(需要先在浏览器登录小红书)
3. 复制直播间 URL 粘贴到控制面板 → 点击「连接」
4. Playwright 会自动打开一个浏览器窗口进入直播间,在**该窗口**中完成扫码登录(如有需要)
5. 设置消息前缀、发送间隔、随机串配置
6. 点击「开始发送」
7. 点击「停止」结束发送
**全随机模式**(默认):前缀 + 随机字母/符号/表情(可调长度和字符集)

```
"76" + "xK@!😊" → "76xK@!😊"
"76" + "Ab~#🌹" → "76Ab~#🌹"
```

**关键词模式**:每次从你的词库中随机选一个,追加符号

```
"76" + "中!" + "~!@😊" → "76中!~!@😊"
"76" + "冲冲冲" + "🔥✨" → "76冲冲冲🔥✨"
```

### 第三步:开始发送

```
设置前缀(如 "76")→ 调整间隔(建议 2000ms)
→ 点击「开始发送」→ 切到「数据」看实时统计
→ 点击「停止」结束
```

## 配置

Expand All @@ -42,61 +103,66 @@ npm run server
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `port` | 3000 | 服务端口 |
| `defaultInterval` | 2500 | 默认发送间隔 (ms) |
| `minInterval` | 1500 | 最小发送间隔 (ms) |
| `maxInterval` | 8000 | 最大发送间隔 (ms) |
| `jitterRatio` | 0.3 | 间隔抖动比例 (±30%) |
| `headless` | false | 是否无头浏览器模式 |
| `randomLengthMin` | 3 | 随机串最小长度 |
| `randomLengthMax` | 6 | 随机串最大长度 |
| `browser` | `chrome` | 默认浏览器 |
| `defaultInterval` | 2500 | 发送间隔 (ms) |
| `minInterval` | 1500 | 最小间隔 |
| `maxInterval` | 8000 | 最大间隔 |
| `jitterRatio` | 0.3 | 抖动比例 (±30%) |
| `headless` | false | 无头模式 |
| `userDataDir` | `.chromium-profile` | 会话缓存目录 |

## 技术栈

| 层 | 技术 |
|----|------|
| 后端 | Node.js + Express + WebSocket |
| 浏览器 | Playwright (Chrome / Edge / WebKit) |
| 前端 | Vue 3 + Chart.js + Vite |
| 存储 | SQLite (better-sqlite3) |

## 项目结构

```
RedNoteDanmuBot/
├── server/ # 后端
│ ├── index.js # Express + WebSocket
│ ├── bot.js # Playwright 核心
│ ├── messageEngine.js # 智能消息引擎
│ ├── database.js # SQLite 持久化
│ ├── randomizer.js # 随机字符串
│ ├── config.js # 配置
│ └── __tests__/ # 13 个测试
├── client/ # 前端
│ └── src/
│ ├── App.vue # 主面板
│ ├── components/
│ │ ├── KeywordManager.vue # 关键词管理
│ │ └── AnalyticsPanel.vue # 数据看板
│ └── style.css
├── data/ # SQLite(自动创建)
├── .chromium-profile/ # 浏览器会话(自动创建)
└── package.json
```

## 开发

```bash
# 前端热更新开发
# 前端热更新
cd client && npx vite

# 运行测试
npx jest server/__tests__/randomizer.test.js
npx --node-options="--experimental-vm-modules" jest

# 构建前端
cd client && npx vite build
```

## 项目结构

```
RedNoteDanmuBot/
├── server/
│ ├── index.js # Express + WebSocket 服务
│ ├── bot.js # Playwright 弹幕发送核心
│ ├── randomizer.js # 随机字符串生成
│ ├── config.js # 默认配置
│ └── __tests__/
│ └── randomizer.test.js
├── client/
│ ├── src/
│ │ ├── App.vue # 主控制面板
│ │ ├── main.js
│ │ └── style.css
│ ├── index.html
│ └── vite.config.js
├── docs/
│ └── superpowers/
├── package.json
└── README.md
```

## 技术栈

| 层 | 技术 |
|----|------|
| 后端 | Node.js + Express + WebSocket |
| 浏览器自动化 | Playwright |
| 前端 | Vue 3 + Vite |
测试覆盖:`randomizer` / `database` / `messageEngine`,共 13 个。

## 注意事项
## 注意

- 请合理使用,避免违反小红书社区规则
- 发送频率不宜过快,建议 2-3 秒以上间隔
- 首次使用需要在小红书直播间完成扫码登录
- ⚠️ 请合理使用,遵守小红书社区规则
- ⏱ 发送间隔建议 2000ms 以上,太快容易被风控
- 🔑 首次使用需在 Playwright 打开的浏览器中扫码登录
- 💾 登录态保存在 `.chromium-profile/`,下次免扫码
- 🍎 macOS 用户首次使用 Safari 模式需先跑 `npx playwright install webkit`
2 changes: 1 addition & 1 deletion client/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>RedNoteDanmuBot</title>
<title>🕊️ RedNoteDanmuBot</title>
</head>
<body>
<div id="app"></div>
Expand Down
19 changes: 19 additions & 0 deletions client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"preview": "vite preview"
},
"dependencies": {
"chart.js": "^4.5.1",
"vue": "^3.5.0"
},
"devDependencies": {
Expand Down
Loading