stefanfeng d6ad1db535 fix: Phase2始终从第1页(最新)开始,按小时递进页码
问题:
- 原实现用 hour % total_pages 决定起始页
- 13点时 13%3=1,start_page=2,直接跳过第1页(最新文章)
- 导致虚拟用户永远不互动最新发布的文章

修复:
- 第1页(最新文章)始终在获取总页数时一并拉取,零额外开销
- hour_page = (hour % max_pages) + 1,每小时推进一页(1→2→3...循环)
- 0点=第1页最新,1点=第2页,依此类推,形成完整的新→旧覆盖
- 若当前时段页为空则顺序回退,最终兜底第1页

Phase 1(今日新文章)逻辑不变
2026-04-07 13:52:59 +08:00
2026-04-01 18:07:42 +08:00
2026-03-31 10:29:26 +08:00

AI虚拟用户新闻互动系统

基于AI驱动的虚拟用户新闻互动自动化平台支持批量虚拟用户管理、AI人格生成、真实登录新闻平台、自动随机互动。


📁 项目结构

ai-virtual-news/
├── docker-compose.yml          # Docker编排文件
├── docker/
│   └── mysql/
│       └── init.sql            # 数据库初始化脚本
├── backend/                    # Python FastAPI 后端
│   ├── Dockerfile
│   ├── requirements.txt
│   └── app/
│       ├── main.py             # 应用入口
│       ├── api/                # API路由层
│       ├── core/               # 核心配置DB/Redis/日志)
│       ├── models/             # SQLAlchemy ORM模型
│       ├── schemas/            # Pydantic数据模型
│       ├── services/           # 业务服务层
│       └── utils/              # 工具类AES加密等
└── frontend/                   # Vue3 前端
    ├── Dockerfile
    ├── nginx.conf
    ├── src/
    │   ├── views/              # 页面组件
    │   ├── api/                # Axios API封装
    │   ├── router/             # Vue Router
    │   ├── layouts/            # 布局组件
    │   └── styles/             # 全局样式
    └── package.json

🚀 快速部署1Panel Docker

前置要求

  • 已安装 1Panel 面板
  • 已安装 Docker 及 Docker Compose
  • 服务器内网可访问新闻平台接口192.168.1.200:63120

第一步:修改环境配置

编辑 docker-compose.yml,修改以下必须更改的安全参数:

environment:
  - SECRET_KEY=your-secret-key-change-in-production    # ⚠️ 必须修改
  - AES_KEY=your-aes-key-32-chars-change-now!          # ⚠️ 必须修改必须32字符
  - DB_PASSWORD=AiVirtual@2024                          # ⚠️ 建议修改

同时修改 MySQL 的 MYSQL_PASSWORDDB_PASSWORD 保持一致。

第二步:通过 1Panel 部署

方式A1Panel 应用商店(推荐)

  1. 登录 1Panel → 应用商店 → 搜索 "Docker Compose"
  2. 上传本项目目录
  3. 点击部署

方式BSSH 命令行

# 1. 上传项目到服务器
scp -r ai-virtual-news/ root@your-server:/opt/

# 2. 进入项目目录
cd /opt/ai-virtual-news

# 3. 启动所有服务
docker-compose up -d

# 4. 查看启动日志
docker-compose logs -f

第三步:访问系统

服务 地址
前端控制台 http://服务器IP:9000
后端API文档 http://服务器IP:8000/api/docs
MySQL 服务器IP:3306
Redis 服务器IP:6379

⚙️ 初始配置

1. 配置AI模型

访问控制台 → AI模型配置 → 添加模型:

字段 说明 示例
模型名称 自定义名称 GPT-4生产
提供商 选择对应供应商 OpenAI
API地址 留空用默认 https://api.openai.com/v1
API Key 对应平台的Key sk-...
模型版本 具体模型名 gpt-4-turbo

配置完成后点击「设为默认」系统将使用此模型进行所有AI操作。 点击「测试」验证模型可用性。

支持的国产模型配置:

提供商 API地址 模型版本示例
智谱GLM https://open.bigmodel.cn/api/paas/v4 glm-4
文心一言 https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat ERNIE-Bot-4
通义千问 https://dashscope.aliyuncs.com/compatible-mode/v1 qwen-turbo

2. 配置新闻平台地址

访问控制台 → 调度设置 → 修改「平台接口地址」为实际地址。

3. 创建虚拟用户

方式A单个创建 控制台 → 虚拟用户 → 新增用户 → 填写账号密码 → 系统自动生成AI人格

方式BExcel批量导入

  1. 下载导入模板
  2. 填写账号/密码/昵称等信息
  3. 上传Excel系统自动校验并为每个用户生成AI人格

4. 启动自动互动

  1. 确认用户已登录(状态为「已登录」)
  2. 调度设置 → 确认互动时间段和概率配置
  3. 调度器默认启动,系统将在设定时间段自动执行互动

🔧 运维管理

Docker 常用命令

# 查看所有容器状态
docker compose ps

# 重启后端服务(后端代码更新后执行)
docker compose restart ai-virtual-backend

# 查看后端实时日志
docker compose logs -f ai-virtual-backend

# 停止所有服务
docker compose down

# 启动所有服务
docker compose up -d

# 进入后端容器
docker exec -it ai-virtual-backend bash

# 进入MySQL
docker exec -it ai-virtual-mysql mysql -u aivirtual -p ai_virtual_news

