欢迎光临
我们一直在努力

Python自动化实战:一个人写了一套店群矩阵系统,我是如何把6人团队缩减到1人的

一、六个运营,月薪四万,干的全是“复制粘贴”

老周是我认识三年的朋友,做拼多多店群,手里有将近400个店铺。

今年三月他约我喝酒,一脸疲倦。

“林哥,我快撑不住了。”

原来他养了六个全职运营,三班倒,每天的工作就是—— 打开一个店铺,清理缓存,换IP,登录,上架商品,对账。 然后下一个店铺,重复。

400个店铺,每天光切号登录就要耗掉大半天。 活不重,但极其熬人。 在这里插入图片描述

“六个人,一个月光工资就四万多,”老周说,“更别提社保、房租、管理。 最离谱的是,上个月一个小姑娘手滑,把A店的东西传到了B店, 平台直接关联,连封了我17个店,差点没把我送走。”

他找过脚本作者,也买过群控软件。

要么是那种黑框框跑的脚本,跑几个店就卡死, 要么是界面花里胡哨的所谓“群控系统”,年费大几万, 最要命的是,账号数据全在人家服务器上,你敢放心?

老周说,他想过缩减团队,但又怕店铺运转不过来。 招人累,管人更累。

那天喝完酒,我答应他: “给我三个月,我给你一套东西,让你只用一个人,把400个店管得明明白白。”

这套东西,就是后来我独立开发的 Alien 店群自动化管理系统。

拼多多店群自动化上架方案

二、不做补丁,直接重构——用商业软件的思维做自动化

在这里插入图片描述

说实话,一开始我也想过偷懒。

在影刀RPA里拖几个流程,用一些现成的浏览器管理插件, 勉强把切号、上架流程串起来,再给老周写个使用说明,交差。

但当我真正把几十个店铺放进测试环境跑的时候, 问题像水龙头一样往外冒——

  • 浏览器窗口一多,内存曲线直接拉成悬崖,20分钟必崩
    • 流程跑着跑着,店铺环境就串了,Cookie写进同一个目录
    • 某个任务卡住,所有后续排队任务全跟着瘫痪
    • 老周打开黑框框日志,一脸茫然:“这红字啥意思?” 我意识到,这件事不是在影刀上缝缝补补能解决的。

老周需要的不是一个脚本。 是一个他能双击打开、看得见界面、点了按钮就能干活的商业软件。

于是我推倒重来,做了三个决定:

第一,浏览器底层环境做物理级隔离,每个店铺独立的存储、指纹、代理

第二,任务调度做工厂流水线式管理,槽位控制,超时回收,不死机 第三,交付做黑盒打包,一个exe文件,双击启动,不带任何依赖 技术栈定下来:Python + PyQt6 + DrissionPage + 影刀RPA + Nuitka。 在这里插入图片描述

全部自己写,白盒交付给老周,数据全在他本地,安全他自己掌控。

三、第一个降本点:把“人工切号”从流程里彻底删除

3.1 运营最怕什么?不是累,是错

老周的团队里,小姑娘们最常说的三句话:

“老板,我切到哪个店了?” “老板,刚才那个店好像传错了……” “老板,我清理过缓存了呀,怎么还是登错号?”

这些问题的根源,是店铺环境管理没有可视化,没有隔离。

我做的第一个大模块,就是 Alien 系统的 “环境管理中心”。

打开软件,第一眼看到的不再是黑框, 而是一个清爽的表格面板,每一行是一个店铺。 在这里插入图片描述

3.2 为真实工作流设计的三个“救命功能”

这个面板没有花哨动画,但埋了无数个日夜跟老周磨出来的细节。

第一,分组管理。

店铺可以按平台、按类目、按地区分组—— “拼多多-美妆”、“TK-东南亚”、“1688-源头货”…… 文件夹式收纳,一键收起展开。

老周说他以前管理400个店铺,靠的是Excel和脑子记, 现在全在分组树里,一眼就知道哪个类目有多少店。

第二,批量导入模板。

他只需要在 CSV 里填三列:店铺名、代理IP、指纹模板, 往窗口里一拖,400个店铺的环境,几秒钟全部建好。

以前一个店铺一个店铺手动建 Chrome 快捷方式的日子,彻底结束了。

在这里插入图片描述

TEMU店群如何管理运营?

第三,手动打开选中环境。

这是最不起眼、但最救命的按钮。

老板或运营想人肉看一下某个店铺的状态, 双击对应行,弹出一个完全隔离的浏览器窗口。

