一切为了运营 | 我vibe了一个可控的小红书运营管理后台
最初,我通过CherryStudio调用MCP服务发布小红书笔记。这个方式适合快速验证:给出标题、正文和图片,服务控制手机完成发布。
但进入日常运营后,问题开始出现在“整条流程”上:某一步失败了,要知道手机停在哪里;标题和正文需要人工检查;多张图片要确认顺序;发布前必须留一个明确的确认点。
于是我把一次完整调用,改造成了一个可以观察和逐步执行的管理后台。下面主要分享这个系统的设计思路、架构和部署方式。

01
从“一次调用”改成“有状态的流程”
发布笔记不是一个原子操作,而是一组依赖手机当前页面的动作:推送图片、打开应用、进入相册、选图、填写标题和正文,最后点击发布。
如果把这些动作封装成一个长函数,任何一步失败,都很难从中间恢复。所以后台把发布拆为九个顺序步骤,每次只执行当前一步。成功后推进状态,失败则记录错误并停在原步骤。

每条草稿在SQLite中保存标题、正文、标签、图片列表、当前步骤、状态和执行记录。页面展示的是数据库中的实际状态,而不是凭前端猜测手机执行到了哪里。发布操作单独要求确认,避免误点导致内容公开。
这个设计也让失败更容易处理。比如相册选图失败,检查手机画面后可以重试选图步骤,不必重新推送图片。

02
系统由哪些部分组成
这套系统使用一个本地Python服务,模块之间的职责尽量简单:

一条内容的流转大致如下:
1.数据获取
文章导出接口->草稿库
2.内容加工
人工编辑/AI 生成
3.发布执行
分步发布->Android 手机上的小红书
4.二次分发
搜索笔记->转发群聊
管理后台与MCP服务仍可分别启动。MCP适合从对话中触发任务;后台适合审核、观察和重试。两者操作的是同一台手机,因此实际使用时应避免同时发起设备任务。

03
内容入口:定时同步,但不直接发布
后台启动后会定时请求文章导出接口,也允许在页面上选择日期手动同步。导出的CSV进入系统后,按文章原链接去重,并转成待发布草稿。
这里有一个容易忽略的时间字段:文章的“发布时间”可能是原始文章发表的日期,而“互动采集时间”才代表内容何时进入本次采集。因此同步范围按采集时间过滤,原发布时间仅用于展示。
导入只负责建立草稿,不直接触发手机发布。因为原文通常还需要改写,图片也可能要补充。把采集与发布分开,才能在中间保留人工审核。

04
AI是编辑助手,不是发布开关
后台可配置模型APIURL、APIKey、模型名和系统提示词。点击“AI生成”时,系统把草稿内容交给模型,要求返回多个标题候选、正文和标签,再由运营人员选择与修改。
这样设计有两个原因。第一,同一篇文章未必适合直接搬到小红书,标题和表达方式需要调整。第二,模型输出格式和内容都可能不稳定,必须在发布前有可见、可编辑的结果。
生成内容先进入编辑器,保存草稿后才会进入设备执行流程。

05
手机自动化:让页面状态可见
设备层通过ADB推送图片,通过uiautomator2查找并操作小红书界面元素。相册多图选择尽量根据界面元素和边界定位,减少对固定屏幕坐标的依赖。
手机UI自动化仍然有不确定性:弹窗、应用版本和网络加载都可能改变界面。后台因此保留了两种人工干预能力:
1 定时获取手机当前截图,可刷新和下载。
2 提供返回、主页、任务列表、左右滑动等设备按钮。
设备步骤、手动操作和转发共用任务锁,避免同一时刻对手机发出互相冲突的指令。遇到异常时,先看截图,再决定重试当前步骤或用设备按钮调整界面。
一些细节也需要针对真实App行为处理。例如,正文里写入#话题后,系统会通过一次复制粘贴触发小红书的话题识别;打开应用后找不到首页,会尝试关闭并重新启动一次。这些处理来自实际操作中的失败场景,而不是单纯的接口设计。

06
转发作为发布后的独立任务
发布完成后,后台可以获取最近一次已发布草稿的标题,用标题在小红书搜索,再查找作者为指定账号的结果。进入笔记详情后,通过小红书自己的分享面板选择目标群聊并发送。
转发没有塞进“发布笔记”步骤里。发布成功与群聊转发是两件事:前者决定内容是否公开,后者是后续分发。分开执行和记录,更容易判断失败发生在哪一段。
目前这部分依赖小红书搜索结果及页面元素,搜索排序或页面结构变化时仍可能需要调整选择逻辑。因此转发前保留界面观察与人工确认更稳妥。
07
如何部署这套后台
当前实现适合部署在一台能连接Android手机的Windows电脑上。基本条件是:Python3.10+、ADB、已登录小红书的手机,以及电脑到手机的稳定连接。文章导出接口和AI接口也需要从这台电脑访问。
部署顺序可以概括为:
1
建立Python虚拟环境并安装项目依赖。
2
开启手机调试,使用ADB连接并确认设备在线。
3
配置设备地址、文章导出接口和AI参数。
4
启动管理后台,在浏览器打开本机管理地址。
5
用截图和设备状态确认手机连接,再导入一条草稿试运行。

