朋友圈是私域触达里最容易被低估的面:群发是打扰,朋友圈是“静默曝光”,用户主动刷到才看到。但工程上的坑比群发多——它对账号状态敏感、对频率敏感,接口参数里的可见范围设计也比“全发”复杂得多。
这篇按落地阶段拆:每个阶段给一个产出物,最后给一份上线前评审清单。写代码之前先把边界搞清楚,能省掉大部分返工。
阶段一:接入前先确认边界(产出物:边界清单)
动手前先过这四条,每条都影响后面的方案设计:
- 新设备有窗口期。设备登录后 1-3 天内朋友圈功能受限——这是 WTAPI 开发文档里明写的限制,不是玄学。所以“新号登录当天就批量发圈”这种排期直接作废,账号要养过窗口期再进调度池。
- 发布是主动动作,风控等级高于回复。回复消息是“有人找我我才动”,发圈是“没人找我我也动”。频率治理按主动动作设计,别套用自动回复的节奏。
- 可见范围是接口参数,不是发完再改。允许谁看、不给谁看、@谁,都是发布接口的入参,要在发布前设计好,不要指望事后补救。
- 内容先审后发。朋友圈内容代表账号人设,机器生成的内容进人工审核队列,通过才进调度。
阶段二:接口封装(产出物:可复用的发布函数)
朋友圈发布走 sendTextSns,核心参数分三组:内容(content)、可见范围(privacy + allow/disable 两组名单)、触达增强(at 名单 + 标签维度)。封装成带类型注解的完整函数:
# WTAPI 接口平台 | 文档: https://weiti.apifox.cn
# 本文依赖:
# - 朋友圈发布: sendTextSns (appId/content/privacy/allowWxIds/disableWxIds/
# atWxIds/allowTagIds/disableTagIds)
# - 标签列表: label/list (appId -> labelList[{labelId, labelName}])
# - 官方限制: 新设备 1-3 天朋友圈功能受限, 调度池需排除窗口期账号
# 下一步: 控制台「微信实例」在线扫码拿 appId, 再验证本函数 | 官网: www.chuapi.com
from typing import Optional
import requests
BASE_URL: str = "https://wx.chuapi.com"
DAILY_LIMIT: int = 1 # 单账号单日发圈上限, 自控值, 宁少勿多
class PublishError(Exception):
pass
def can_publish(today_count: int, account_age_days: int) -> tuple[bool, str]:
"""节奏闸门: 窗口期不发, 单日上限自控。返回 (是否可发, 原因)。"""
if account_age_days < 3:
return False, "新设备限制窗口(官方口径 1-3 天), 只养不发"
if today_count >= DAILY_LIMIT:
return False, "当日额度用完, 余量留给人工"
return True, "ok"
def publish_sns(
app_id: str,
token: str,
content: str,
allow_wxids: Optional[list[str]] = None, # 可见名单
disable_wxids: Optional[list[str]] = None, # 不可见名单
at_wxids: Optional[list[str]] = None, # 圈内 @ 提醒
allow_tag_ids: Optional[str] = None, # 标签维度, 逗号分隔
disable_tag_ids: Optional[str] = None, # 同上, 与 allow 互斥使用
) -> dict:
"""发布一条朋友圈。allow/disable 两组名单的叠加语义、
privacy 的枚举取值, 均以文档为准, 不要凭感觉组合。"""
body: dict = {"appId": app_id, "content": content}
if allow_wxids:
body["allowWxIds"] = allow_wxids
if disable_wxids:
body["disableWxIds"] = disable_wxids
if at_wxids:
body["atWxIds"] = at_wxids
if allow_tag_ids:
body["allowTagIds"] = allow_tag_ids
if disable_tag_ids:
body["disableTagIds"] = disable_tag_ids
resp = requests.post(
f"{BASE_URL}/finder/v2/api/sns/sendTextSns",
json=body,
headers={"X-finder-TOKEN": token},
timeout=10,
)
data: dict = resp.json()
# 返回码语义以文档为准; 失败不自动重试, 进人工队列
if data.get("ret") != 200:
raise PublishError(f"sns 发布失败: {data}")
return data
两个工程判断写进了注释里:allow/disable 两组名单别凭感觉叠加,组合语义以文档为准;失败不自动重试,发圈的失败重试很容易变成重复发布,进人工队列更稳。
阶段三:可见范围设计(产出物:触达矩阵)
可见范围参数的真正价值,是配合标签体系做“人群包”触达。label/list 拉标签,allowTagIds/disableTagIds 按标签圈定可见范围——先给客户打标,再按标签决定这条圈给谁看:
| 触达场景 | 可见范围策略 |
|---|---|
| 活动通知 | 全员可见,重点客户加 @ 提醒 |
| 产品上新 | allowTagIds 圈定意向客户标签 |
| 内部演练 | disable 名单排除全部真实客户 |
注意 @ 提醒(atWxIds)要节制:@ 是强触达,同一个人被高频 @,体验劣化比广告还快。我的原则是 @ 名单单条不超过个位数,且同一客户一周内不被 @ 两次以上。
阶段四:发布节奏与兜底(产出物:调度策略)
节奏策略三条,全部是自控红线,不依赖平台约束:
- 调度池过滤窗口期账号:
can_publish的窗口判断放在调度最前面,窗口期账号只养不发。 - 单日额度宁少勿多:一个账号一天一条是安全线,多条内容拆到多个账号分摊,而不是堆单账号频次。
- 人工审核队列前置:内容先进审核队列,审核通过才进当日调度;发布结果回写状态,失败的进人工处理而不是重试。
上线前评审清单
这四项逐条过,有一项答不上来就先别上调度:
- 窗口期账号是否已从调度池排除?——新设备 1-3 天受限是官方明文,不是可选项。
- allow/disable 名单的叠加语义核对文档了吗?——privacy 枚举、标签维度的上限这类语义我不猜,发布前对照 weiti.apifox.cn 的 SNS 章节过一遍,十分钟的事。
- 失败路径是进队列还是重试?——重试=重复发布风险,必须是队列。
- @ 提醒有频控吗?——单条 @ 个数、单客户 @ 频次,两个数字要写进配置而不是写死在代码里。
结语
朋友圈自动化说到底是三件事:边界先行、函数复用、节奏自控。接口层一个函数就够,工程量都在阶段一和阶段四——这两块做扎实,这个通道才敢长期开着。
本文系统阐述微信朋友圈自动发布的工程化实现路径,涵盖账号窗口期管理、接口封装(含content/privacy/at参数)、可见范围与标签体系联动的触达矩阵设计、以及基于调度池与人工审核的发布节奏控制策略。强调边界先行、失败进队列而非重试、@频控等关键风控点,适用于Java+Windows环境下的私域自动化场景。

388

被折叠的 条评论
为什么被折叠?



