From 2ba87c8f6ec76166a71f0f1c913822285f71c920 Mon Sep 17 00:00:00 2001
From: zhoujie <929834232@qq.com>
Date: Fri, 27 Feb 2026 22:12:39 +0800
Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20docs(project):=20=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E5=BC=80=E6=BA=90=E7=A4=BE=E5=8C=BA=E6=A0=87=E5=87=86?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B8=8E=20CI=20=E5=B7=A5=E4=BD=9C=E6=B5=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增 GitHub Issue 模板(Bug 报告、功能请求)和 Pull Request 模板
- 新增 Code of Conduct(贡献者行为准则)和 Security Policy(安全政策)
- 新增 CI 工作流(GitHub Actions),包含 ruff 代码检查和导入验证
- 新增开发依赖文件 requirements-dev.txt
📦 build(ci): 配置 GitHub Actions 持续集成
- 在 push 到 main 分支和 pull request 时自动触发 CI
- 添加 lint 任务执行 ruff 代码风格检查
- 添加 import-check 任务验证核心服务模块导入
♻️ refactor(structure): 重构项目目录结构
- 将根目录的 6 个服务模块迁移至 services/ 包
- 更新所有相关文件的导入语句(main.py、ui/、services/)
- 根目录仅保留 main.py 作为唯一 Python 入口文件
🔧 chore(config): 调整配置和资源文件路径
- 将 config.json 移至 config/ 目录,更新相关引用
- 将个人头像图片移至 assets/faces/ 目录,更新 .gitignore
- 更新 Dockerfile 和 docker-compose.yml 中的配置路径
📝 docs(readme): 完善 README 文档
- 添加项目状态徽章(Python 版本、License、CI)
- 更新项目结构图反映实际目录布局
- 修正使用指南中的 Tab 名称和操作路径
- 替换 your-username 占位符为格式提示
🗑️ chore(cleanup): 清理冗余文件
- 删除旧版备份文件、测试脚本、临时记录和运行日志
- 删除散落的个人图片文件(已归档至 assets/faces/)
---
.github/ISSUE_TEMPLATE/bug_report.md | 37 +++
.github/ISSUE_TEMPLATE/feature_request.md | 23 ++
.github/pull_request_template.md | 35 +++
.github/workflows/ci.yml | 48 ++++
.gitignore | 11 +-
CODE_OF_CONDUCT.md | 83 ++++++
Dockerfile | 9 +-
README.md | 84 ++++--
SECURITY.md | 36 +++
Todo.md | 1 -
_autostart.bat | 3 -
_autostart.vbs | 3 -
_test_config_save.py | 38 ---
beauty.png | Bin 6764108 -> 0 bytes
config copy.json | 10 -
config.json | 60 ----
.../config.example.json | 0
docker-compose.yml | 4 +-
mcp.md => docs/mcp.md | 0
main.py | 15 +-
main_v1_backup.py | 264 ------------------
my_face.png | Bin 5621455 -> 0 bytes
myself.jpg | Bin 101483 -> 0 bytes
.../.openspec.yaml | 2 +
.../design.md | 36 +++
.../proposal.md | 33 +++
.../specs/project-structure/spec.md | 49 ++++
.../tasks.md | 25 ++
.../.openspec.yaml | 2 +
.../2026-02-27-open-source-ready/design.md | 55 ++++
.../2026-02-27-open-source-ready/proposal.md | 57 ++++
.../specs/oss-ci-workflow/spec.md | 37 +++
.../specs/oss-community-health/spec.md | 33 +++
.../specs/oss-readme-polish/spec.md | 29 ++
.../specs/project-restructure/spec.md | 34 +++
.../2026-02-27-open-source-ready/tasks.md | 186 ++++++++++++
openspec/specs/oss-ci-workflow/spec.md | 37 +++
openspec/specs/oss-community-health/spec.md | 33 +++
openspec/specs/oss-readme-polish/spec.md | 29 ++
openspec/specs/project-structure/spec.md | 49 ++++
requirements-dev.txt | 3 +
.../analytics_service.py | 0
services/autostart.py | 5 +-
.../config_manager.py | 3 +-
services/connection.py | 8 +-
services/content.py | 12 +-
services/engagement.py | 8 +-
services/hotspot.py | 8 +-
llm_service.py => services/llm_service.py | 0
mcp_client.py => services/mcp_client.py | 0
services/persona.py | 2 +-
services/profile.py | 2 +-
publish_queue.py => services/publish_queue.py | 0
services/queue_ops.py | 14 +-
services/scheduler.py | 22 +-
sd_service.py => services/sd_service.py | 2 +-
ui/app.py | 8 +-
zjz.png | Bin 7579649 -> 0 bytes
58 files changed, 1119 insertions(+), 468 deletions(-)
create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md
create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md
create mode 100644 .github/pull_request_template.md
create mode 100644 .github/workflows/ci.yml
create mode 100644 CODE_OF_CONDUCT.md
create mode 100644 SECURITY.md
delete mode 100644 Todo.md
delete mode 100644 _autostart.bat
delete mode 100644 _autostart.vbs
delete mode 100644 _test_config_save.py
delete mode 100644 beauty.png
delete mode 100644 config copy.json
delete mode 100644 config.json
rename config.example.json => config/config.example.json (100%)
rename mcp.md => docs/mcp.md (100%)
delete mode 100644 main_v1_backup.py
delete mode 100644 my_face.png
delete mode 100644 myself.jpg
create mode 100644 openspec/changes/archive/2026-02-27-cleanup-project-structure/.openspec.yaml
create mode 100644 openspec/changes/archive/2026-02-27-cleanup-project-structure/design.md
create mode 100644 openspec/changes/archive/2026-02-27-cleanup-project-structure/proposal.md
create mode 100644 openspec/changes/archive/2026-02-27-cleanup-project-structure/specs/project-structure/spec.md
create mode 100644 openspec/changes/archive/2026-02-27-cleanup-project-structure/tasks.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/.openspec.yaml
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/design.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/proposal.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/specs/oss-ci-workflow/spec.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/specs/oss-community-health/spec.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/specs/oss-readme-polish/spec.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/specs/project-restructure/spec.md
create mode 100644 openspec/changes/archive/2026-02-27-open-source-ready/tasks.md
create mode 100644 openspec/specs/oss-ci-workflow/spec.md
create mode 100644 openspec/specs/oss-community-health/spec.md
create mode 100644 openspec/specs/oss-readme-polish/spec.md
create mode 100644 openspec/specs/project-structure/spec.md
create mode 100644 requirements-dev.txt
rename analytics_service.py => services/analytics_service.py (100%)
rename config_manager.py => services/config_manager.py (98%)
rename llm_service.py => services/llm_service.py (100%)
rename mcp_client.py => services/mcp_client.py (100%)
rename publish_queue.py => services/publish_queue.py (100%)
rename sd_service.py => services/sd_service.py (99%)
delete mode 100644 zjz.png
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..d98efff
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,37 @@
+---
+name: Bug 报告
+about: 报告一个问题,帮助我们改进
+title: "[BUG] "
+labels: bug
+assignees: ''
+---
+
+## 问题描述
+
+请简洁清晰地描述遇到的问题。
+
+## 复现步骤
+
+1. 进入 '...'
+2. 点击 '...'
+3. 滚动至 '...'
+4. 出现错误
+
+## 预期行为
+
+描述你预期应该发生什么。
+
+## 实际行为
+
+描述实际发生了什么,请附上错误截图或日志信息。
+
+## 环境信息
+
+- **操作系统**:(例如 Windows 11 / macOS 14 / Ubuntu 22.04)
+- **Python 版本**:(执行 `python --version` 获取)
+- **autobot 版本/提交**:(执行 `git rev-parse --short HEAD` 获取)
+- **相关依赖版本**:(如 gradio、openai 等)
+
+## 附加信息
+
+任何其他与问题相关的上下文、截图或日志文件,请粘贴于此。
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..5530194
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,23 @@
+---
+name: 功能请求
+about: 为本项目提出新点子或改进建议
+title: "[FEATURE] "
+labels: enhancement
+assignees: ''
+---
+
+## 背景与需求
+
+请描述你目前遇到的问题或痛点。例如:"当我想要 [...] 时,总是感到不便,因为 [...]"
+
+## 期望的解决方案
+
+请清晰描述你希望实现的功能或行为。
+
+## 替代方案
+
+你是否考虑过其他解决方案或变通方法?请描述。
+
+## 附加信息
+
+你可以在此添加任何截图、参考链接或其他有助于理解该功能请求的上下文信息。
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..8263587
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,35 @@
+## 变更类型
+
+请勾选适用的选项(在 `[ ]` 中填入 `x`):
+
+- [ ] 🐛 Bug Fix(修复问题,未破坏现有功能)
+- [ ] ✨ Feature(新功能,未破坏现有功能)
+- [ ] 📝 Docs(仅文档变更)
+- [ ] ♻️ Refactor(代码重构,未修复 Bug 也未新增功能)
+- [ ] 🎨 Style(格式化、缩进等,不影响代码逻辑)
+- [ ] ⚡ Performance(性能优化)
+- [ ] 🔧 Chore(构建流程、工具配置等杂项变更)
+
+## 变更描述
+
+请简洁描述本 PR 做了什么,以及为什么需要这些变更。
+
+## 相关 Issue
+
+关闭 #(填入 Issue 编号,若无可删除此行)
+
+## 测试说明
+
+请描述你如何测试了本次变更(手动测试步骤、自动化测试等):
+
+- [ ] 我在本地运行了 `python main.py` 确认应用正常启动
+- [ ] 我验证了受影响的功能仍按预期工作
+- [ ] 我运行了 `ruff check .` 确认无新增 lint 错误
+
+## 截图(如适用)
+
+如果本 PR 包含 UI 变更,请附上前后对比截图。
+
+## 备注
+
+有任何需要 reviewer 特别关注的地方,请在此说明。
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..3fc069a
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,48 @@
+name: CI
+
+on:
+ push:
+ branches: [ "main" ]
+ pull_request:
+ branches: [ "main" ]
+
+jobs:
+ lint:
+ name: Lint (ruff)
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.10"
+
+ - name: Install ruff
+ run: pip install ruff>=0.4.0
+
+ - name: Run ruff
+ run: ruff check . --select E,F,W --ignore E501,E402,W291,W293
+
+ import-check:
+ name: Import Check
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.10"
+
+ - name: Install dependencies
+ run: pip install -r requirements.txt
+
+ - name: Verify core service imports
+ run: |
+ python -c "from services.config_manager import ConfigManager; print('config_manager OK')"
+ python -c "from services.llm_service import LLMService; print('llm_service OK')"
+ python -c "from services.mcp_client import get_mcp_client; print('mcp_client OK')"
+ python -c "from services.analytics_service import AnalyticsService; print('analytics_service OK')"
+ python -c "from services.publish_queue import STATUS_LABELS; print('publish_queue OK')"
+ python -c "from services.sd_service import SDService; print('sd_service OK')"
diff --git a/.gitignore b/.gitignore
index bf61413..303c255 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,7 +16,7 @@ venv/
env/
# ========== 敏感配置 ==========
-config.json
+config/config.json
cookies.json
*.cookie
@@ -42,4 +42,11 @@ config copy.json
# ========== 临时文件 ==========
*.tmp
-*.bak
\ No newline at end of file
+*.bak
+
+# ========== 个人媒体资产(隐私,不入版本控制) ==========
+assets/faces/
+
+# ========== 自动生成的启动脚本(含机器绝对路径) ==========
+scripts/_autostart.bat
+scripts/_autostart.vbs
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..c550142
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,83 @@
+# 贡献者行为准则
+
+## 我们的承诺
+
+作为成员、贡献者和领导者,我们承诺让每一位参与者都能在无骚扰的环境中参与我们的社区,不论其年龄、体型、是否有可见或不可见的残疾、族裔、性别特征、性别认同与表达、经验水平、教育程度、社会经济地位、国籍、外表、种族、种姓、肤色、宗教信仰或性取向。
+
+我们承诺以有助于建立开放、友好、多元、包容和健康社区的方式行事和互动。
+
+## 我们的准则
+
+有助于为我们的社区创造积极环境的行为示例包括:
+
+* 对他人表现出同理心和善意
+* 尊重不同的意见、观点和经历
+* 给予并优雅地接受建设性反馈
+* 承担责任并向受我们错误影响的人道歉,并从经历中学习
+* 关注整个社区的最大利益,不只是我们个人的利益
+
+不可接受的行为示例包括:
+
+* 使用性化语言或图像,以及任何形式的性关注或性骚扰
+* 发表挑衅性、侮辱性或贬义的评论,以及针对个人或政治的攻击
+* 公开或私下骚扰
+* 未经明确许可,发布他人的私人信息,例如实际地址或电子邮件地址
+* 在专业环境中其他可被合理认为不适当的行为
+
+## 执行责任
+
+社区领导者有责任阐明和执行我们可接受行为的准则,并在遇到任何他们认为不适当、有威胁、冒犯或有害的行为时采取适当且公平的纠正行动。
+
+社区领导者有权利和责任删除、编辑或拒绝与本行为准则不符的评论、提交、代码、wiki 编辑、议题及其他贡献,并在适当时就审核决定的原因进行沟通。
+
+## 适用范围
+
+本行为准则适用于所有社区空间,也适用于当个人在公共空间中正式代表本社区时的情形。代表我们社区的示例包括:使用官方电子邮件地址、通过官方社交媒体账号发帖,或在线上或线下活动中担任指定代表。
+
+## 执行
+
+如遇到骚扰、滥用或其他不可接受的行为,可通过 GitHub Issues 或在本仓库的 Discussions 中向社区维护者报告。所有投诉都将被迅速、公平地审查和调查。
+
+所有社区领导者有义务尊重任何事件报告者的隐私和安全。
+
+## 执行指南
+
+社区领导者将遵循以下社区影响指南,确定对违反本行为准则的任何行为的后果:
+
+### 1. 纠正
+
+**社区影响**:使用不当语言或其他被认为不专业或社区不欢迎的行为。
+
+**后果**:社区领导者会发出私人书面警告,说明违规的性质并解释为何该行为不当。可能会要求公开道歉。
+
+### 2. 警告
+
+**社区影响**:单次事件或一系列行为的违规。
+
+**后果**:警告并说明持续行为的后果。在指定时间内不得与相关人员互动,包括主动与执行本行为准则的人员互动。这包括避免在社区空间以及社交媒体等外部渠道进行互动。违反这些条款可能会导致临时或永久封禁。
+
+### 3. 临时封禁
+
+**社区影响**:严重违反社区准则,包括持续的不当行为。
+
+**后果**:在指定时间内临时禁止与社区进行任何形式的互动或公开通信。在此期间,不允许与相关人员进行任何公开或私下的互动,包括主动与执行本行为准则的人员互动。违反这些条款可能会导致永久封禁。
+
+### 4. 永久封禁
+
+**社区影响**:表现出违反社区准则的模式,包括持续的不当行为、对某个人的骚扰或对某类人群的攻击或诋毁。
+
+**后果**:永久禁止在社区内进行任何形式的公开互动。
+
+## 归属
+
+本行为准则改编自 [Contributor Covenant][homepage] v2.1 版,详情请访问 [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]。
+
+社区影响指南的灵感来自 [Mozilla 的行为准则执行阶梯][Mozilla CoC]。
+
+有关本行为准则常见问题的解答,请参阅 [https://www.contributor-covenant.org/faq][FAQ]。其他语言的翻译请参阅 [https://www.contributor-covenant.org/translations][translations]。
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
diff --git a/Dockerfile b/Dockerfile
index 99a709f..a909e6b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -28,12 +28,13 @@ RUN apt-get update && \
COPY --from=builder /install /usr/local
# 复制项目代码
-COPY config_manager.py llm_service.py sd_service.py mcp_client.py main.py ./
-COPY requirements.txt ./
-COPY config.example.json ./
+COPY main.py requirements.txt ./
+COPY services/ services/
+COPY ui/ ui/
+COPY config/config.example.json config/config.example.json
# 创建工作目录
-RUN mkdir -p xhs_workspace
+RUN mkdir -p xhs_workspace config logs
# Gradio 默认端口
EXPOSE 7860
diff --git a/README.md b/README.md
index fe73d94..5ed7b76 100644
--- a/README.md
+++ b/README.md
@@ -13,6 +13,11 @@
FAQ •
贡献
+
+
+
+
+
---
@@ -91,7 +96,7 @@
```bash
# 1. 克隆项目
-git clone https://github.com/your-username/xhs-autobot.git
+git clone https://github.com//xhs-autobot.git
cd xhs-autobot
# 2. 创建虚拟环境(推荐)
@@ -105,8 +110,8 @@ source .venv/bin/activate
pip install -r requirements.txt
# 4. 复制配置文件并填写你的 API Key
-cp config.example.json config.json
-# 编辑 config.json,填写 api_key、base_url 等
+cp config/config.example.json config/config.json
+# 编辑 config/config.json,填写 api_key、base_url 等
# 5. 启动!
python main.py
@@ -120,12 +125,12 @@ python main.py
```bash
# 1. 克隆项目
-git clone https://github.com/your-username/xhs-autobot.git
+git clone https://github.com//xhs-autobot.git
cd xhs-autobot
# 2. 准备配置文件
-cp config.example.json config.json
-# 编辑 config.json,填写 api_key、base_url 等
+cp config/config.example.json config/config.json
+# 编辑 config/config.json,填写 api_key、base_url 等
# ⚠️ mcp_url 改为容器网络地址:
# "mcp_url": "http://xhs-mcp:18060/mcp"
@@ -164,7 +169,7 @@ docker compose exec xhs-autobot bash
#### 启用 Stable Diffusion(需要 NVIDIA GPU)
-编辑 `docker-compose.yml`,取消 `sd-webui` 部分的注释,并将 `config.json` 中的 `sd_url` 改为:
+编辑 `docker-compose.yml`,取消 `sd-webui` 部分的注释,并将 `config/config.json` 中的 `sd_url` 改为:
```json
"sd_url": "http://sd-webui:7860"
@@ -205,11 +210,11 @@ python launch.py --api
### 首次使用流程
-1. **配置 LLM** — 展开「⚙️ 全局设置」,添加 LLM 提供商(API Key + Base URL),点击「连接 LLM」
-2. **连接 SD**(可选)— 填写 SD WebUI URL,点击「连接 SD」
+1. **配置 LLM** — 切换到「⚙️ 配置」 Tab,添加 LLM 提供商(API Key + Base URL),点击「连接 LLM」
+2. **连接 SD**(可选)— 在「⚙️ 配置」 Tab 填写 SD WebUI URL,点击「连接 SD」
3. **检查 MCP** — 点击「检查 MCP」确认小红书服务正常
-4. **登录小红书** — 切换到「🔐 账号登录」Tab,扫码登录
-5. **选择人设** — 在人设下拉框选择博主人设(影响文案风格 + 图片视觉)
+4. **登录小红书** — 切换到「🔐 账号登录」 Tab,扫码登录
+5. **选择人设** — 在「⚙️ 配置」 Tab 的人设下拉框选择博主人设(影响文案风格 + 图片视觉)
6. **开始创作** — 切换到「✨ 内容创作」Tab,输入主题,一键生成
### 自动化运营
@@ -243,7 +248,7 @@ python launch.py --api
## ⚙️ 配置说明
-配置文件 `config.json` 会在运行时自动创建和保存。首次使用请从 `config.example.json` 复制:
+配置文件 `config/config.json` 会在运行时自动创建和保存。首次使用请从 `config/config.example.json` 复制:
```json
{
@@ -280,24 +285,47 @@ python launch.py --api
```
xhs-autobot/
-├── main.py # 主程序入口 (Gradio UI + 业务逻辑 + 8 个 Tab)
-├── config_manager.py # 配置管理模块 (单例、自动保存)
-├── llm_service.py # LLM 服务封装 (文案生成、热点分析、评论回复、SD Prompt 指南)
-├── sd_service.py # Stable Diffusion 服务封装 (3 模型适配、9 人设视觉方案)
-├── mcp_client.py # 小红书 MCP 客户端 (搜索、发布、评论、点赞)
-├── analytics_service.py # 笔记数据分析 & 权重学习服务
-├── publish_queue.py # 内容排期队列 (SQLite + 后台 Publisher)
-├── config.json # 运行时配置 (gitignore)
-├── config.example.json # 配置模板
+├── main.py # 主程序入口 (Gradio UI + 事件绑定)
+├── config/ # 配置文件目录
+│ ├── config.json # 运行时配置 (gitignore)
+│ └── config.example.json # 配置模板
+├── logs/ # 运行日志 (gitignore)
+│ └── autobot.log
+├── docs/ # 参考文档
+│ └── mcp.md # xiaohongshu-mcp 参考文档
+├── scripts/ # 运行时生成的启动脚本 (gitignore)
+│ ├── _autostart.bat
+│ └── _autostart.vbs
├── requirements.txt # Python 依赖
+├── requirements-dev.txt # 开发工具依赖 (ruff 等)
├── Dockerfile # Docker 镜像构建
├── docker-compose.yml # Docker Compose 编排
-├── .dockerignore # Docker 构建排除规则
-├── xhs_workspace/ # 导出的文案和图片 (gitignore)
-│ ├── publish_queue.db # 排期队列数据库
-│ ├── analytics_data.json # 笔记表现数据
-│ └── content_weights.json # 内容权重数据
-└── autobot.log # 运行日志 (gitignore)
+├── services/ # 业务逻辑层
+│ ├── config_manager.py # 配置管理模块 (单例、自动保存)
+│ ├── llm_service.py # LLM 服务封装 (文案生成、热点分析等)
+│ ├── sd_service.py # Stable Diffusion 服务封装 (3 模型适配、9 人设视觉方案)
+│ ├── mcp_client.py # 小红书 MCP 客户端 (搜索、发布、评论、点赞)
+│ ├── analytics_service.py # 笔记数据分析 & 权重学习服务
+│ ├── publish_queue.py # 内容排期队列 (SQLite + 后台 Publisher)
+│ ├── scheduler.py # 自动化运营调度器
+│ ├── content.py # 文案生成、图片生成、导出、发布
+│ ├── hotspot.py # 热点探测、热点生成、笔记缓存
+│ ├── engagement.py # 评论管家:手动评论、回复、互动
+│ ├── profile.py # 小红书账号 Profile 解析与可视化
+│ ├── persona.py # 人设管理:常量、关键词池、主题池
+│ ├── connection.py # LLM/SD/MCP/XHS 连接管理
+│ ├── queue_ops.py # 发布队列操作
+│ ├── rate_limiter.py # 频率控制、每日限额、冷却管理
+│ └── autostart.py # Windows 开机自启管理
+├── ui/ # Gradio UI 层
+│ ├── app.py # 主界面构建函数(全部 Tab UI + 事件绑定)
+│ └── tab_create.py # Tab 1「✨ 内容创作」组件定义
+├── assets/
+│ └── faces/ # 头像文件目录 (gitignore)
+└── xhs_workspace/ # 导出的文案和图片 (gitignore)
+ ├── publish_queue.db # 排期队列数据库
+ ├── analytics_data.json # 笔记表现数据
+ └── content_weights.json # 内容权重数据
```
---
@@ -371,7 +399,7 @@ xhs-autobot/
Q: 如何添加自定义人设?
-在人设下拉框中直接输入自定义人设描述即可(支持自由输入)。如需配套主题池和关键词,需在 `main.py` 的 `PERSONA_POOL_MAP` 中添加对应条目。如需配套 SD 视觉方案,需在 `sd_service.py` 的 `PERSONA_SD_PROFILES` 中添加。
+在人设下拉框中直接输入自定义人设描述即可(支持自由输入)。如需配套主题池和关键词,需在 `services/persona.py` 的 `PERSONA_POOL_MAP` 中添加对应条目。如需配套 SD 视觉方案,需在 `services/sd_service.py` 的 `PERSONA_SD_PROFILES` 中添加。
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..a4ff18d
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,36 @@
+# 安全政策
+
+## 支持的版本
+
+目前我们对以下版本提供安全更新支持:
+
+| 版本 | 支持状态 |
+| ---- | -------- |
+| main 分支(最新提交) | ✅ 支持 |
+| 旧版本 / 存档提交 | ❌ 不支持 |
+
+## 报告安全漏洞
+
+**请勿通过公开的 GitHub Issues 上报安全漏洞。**
+
+如果您发现了安全漏洞,请通过以下方式私下联系我们:
+
+1. **GitHub Security Advisory(推荐)**:访问本仓库的 [Security → Advisories](../../security/advisories/new) 页面,点击「Report a vulnerability」提交私密报告。
+
+2. **私信维护者**:如无法使用上述方式,可通过 GitHub 私信联系仓库维护者。
+
+### 报告内容请包含
+
+- 漏洞的详细描述
+- 影响范围(受影响的版本、功能模块)
+- 复现步骤(如可能)
+- 潜在影响评估
+- 您建议的修复方案(如有)
+
+## 响应承诺
+
+- 我们会在 **7 个工作日内** 确认收到您的报告
+- 我们会在 **30 天内** 评估漏洞并提供修复时间表
+- 修复发布后,我们会在 Release Notes 中公开致谢(如您同意)
+
+感谢您帮助保持本项目的安全!
diff --git a/Todo.md b/Todo.md
deleted file mode 100644
index ab1c0a1..0000000
--- a/Todo.md
+++ /dev/null
@@ -1 +0,0 @@
-目前的脚本已经实现了从 “灵感 -> 文案 -> 绘图 -> 发布” 的核心闭环,作为一个个人辅助工具(MVP,最小可行性产品)已经非常出色了。但是,如果要作为一个专业的运营工具或者满足商业化需求,目前的版本还存在明显的短板。我将从 内容质量、运营闭环、账号安全、功能深度 四个维度为你进行全面分析,并给出升级建议。📊 当前功能评分表维度当前得分评价核心流程⭐⭐⭐⭐⭐流程跑通,无需在多个软件间切换,效率极大提升。内容质量⭐⭐⭐LLM 文案通用性强但个性不足;SD 绘图仅支持基础生图,缺乏精细控制。运营功能⭐⭐仅支持“发”,缺乏“看”(数据分析)和“回”(评论互动)。多媒体能力⭐⭐仅支持图片,不支持视频(尽管 MCP 支持)。稳定性⭐⭐⭐依赖本地环境和 Cookie 有效期,缺乏异常重试和账号管理。🔍 深度差距分析与改进建议1. 视觉能力的局限性 (痛点:图片不可控)目前使用的是基础的 txt2img(文生图)。问题:很难控制人物姿势、保持角色一致性(比如同一个博主IP)、或者在特定背景中植入产品。缺口:ControlNet 支持:无法指定姿势(Openpose)或线稿上色(Canny)。LoRA 切换:无法快速切换画风(如:二次元 vs 真实感 vs 胶片风)。Img2Img:无法基于参考图进行修改。💡 改进建议:在 UI 中增加 ControlNet 参数接口,或者增加“风格预设”下拉框(后台自动切换 LoRA)。2. 缺乏“选题与热点”辅助 (痛点:不知道写什么)目前主要依赖用户自己输入“主题”。问题:如果用户不知道最近什么火,写的文章可能没人看。缺口:MCP 搜索能力未利用:xiaohongshu-mcp 有 search_feeds 功能,但脚本里没用。💡 改进建议:增加 “热点探测” tab。逻辑:用户输入关键词 -> 调用 MCP 搜索 -> LLM 分析热门笔记的标题和结构 -> 生成“爆款模仿”方案。3. 缺失视频支持 (痛点:视频流量更大)小红书目前对视频流量扶持很大。问题:目前的 UI 和逻辑只支持图片。虽然 MCP 支持 publish_with_video,但你没接。💡 改进建议:UI 增加“上传视频”或“AI 生成视频”入口。接入 Runway / Luma API 或本地 AnimateDiff 生成几秒的动态视频。4. 运营互动的缺失 (痛点:发完不管)运营小红书,“养号”和“回复” 与发帖一样重要。问题:目前是“射后不理”。缺口:评论管理:无法自动回复评论,无法引导私域。数据反馈:发出去的笔记有多少阅读?脚本里看不到。💡 改进建议:增加 “评论管家” 模块:定期调用 MCP 获取新评论 -> LLM 生成回复 -> 调用 MCP 回复。增加 “数据看板”:调用 user_profile 展示昨日点赞涨粉数。5. 账号矩阵与安全性 (痛点:单点风险)问题:目前是单账号模式。缺口:多账号切换:如果我有 5 个号,需要反复手动扫码或替换 Cookie 文件。定时发布:只能“立即发布”。真正运营需要设定在晚高峰(18:00-21:00)自动发。💡 改进建议:引入简单的 SQLite 数据库或 JSON 文件管理多组 Cookie。引入 APScheduler 库,实现“存入草稿箱,特定时间自动调用 MCP 发布”。🛠️ 下一步升级路线图 (Roadmap)如果你想把这个脚本升级为V2.0 专业版,建议按以下顺序添加功能:第一阶段:补全 MCP 能力 (低成本,高回报)接入搜索功能:在写文案前,先让 AI 看 5 篇同类热门笔记。接入数据面板:在侧边栏显示当前账号粉丝数、获赞数。第二阶段:增强视觉 (提升内容力)SD 进阶:支持上传参考图 (img2img)。本地图库:有时候不想用 AI 图,想混排自己拍的照片,增加“本地上传”按钮。第三阶段:自动化运营 (解放双手)自动回复机器人:根据设定的人设(知性姐姐/毒舌博主)自动回评论。定时任务:设置一个队列,让它自己跑。
\ No newline at end of file
diff --git a/_autostart.bat b/_autostart.bat
deleted file mode 100644
index 83cf4b4..0000000
--- a/_autostart.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-@echo off
-cd /d "F:\3_Personal\AI\xhs_bot\autobot"
-"F:\3_Personal\AI\xhs_bot\autobot\.venv\Scripts\pythonw.exe" "F:\3_Personal\AI\xhs_bot\autobot\main.py"
diff --git a/_autostart.vbs b/_autostart.vbs
deleted file mode 100644
index 5a0b37c..0000000
--- a/_autostart.vbs
+++ /dev/null
@@ -1,3 +0,0 @@
-Set WshShell = CreateObject("WScript.Shell")
-WshShell.Run chr(34) & "F:\3_Personal\AI\xhs_bot\autobot\_autostart.bat" & chr(34), 0
-Set WshShell = Nothing
diff --git a/_test_config_save.py b/_test_config_save.py
deleted file mode 100644
index 3ae0b91..0000000
--- a/_test_config_save.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""
-测试配置保存和加载功能
-"""
-import json
-from config_manager import ConfigManager
-
-# 测试配置保存
-cfg = ConfigManager()
-
-print("=== 测试LLM提供商切换保存 ===")
-print(f"当前激活: {cfg.get('active_llm')}")
-
-# 切换到 wolfai
-cfg.set_active_llm("wolfai")
-print(f"切换后: {cfg.get('active_llm')}")
-
-# 重新加载验证
-cfg2 = ConfigManager()
-print(f"重新加载: {cfg2.get('active_llm')}")
-
-# 检查config.json文件内容
-with open("config.json", "r", encoding="utf-8") as f:
- data = json.load(f)
- print(f"\nconfig.json中的active_llm: {data.get('active_llm')}")
- print(f"api_key: {data.get('api_key', '')[:20]}...")
- print(f"base_url: {data.get('base_url')}")
-
-print("\n=== 测试其他全局设置保存 ===")
-print(f"当前persona: {cfg.get('persona')}")
-cfg.set("persona", "测试人设")
-print(f"修改后persona: {cfg.get('persona')}")
-
-# 重新验证
-with open("config.json", "r", encoding="utf-8") as f:
- data = json.load(f)
- print(f"config.json中的persona: {data.get('persona')}")
-
-print("\n✅ 测试完成")
diff --git a/beauty.png b/beauty.png
deleted file mode 100644
index a5b932370e9c8a62391542d6e17c13b594c98141..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 6764108
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