后台当前使用SQLite保存数据,并在服务进程内运行文章同步任务。部署时保持单个后台进程即可,避免多个进程重复执行定时同步。服务默认只监听本机地址;如果要让其他电脑访问,需要另外设计访问控制,而不是直接开放设备操作接口。
具体依赖、命令和可配置项已写在项目README中。这里更重要的部署原则是:让后台服务、ADB和手机处于一条稳定的连接链路中,同时保留对草稿数据库与上传图片目录的备份。
08
具体部署教程
下面给出两种部署方式。直接代码部署适合Windows单机和问题排查;Docker部署适合固定Python依赖、隔离服务并持久化数据。两种方式都需要一台已经登录小红书的Android手机,手机通过无线ADB与运行服务的环境通信。
方式一:直接代码部署
1.创建虚拟环境并安装依赖

如果PowerShell不允许激活脚本,可以直接使用虚拟环境解释器:

2.连接Android手机
手机开启开发者选项、USB调试或无线调试,然后连接设备:

必须看到设备状态为device。项目当前默认设备地址写在mcp_server.py的did变量中,更换手机时需要同步修改。
3.配置文章同步
文章导出服务可以通过环境变量配置:

AI模型的API、模型、提示词和转发群聊在后台“配置”页面填写,并保存到admin_data.sqlite3。
4.启动服务
启动管理后台:

浏览器访问http://127.0.0.1:8011/。如果还需要CherryStudio,通过另一个终端启动MCP:

MCP端点为http://127.0.0.1:8000/mcp。后台和MCP共用一台手机,不要同时发起设备任务。
5.部署后检查
依次检查adb devices、后台设备状态、手机截图和一条测试草稿。建议先执行到“填写正文”,确认标题、正文和#话题识别正常,再执行最终发布。
方式二:Docker部署
Docker部署只负责封装Python和ADB依赖,手机仍然通过网络ADB连接。项目根目录创建Dockerfile:

构建并启动后台:

进入容器测试无线ADB:

admindata.sqlite3和uploads/必须挂载到宿主机,否则容器删除后草稿、配置和上传图片会丢失。若mcpserver.py 中的did不是默认地址,需要在构建前修改它。
Linux主机可以使用--network host简化局域网ADB访问。Windows和macOS使用DockerDesktop时,要确认Docker、电脑和手机处在可互通的局域网,且无线ADB端口没有被防火墙拦截。
如果要同时运行后台和MCP,可以使用Compose:

启动和查看日志:

Docker不能解决小红书页面变化、登录失效或手机断网问题。它主要解决运行环境固定、服务隔离和数据持久化;手机连接和最终发布确认仍然需要真实设备参与。
方式三:打包为可执行文件
如果使用者不方便安装Python,可以把后台和MCP服务分别打包成目标平台的可执行文件。常用工具是PyInstaller:
python -m pip install pyinstaller
Windows:生成.exe
在Windows电脑上执行:
pyinstaller --clean --onefile --name xhs-admin admin_server.py
pyinstaller --clean --onefile --name xhs-mcp mcp_server.py
生成文件位于:
dist/xhs-admin.exe
dist/xhs-mcp.exe
启动后台:
distxhs-admin.exe
如果需要MCP,再打开另一个终端运行:
distxhs-mcp.exe
打包后的程序旁边仍然需要保留可写的admindata.sqlite3和uploads/目录。首次运行前,手机仍需要通过ADB连接,并且mcpserver.py 中的设备地址要在打包前配置好。
Linux:生成可执行文件
Linux上需要在Linux环境中构建Linux版本,不能直接拿Windows生成的.exe运行:
python3 -m pip install pyinstaller
pyinstaller --clean --onefile --name xhs-admin admin_server.py
pyinstaller --clean --onefile --name xhs-mcp mcp_server.py
chmod +x dist/xhs-admin dist/xhs-mcp
./dist/xhs-admin
Linux服务器还需要安装ADB,并确保运行用户有权限访问ADB设备。可以使用adb connect连接无线调试手机,或者通过USB连接Android设备。
macOS:生成可执行文件或.app
macOS同样需要在macOS上构建:
python3 -m pip install pyinstaller
pyinstaller --clean --onefile --name xhs-admin admin_server.py
pyinstaller --clean --onefile --name xhs-mcp mcp_server.py
./dist/xhs-admin
如果需要图形化应用包,可以使用:
pyinstaller --clean --windowed --name xhs-admin admin_server.py
构建结果会出现在dist/xhs-admin.app。不过这个项目的管理后台本身是浏览器页面,服务器型部署通常使用--onefile可执行文件更简单;.app更适合需要从桌面图标启动的场景。
打包部署时需要保留的内容
无论使用哪个平台,打包只封装Python运行时和代码,以下内容仍然需要单独准备:
• Android手机和ADB连接
• 小红书登录状态
• admin_data.sqlite3数据库文件
• uploads/上传图片目录
• 文章导出服务的网络访问权限
• AI API的网络访问权限
PyInstaller不支持可靠的跨平台交叉编译。Windows.exe在Windows上构建,Linux可执行文件在Linux上构建,macOS.app在macOS上构建。建议为每个平台准备独立的构建机或CI构建任务。
09
设计上的取舍
这不是一个完全无人值守的发布系统。它把重复动作交给程序,把内容审核、异常判断和最终发布确认留给人。
对我来说,最有价值的变化不是“少点几次按钮”,而是把原本藏在一次自动化调用里的状态显露出来:现在能看到内容从哪里来、正在执行哪一步、手机停在哪个页面,以及失败后该从哪里继续。
当一条内容从采集、改写、配图走到发布和转发,系统的每个环节都有明确边界。后续无论增加新的内容来源、模型或设备操作,都可以沿着这些边界扩展。