⚠️ 前端更新(重要:必须用此方式)

docker compose build 存在缓存问题,前端代码修改后必须用以下方式重新 build否则修改不会生效。

cd /opt/1panel/docker/compose/ai-virtual-news/frontend

# 第一步:清缓存并 build使用 node 镜像直接 build 宿主机目录)
rm -rf dist node_modules/.vite
docker run --rm -v $(pwd):/app -w /app node:18-alpine sh -c "npm run build"

# 第二步:把 dist 复制到运行中的容器
docker cp dist/. ai-virtual-frontend:/usr/share/nginx/html/

# 第三步:重载 nginx无需重启容器立即生效
docker exec ai-virtual-frontend nginx -s reload

数据备份1Panel

  1. 1Panel → 数据库 → MySQL → 定时备份
  2. 建议每天凌晨 3 点备份,保留 30 天
  3. 或手动备份:
docker exec ai-virtual-mysql mysqldump -u aivirtual -pAiVirtual@2024 ai_virtual_news > backup_$(date +%Y%m%d).sql

日志位置

日志类型 容器路径 宿主机路径
应用日志 /app/logs/app_*.log ./backend/logs/
错误日志 /app/logs/error_*.log ./backend/logs/
AI调用日志 /app/logs/ai_*.log ./backend/logs/

🔒 安全注意事项

  1. AES密钥AES_KEY 必须修改为32字符随机字符串用于加密存储账号密码
  2. 数据库密码:生产环境务必修改默认密码
  3. 端口暴露:建议通过 Nginx 反向代理访问,不要直接暴露 8000 端口
  4. 防火墙MySQL(3306)、Redis(6379) 端口不应对外暴露
  5. 互动频率:合理设置互动间隔,避免触发新闻平台风控

📊 功能模块说明

数据看板

  • 实时展示用户总数、在线数、今日互动量
  • Token消耗折线图近30天/7天
  • 近12个月月度消耗柱状图
  • 系统运行状态监控

虚拟用户管理

  • 新增/编辑/删除用户账号密码AES加密存储
  • Excel批量导入含格式校验、去重、错误详情
  • Excel批量导出不含密码密文
  • AI人格生成性格/语言风格/兴趣/互动倾向/字数偏好
  • 编辑用户资料(昵称/真实姓名/性别/头像/简介/邮箱),支持同步到目标平台
  • 头像上传:上传图片到平台 filecenter自动更新用户头像
  • 单个/批量启用、禁用、登出操作
  • 手动触发登录/登出

AI互动模块

  • 真实调用新闻平台登录接口获取会话Token
  • 会话自动校验10分钟/次),失效自动重登
  • 随机翻页获取文章,按用户兴趣偏好筛选,自动过滤无效新闻
  • AI生成贴合人格的评论/回复内容,内容完整不截断,自动过滤敏感词
  • 按概率随机触发:评论/回复/点赞/收藏/转发
  • 每日互动次数限额控制
  • 互动记录支持手动重试、取消

AI模型配置

  • 支持 OpenAI / 智谱GLM / 文心一言 / 通义千问 / 本地模型
  • API Key AES加密存储
  • 模型测试功能(验证可用性 + Token消耗预览
  • 多模型管理,设置默认模型

调度设置

  • 互动时间段配置(北京时间)
  • 最小互动间隔控制(秒),防止同一用户频繁互动
  • 各互动类型概率独立配置
  • 并发用户数上限0=不限)
  • 每日Token配额管控
  • 一键暂停/启动调度器
  • 立即触发互动(测试用)

日志管理

  • 登录日志:登录/登出/失败记录
  • 日志文件:应用日志/错误日志实时查看
  • 日志下载

🐛 常见问题

Q: 容器启动失败,提示数据库连接失败? A: MySQL 启动需要时间,后端依赖 healthcheck。等待 30-60 秒后重试:docker compose restart ai-virtual-backend

Q: 用户登录始终失败? A: 1) 检查新闻平台接口地址是否正确2) 检查账号密码是否正确3) 查看后端日志定位具体错误

Q: AI人格生成失败 A: 未配置AI模型时系统会随机生成人格作为兜底这是正常行为。配置有效的AI模型后可重新生成。

Q: 调度器不执行互动? A: 检查1) 调度器是否启用2) 是否在设定的互动时间段内北京时间3) 是否有已登录状态的用户4) Token是否已达每日上限5) 用户最近互动时间是否超过最小间隔

Q: 前端修改后没有生效? A: 不能用 docker compose build,必须用上方「前端更新」中的 node 镜像 build 方式。

Q: 互动报"服务器繁忙" A: 通常是 orgId 为空导致。系统已自动从广场文章数据获取 orgId如仍报错请检查文章是否有效。

Q: 评论报敏感词? A: AI 提示词已包含安全规则,偶发属正常,系统不重试敏感词失败。

Q: 后端 502 错误? A: 查看日志定位原因:docker compose logs --tail=20 ai-virtual-backend | grep -E "Error|Exception"


📞 技术支持

  • 后端API文档http://服务器IP:8000/api/docs
  • 接口健康检查:http://服务器IP:8000/health
Description
No description provided
Readme 412 KiB
2026-03-23 16:38:41 +08:00
Languages
Python 63.3%
Vue 31%
CSS 2.6%
JavaScript 2.4%
Dockerfile 0.3%
Other 0.4%