一、先说一次集体触发的验证
先说事故。一个做区域农产品推广的团队,手上三十多个内容账号,分布在不同类型的平台上。图省事,他们写了个脚本,把所有账号的登录态存在一起,循环调用发布,一晚上推出去两百多条。第二天登录,七成账号被要求验证,其中几个直接被限制了发布权限。
事后复盘,问题不在脚本写得好不好,而在它把三十个身份当成了一个身份。平台看一段发布行为,从来不只看单个请求,它看的是这批请求之间的关系,同一台机器、同一个出口、同样的节奏、同样的内容,这些信号叠在一起,判定就很明确。
所以多平台分发这件事,本质不是自动化问题,是身份与节奏的编排问题。后面我们把这一层重新做了一遍,拆成四件事,身份隔离、节奏控制、队列调度、状态回写。
二、账号隔离要隔离三层,不是只换 IP
很多人一提账号隔离就说换 IP,这只做到三分之一。真正要隔开的是三层,网络层、浏览器上下文、本地存储。
网络层是出口 IP,每个账号尽量走独立出口。这里有个取舍,动态 IP 便宜但会跳,静态 IP 稳但贵,品牌类账号建议走静态,跑量测试的可以动态。要注意的是别让一个账号今天走国内、明天走境外,这种跳变本身就是异常信号,平台侧一眼就能看出来。
浏览器上下文是第二层。同一个浏览器内核里开着多个账号,指纹字段会互相污染,做法是每个账号给一个独立的上下文目录,缓存、Cookie、本地存储各存一份,互不可见。
第三层是本地存储。账号凭据加密后落在本地盘,不上传云端。这一层既是安全考虑,也是合规考虑,尤其是替客户代运营的团队,数据不出本机是底线,很多客户在合同里就会把这一条写进去。
有人会问,能不能用同一份登录态反复切换账号。答案是不行。登录态是成套的,Cookie、Local Storage、Session Storage 三者互相绑定,只换其中一样,平台那边认不出你,页面会直接跳回登录页。这也是为什么多开这件事看着简单,做扎实了全是细活。
三、发布间隔的语义,很多人一开始都理解反了
这是我们在实际项目里被问得最多的一个问题。"我设了三个账号,间隔三十分钟,为什么三个账号是同时发出去的。"答案是间隔的语义被理解反了。
间隔指的是同一个账号的两篇文章之间要等多久,不是账号与账号之间的间隔。A 账号发完第一篇,接着发 B 账号的第一篇,再发 C 账号的第一篇,一轮走完回到 A 发第二篇,这时候才等那个间隔。
理解这一层之后,参数怎么设就清楚了。间隔值不要设太大,超过一千秒容易在读取配置时出问题,需要跨小时、跨天的间隔,应该用定时任务去做,而不是把间隔值一味拉长。
还有两个配套规则值得一并考虑。同一个平台的两个账号不要推同一条内容,这是判重的高发区,要靠记录去判断,不能靠记性。每个平台的每日篇数也建议设上限,一天推二十条和推三条,账号的体感完全不一样。
四、任务队列不能只有一条道
内容生成这一侧有个特殊约束,调用网页版模型的通道是单线程的,同一时间只能跑一个任务。你手动关掉界面,进程往往还在,下一个任务一启动就报错,因为上一个没真正结束。
而直接调 API 的模型没有这个限制,可以按额度并发。所以我们把生成任务分成两条队列。网页模型队列严格串行,前一个任务状态回到完成,才放出下一个,中间还要留一个清理浏览器残留进程的动作。API 队列按配置的并发数并行,单条失败单独重试,不影响同批其他任务。
这套调度逻辑我们放在一个叫 AI智能媒体助理 的桌面工具里实现。它在设计上有个判断值得借鉴,不追求所有模型都支持并发,而是承认不同通道的约束不一样,把约束显式写进调度层。承认限制比假装没有限制,工程上要稳得多。
五、失败要能定位,不能只报一个错
批量任务最怕的不是失败,是失败了不知道断在哪一步。我们要求每一次发布都落一条状态记录,覆盖五个状态,待发、发布中、成功、失败、需人工。失败必须带上原始错误信息,而不是统一回一句操作失败。
落地时有几类高频原因值得提前处理。账号掉线,这一类占失败的一半以上,做法是发之前先做一次登录状态体检。内容缺图,有些平台必须有图片才能生成封面,文章里一张图都没有就会直接被拒。形态不匹配,长文推到只吃短内容的地方,接口层面就会拒绝,这类要在分发前就分好流。
还有一类是环境问题,比如某些平台依赖本机的 Node 运行环境,版本太旧就跑不动流程。这类问题在日志里其实留了痕,养成先看日志的习惯,比在界面上反复点重试快得多。
六、内容侧要配合,不然调度做得再细也白搭
调度做得再细,内容不配合也不会有好结果。我们要求在分发前先做一次格式适配,长内容的地方给详实版本,短内容的地方给精简版本,不要一份稿子原样推二十个地方,那样既浪费位置,也容易被判重。
首尾的固定信息也要能自动插入,比如版权声明和来源标注,这类东西每篇都要加,手工加一定漏。这个动作放在生成环节做完,分发环节就不用再管,流水线各管一段,责任才清楚。
放量这件事我们没有一次性做过。新账号、新平台的组合,先按个位数跑三天,把失败原因摸清了再放开。这套动作听着慢,实际上比上线后大面积失败再回头排查要快得多。批量任务的成本从来不在跑,在排查,能提前避免的排查就不该让它发生。
七、三个真实踩过的坑
第一个,代理没关。用境外的模型通道生成完内容后忘记关代理,接着去发布,账号的登录环境变了,直接触发验证。现在我们的流程里,生成和发布之间的开关是硬绑定的,生成任务一结束就归位。
第二个,新号抢跑。新注册的账号第一篇内容往往需要人工过一下,有的还要做一个图片验证的动作,脚本不知道这件事,直接推就失败。做法是新号的第一篇走人工流程,跑通之后再放进自动队列。
第三个,登录方式没统一。有些平台有双重验证,必须走手机验证码登录,用账号密码登进去的会话很快就失效,表现为发着发着就掉线,而日志里只写了一句登录失败。在建号阶段把登录方式统一成验证码,后面能省掉大量排查时间。
八、小结
把这件事拆开看,无非四层,身份隔离、节奏控制、队列调度、失败可查。四层里最难的不是技术,是承认每个通道都有它的限制,然后把这些限制一条条写进系统里,而不是指望操作的人记住。
这套思路在 AI智能媒体助理 里落成了具体功能,独立出口、账号分组、间隔与篇数上限、发布状态回写,都是这一层的实现。但更值得带走的不是工具本身,是那个判断,凡是能被写成规则的,就不要留给人的记性去扛。