一个人写了一套店群矩阵自动化软件我是如何从“每天封店”到“稳定躺赚”的阅读警告本文没有“首先其次最后”只有真实到刺骨的翻车现场。如果你觉得店群自动化就是录个脚本循环跑建议先买份保险。拼多多店群自动化上架方案 3. 文末有血泪清单建议收藏迟早用得上。两年前我的店群生意差点被风控干死。那时候我手里有一百多个拼多多和TEMU店铺请了两个运营全职打理。每天早上到公司第一件事不是看订单而是数一数昨晚又封了几个店。TEMU店群如何管理运营最惨的一次一夜之间被封了17个店铺。申诉回来的只有3个剩下的14个彻底凉了。损失超过两万块。我试过所有主流方案影刀RPA的社区版脚本跑着跑着就串号一个店铺的操作跑到了另一个店铺的后台AdsPower指纹浏览器环境隔离确实好但一百个店铺一个月好几千而且不支持批量流程编排找人定制开发报价五万起步还不保证稳定最后我拍桌子自己写。用Python做底层影刀RPA做手替PyQt6做界面。花了三个月写出了Alien 0.1版。又花了大半年迭代到了现在的稳定版。现在我的店铺数从一百多减到了八十个因为不需要那么多店了——每个店的产出翻了三倍。运营从两个减到了零我自己每天花二十分钟看一眼报表。这套系统就是我一个人写的。一、店群最大的坑你以为你懂环境隔离很多人知道店群要换IP、清缓存。但不知道平台风控在看什么。我拆解过拼多多和TEMU的前端指纹采集脚本它们会收集Canvas指纹通过画一个图形不同显卡渲染出来的像素点有微小差异WebGL供应商和渲染器音频指纹用AudioContext生成字体列表通过测量不同字体的宽度屏幕分辨率和色深时区和语言甚至浏览器的插件列表如果你只是换了代理IP清了Cookies但Canvas指纹、字体列表这些还是相同的平台照样能把你的店铺关联起来。这就是为什么很多人的店“明明换了环境还是被封”。Alien的解决方案是每个店铺不仅有自己的user-data-dir还要有一套独立生成的指纹参数。而且这些参数必须“稳定”——同一个店铺每次登录要一样不同店铺之间要足够随机。下面是我的环境管理核心代码。importosimportjsonimporthashlibimportrandomfrompathlibimportPathclassAlienProfile:ROOTPath(./AlienProfiles)def__init__(self,shop_id,platform):self.shop_idshop_id self.platformplatform self.pathself.ROOT/platform/shop_id self.user_dataself.path/user_dataself.fingerprint_fileself.path/fingerprint.jsondefcreate(self,proxy,groupdefault):self.path.mkdir(parentsTrue,exist_okTrue)self.user_data.mkdir(exist_okTrue)fpself._build_fingerprint(proxy,group)withopen(self.fingerprint_file,w)asf:json.dump(fp,f,indent2)# 预先创建缓存子目录避免首次启动时的权限问题(self.user_data/Cache).mkdir(exist_okTrue)(self.user_data/Local Storage).mkdir(exist_okTrue)(self.user_data/Session Storage).mkdir(exist_okTrue)returnstr(self.user_data)def_build_fingerprint(self,proxy,group):# 用shop_id作为种子保证稳定性和差异化seed_strf{self.platform}:{self.shop_id}:{group}:v2seedint(hashlib.md5(seed_str.encode()).hexdigest()[:8],16)rngrandom.Random(seed)# 分辨率池常见的避免太冷门res[(1920,1080),(1366,768),(1440,900),(1536,864),(2560,1440)]# 时区根据平台倾向tz_map{pdd:[Asia/Shanghai,Asia/Chongqing],temu:[America/New_York,America/Los_Angeles,Europe/London],tiktok:[America/New_York,Europe/London,Australia/Sydney]}# 语言lang_map{pdd:[zh-CN],temu:[en-US,en-GB],tiktok:[en-US,en-GB]}# WebGL厂商webgls[Google Inc. (Google),Intel Inc.,NVIDIA Corporation,AMD]return{proxy:proxy,group:group,screen_w:rng.choice(res)[0],screen_h:rng.choice(res)[1],timezone:rng.choice(tz_map.get(self.platform,[UTC])),language:rng.choice(lang_map.get(self.platform,[en-US])),platform:rng.choice([Win32,MacIntel]),webgl_vendor:rng.choice(webgls),hardware_concurrency:rng.choice([2,4,8]),do_not_track:rng.choice([True,False])}defload(self):ifnotself.fingerprint_file.exists():returnNonewithopen(self.fingerprint_file)asf:returnjson.load(f)defdelete(self):importshutilifself.path.exists():shutil.rmtree(self.path) 生成指纹后启动浏览器时把这些参数塞进Chrome命令行。 pythondeflaunch_alien(profile:AlienProfile):cfgprofile.load()cmd[chrome.exe,f--user-data-dir{profile.user_data},f--proxy-server{cfg[proxy]},f--window-size{cfg[screen_w]},{cfg[screen_h]},f--lang{cfg[language]},f--timezone{cfg[timezone]},--remote-debugging-port0,--disable-blink-featuresAutomationControlled,--no-first-run,--disable-default-apps]procsubprocess.Popen(cmd,stdoutsubprocess.DEVNULL,stderrsubprocess.DEVNULL)# 从输出中解析实际分配的调试端口... 这个方案上线后我的店铺关联封店率从每月的两位数降到了零。已经连续八个月没有因为“环境关联”被封过店。---## 二、Alien的环境管理中心截图级还原为了让运营也能轻松操作我做了完整的GUI。**主界面**顶部工具栏导入/导出/设置左侧分组树右侧店铺表格。**分组树**支持三级分组。比如“TEMU → 美国站 → 爆款组”。右键分组可以批量分配代理、批量执行流程。**店铺表格**每一行显示店铺ID、代理IP带国家图标、健康度绿色100%/黄色80%/红色50%、最后活跃时间、状态图标。每行末尾有“打开环境”按钮。**批量导入**下载CSV模板填好店铺ID和代理一键导入。系统自动生成指纹并创建Profile目录。一百个店铺的初始化从原来手动配置一整天变成一分钟。**手动打开选中环境**选中一行或多行点击按钮系统为每个店铺启动独立的Chrome窗口窗口标题显示店铺ID位置自动平铺。运营可以直接在这些窗口里手动登录、处理订单。这个功能让运营彻底告别了便利贴。---## 三、调度编排让22个窗口井井有条环境建好了下一步是让任务跑起来。 Alien的调度器是我写过最复杂的逻辑之一。 它要同时满足-最多22个浏览器窗口并发再多就卡--同一个店铺同一时间只能跑一个任务--不同店铺的任务可以任意并发--任务结束后窗口不关闭复用给下一个任务减少启动开销--空闲超过一定时间的窗口自动关闭并清理缓存 下面是一段调度器的核心逻辑生产版本简化后 pythonimportthreadingimportqueueimporttimefromconcurrent.futuresimportThreadPoolExecutorclassAlienScheduler:def__init__(self,max_workers22):self.max_workersmax_workers self.task_qqueue.Queue()self.active_count0self.active_lockthreading.Lock()self.shop_running{}self.shop_lockthreading.Lock()self.executorThreadPoolExecutor(max_workersmax_workers)defadd_task(self,shop_id,flow_id,paramsNone):self.task_q.put((shop_id,flow_id,params))def_worker(self):whileTrue:shop_id,flow_id,paramsself.task_q.get()# 等待该店铺没有正在运行的任务whileTrue:withself.shop_lock:ifnotself.shop_running.get(shop_id,False):self.shop_running[shop_id]Truebreaktime.sleep(0.5)# 等待有空闲并发槽位whileTrue:withself.active_lock:ifself.active_countself.max_workers:self.active_count1breaktime.sleep(0.5)self.executor.submit(self._run_task,shop_id,flow_id,params)def_run_task(self,shop_id,flow_id,params):try:portself._get_or_start_browser(shop_id)self._call_yingdao(flow_id,shop_id,port,params)finally:withself.active_lock:self.active_count-1withself.shop_lock:self.shop_running[shop_id]Falseself.task_q.task_done()def_get_or_start_browser(self,shop_id):# 检查该店铺是否有运行中的浏览器实例# 如果有返回调试端口如果没有启动一个新实例passdef_call_yingdao(self,flow_id,shop_id,port,params):importsubprocess,json cmd[影刀RPA.exe,-run,flow_id,-param,fshop_id{shop_id},-param,fdebug_port{port},-param,fparams{json.dumps(params)}]subprocess.run(cmd,timeout600,checkTrue)defstart(self):for_inrange(self.max_workers):threading.Thread(targetself._worker,daemonTrue).start() 这个调度器让我彻底告别了“并发卡死”。22个窗口同时跑任务CPU占用稳定在65-75%内存稳定在40-50%连续运行一个月都不用重启。**智能平铺**每次新开一个浏览器我通过Windows API计算窗口位置根据当前已打开窗口的数量自动排列成网格。运营不用再在任务栏里翻来找去。**资源回收**每个浏览器实例都有一个“最后使用时间”。调度器里有一个后台线程每隔5分钟扫描一次把空闲超过30分钟的实例关掉并清理其Cache目录。---## 四、从黑框框到商业软件PyQt6 PyInstaller最初的Alien是命令行版的输入指令、看日志。 老板说你给我看这个我招的大学生也能写。 于是我花了三周学了PyQt6重写了整个界面。**仪表盘**实时折线图显示并发窗口数、任务完成量、失败率。用pyqtgraph实现刷新率很高。**环境管理**QTreeView做分组树QTableView做表格。支持拖拽店铺到不同分组支持右键菜单批量操作。**流程编排**基于QGraphicsView的画布运营可以拖拽动作节点连线组成流程。不懂代码也能用。**日志面板**彩色输出ERROR标红WARNING标黄INFO默认。支持按店铺ID筛选日志。 整体暗黑主题按钮有悬停特效。客户说“这软件看起来至少值两万。” 打包用的是PyInstaller。我把Python解释器、所有依赖库、一个便携版Chromium约110MB全部塞进了一个Alien.exe。客户下载解压后双击就能用不需要装任何环境。 安全方面做了硬件绑定读取硬盘序列号和MAC地址生成机器码RSA签名授权。虽然不能100%防破解但挡住了99%的白嫖党。---## 五、那些让我想砸电脑的坑**坑1内存泄漏排查了两周。**第一次上线跑了一天内存从2GB慢慢涨到14GB然后卡死。我逐行排查发现每个浏览器实例退出后user-data-dir/Cache和Code Cache没有被清理。日积月累一个店铺的Profile能膨胀到3GB。解决方案在资源回收线程里对空闲超过一小时的店铺删除其Cache和Code Cache目录保留Cookies和LocalStorage。内存占用从此稳定。**坑2影刀进程异常退出浏览器成了孤儿。**影刀脚本偶尔会卡住超时后被调度器强制终止。但Chrome进程没被关掉几天后系统里积累了七八十个chrome.exe僵尸。解决方案在_run_task的finally块里不仅要释放Python资源还要通过psutil杀死对应的Chrome进程。**坑3代理IP的质量直接决定封店率。**我图便宜买过5块钱一天的静态代理用了两天十几个店铺被TEMU标记为“可疑流量”。后来换成30块钱一天的住宅代理池封店率从15%降到了0.5%。这个钱绝对不能省。**坑4运营的一个误删让我加了回收站。**有一次运营在环境管理界面全选了所有店铺然后点了“删除”。一瞬间一百多个环境配置全部消失。我恢复了半天的备份损失了当天的任务记录。从此之后删除操作先移到“回收站”7天后才真正物理删除。同时加了二次确认弹窗。---## 写在最后一个人写一套店群自动化系统听起来像是不可能完成的任务。 但拆解后每一个模块都有现成的技术方案-环境隔离 → Chromium的--user-data-dir--指纹伪装 → 启动参数稳定种子随机--并发调度 → 有界线程池店铺级互斥锁--界面封装 → PyQt6暗黑主题--打包交付 → PyInstaller便携浏览器 把这些串起来就是一个能稳定跑几百个店铺的商业系统。 我现在每天花二十分钟看一眼报表剩下的时间研究新平台的风控策略或者优化调度器的资源回收算法。 店群这条路要么你技术够硬自己写工具要么你钱够多请人写工具。没有第三条路。 希望这篇文章能帮你少走一些弯路。作者林焱独立开发者店群自动化架构师博客林焱RPA全网同名转载需授权喷子一律拉黑 全文约4600字