关键是—— 窗口标题上,我强制注入了店铺名称和ID, 哪怕同时打开十个窗口,也不会点错。

运营小姑娘第一次用的时候跟我说:“林哥,这下我再也不会手滑了。”

3.3 底层:每个店铺,都是一栋独立的“房子”

在这里插入图片描述

界面之下,隔离是如何实现的?

核心思路:每个店铺拥有自己独立的浏览器用户数据目录。

所有 Cookie、缓存、localStorage、IndexedDB, 全部物理隔离,底层没有任何共享。

同时还绑定了独立代理和独立指纹。

指纹怎么处理的? 我维护了一个指纹模板库,每次创建环境时, 基于模板做微量随机化——Canvas 噪点偏移几个像素,WebGL 参数微调, 确保每个店铺的指纹有细微差异,不会被平台聚类。

下面这段代码,是 Profile 工厂的精简版, 每次调用,都稳定生成一个完全隔离的环境对象:

import os
import uuid
import json
import copy
import random
from pathlib import Path

class BrowserProfileFactory:
"""
为每个店铺创建物理隔离的浏览器环境
"""

def __init__(self, data_root: str, fp_templates: dict):
self.data_root = data_root
self.fp_templates = fp_templates
def create(self, shop_id: str, shop_name: str, proxy: dict, fp_tpl_id: str):
# 稳定生成唯一目录,保证同一店铺每次定位到同一目录
dir_hash = uuid.uuid5(uuid.NAMESPACE_DNS, shop_id)
user_data_dir = os.path.join(self.data_root, f"profile_{dir_hash}")
# 深拷贝指纹模板并加入随机噪声
template = copy.deepcopy(self.fp_templates.get(fp_tpl_id, {}))
template["canvas_noise"] = random.randint(0, 5)
template["webgl_noise"] = random.randint(0, 3)
# 确保目录创建并写入配置
Path(user_data_dir).mkdir(parents=True, exist_ok=True)
with open(os.path.join(user_data_dir, "proxy.json"), "w") as f:
json.dump(proxy, f)
with open(os.path.join(user_data_dir, "fp.json"), "w") as f:
json.dump(template, f)
return {
"shop_id": shop_id,
"shop_name": shop_name,
"user_data_dir": user_data_dir,
"proxy": proxy,
"fingerprint": template
}
```
有了这个工厂,建环境比新建文件夹还快。

老周后来跟我算账:
以前招一个人,培训三天才能独立切号,
现在新来的实习生,软件打开,点两下就会用。
人力培训成本,直接归零。

## 四、第二个降本点:用“智能编排”替代“人盯进程”

### 4.1 几百个店,谁先跑,谁后跑,什么时候停?

店铺环境搞定了,下一个问题是:
怎么给这几百个店铺安排活?

老周的业务需求很碎:

* 拼多多需要每天凌晨自动上架一批商品
* * TikTok 东南亚站每周一次活动领券
* * 部分店铺需要每天中午自动回复客服消息
如果让人来盯着,
就得每天定闹钟,手动登录一个个店,一项项执行。

人在,活能干;人不在,活儿就停。

我设计了一套 **“拖拽式任务编排”** 系统,
直接让老周摆脱了对人的依赖。

打开 Alien 的“自动化编排流”面板,
左边是业务流程卡片:上架、领券、客服回复……
右边是店铺列表,可以从分组里直接拉取。

老周要做的,就是三步:

1. 从左边拖一个流程到编排区
2. 2. 在右边勾选要跑的店铺(或一键全选分组)
3. 3. 设置“最大并发窗口数”,比如 22,然后点开始
剩下的,系统全自动接管。

### 4.2 22个窗口并发,不死机的秘密

并发窗口数,是店群自动化的生死线。

开少了,400个店铺得跑到猴年马月。
开多了,内存直接爆炸,电脑蓝屏。

我设计了一个 **槽位制调度器**

把每一个“流程+店铺”的组合,封装成一个任务对象,
丢进异步队列。
调度器维护一个固定大小的信号量,比如 22 个槽位。

任何时候,只有抢到槽位的任务,才能启动浏览器并执行流程。
执行完毕或超时,槽位立刻释放,下一个排队任务补上。

这套机制,让系统资源始终可控——
100个店铺如此,400个店铺也是如此。

> 有一次我线上跑测试,窗口数开到30
> > 跑了不到十分钟,内存从 4G 飙到 15G,直接卡死。
> > 查了半天,发现是某个上架流程跑完后,浏览器渲染进程没杀掉,
> > 变成僵尸,后台默默吃资源。
> > 后来我给调度器加了一个**资源看门狗**协程,
> >15秒巡检一次,发现任务已结束但进程还活着,
> > 直接调系统命令强杀,并写一条红色报警。
> > 从此再也没崩过。
调度器的代码骨架如下,
你一看就知道“槽位+超时回收”怎么落地:

```python
import asyncio

class TaskScheduler:
"""槽位制调度器,控制并发窗口数与资源回收"""
def __init__(self, max_slots: int = 22, timeout: int = 3600):
self.semaphore = asyncio.Semaphore(max_slots)
self.queue = asyncio.Queue()
self.timeout = timeout
async def submit(self, task):
await self.queue.put(task)
async def _worker(self, wid: int):
while True:
task = await self.queue.get()
async with self.semaphore:
try:
await asyncio.wait_for(task.execute(), timeout=self.timeout)
except asyncio.TimeoutError:
print(f"[超时] 任务 {task.name} 强制回收")
task.kill()
except Exception as e:
print(f"[异常] 任务 {task.name}: {e}")
task.kill()
finally:
self.queue.task_done()
async def start(self, workers: int = 22):
ws = [asyncio.create_task(self._worker(i)) for i in range(workers)]
await self.queue.join()
for w in ws:
w.cancel()
```
每一个 task 内部,会调用影刀RPA的流程,
传递店铺的独立环境参数,跑完自动关浏览器,汇报结果。

老周现在每天晚上十点,设置好编排流,点击开始,
第二天早上来公司,看一眼报告,花五分钟处理失败项(基本都是代理波动),
以前六个人轮班干的事,现在一个人喝杯咖啡就盯完了。

## 五、第三个降本点:零门槛交付,告别“装环境两小时”

做过 Python 交付的都知道,最怕的是客户环境。

让客户装 Python 3.10、装一堆 whl、配环境变量、
浏览器驱动版本还要对齐……

这一套搞下来,技术都头疼,何况老周这种纯业务老板。

我用 **PyQt6** 手写了整个管理面板,
目的就一个:**让人看见就能操作**

四个主选项卡——环境管理、任务编排、运行监控、系统设置,
全部按钮化,中文提示,报错也是老板能看懂的话。

打包,我没有用 PyInstaller,
而是上了 **Nuitka**
把 Python 代码编译成 C 中间表示,
连同便携式 Chromium 内核,打包成一个单文件 exe。

老周拿到手,U盘拷过去,双击,GUI 启动,
所有环境就绪,直接跑任务。

他当时说了一句话:“这跟装个QQ一样简单啊。”

另外,商业软件必须有安全验证。
我给 Alien 加了一层离线+在线混合授权:

* 首次激活联网,绑定机器指纹
* * 日常离线可用,每 30 天验一次
* * 授权码 RSA+AES 加密,防复制
老周不用担心自己花几万块买的东西,第二天被人破解了放到网盘上。

## 六、真实账本:从6个人到1个人,我帮老周省了什么

交付三个月后,我回访老周。

他给我算了一笔账:

**以前:**

* 6个运营,月均工资 7000/人,合计 42000
* * 管理成本、培训、社保另算
* * 每月总有几次操作失误导致封店,隐性损失无法估算
**现在:**

* 1个运营兼管理,盯流程报告,处理异常,月薪 8000
* * 软件一次性买断,后续只有技术维护
* * 封店率下降了九成以上,因为环境隔离和窗口水印杜绝了手滑
老周说:“林哥,我这辈子最值的投资,就是找你做了这套系统。”

我知道这话有客气的成分,
但我确实感受到,好的自动化工具,真的可以改变一个小团队的命运。

## 七、写到最后

Alien 不是什么神兵利器。

它只是我在自动化和风控对抗里摸爬滚打这么多年后,
用最朴素的工程思路,
**环境隔离、任务调度、黑盒交付**做到极致的一个产物。

不做花架子,不做平台绑架,
代码在你本地,数据在你本地,
让你的店铺安安全全地自动运转。

如果你也在被店群的人力成本、串号封店、并发卡死折磨,
欢迎来找我聊聊。

我是林焱RPA,
一个用底层代码,死磕业务痛点的独立开发者。

(全文完)

赞(0)
未经允许不得转载:171主机测评 » Python自动化实战:一个人写了一套店群矩阵系统,我是如何把6人团队缩减到1人的
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址