官方文档:GeWe API - GeWe API|微信 API 开发文档


一、业务痛点与技术背景

个人微信生态对异常行为极度敏感。常见「技术成功、账号死亡」路径:

  • 新号秒级群发、批量加好友

  • 异地 IP / 环境指纹突变

  • 话术高度同质、外链刷屏

  • 多开无隔离、credential 共享

  • 把 GeWe 当短信通道做骚扰

官方要求:正常实名账号、遵守运营规范与法律法规;禁止广告骚扰、诈骗等违规用途。工程侧必须把风控策略产品化,而不是口头提醒运营「慢一点」。


二、核心架构设计与数据流转

业务意图 ──► Policy Engine ──► 通过 / 降级 / 拒绝 / 人工审核
                 │
     ┌───────────┼────────────┐
     ▼           ▼            ▼
 账号画像     行为评分      内容安全
 (龄期/活跃)  (频次/图谱)   (敏感词/链接)
                 │
                 ▼
           Risk Decision Log → SIEM
                 │
                 ▼
           Outbound Gateway

决策结果枚举:ALLOW | THROTTLE | CHALLENGE(验证码/人工) | DENY | FREEZE_BOT。


三、关键代码与配置示例

3.1 账号龄期与动作配额

risk_policies:
  new_account_days: 7
  quotas:
    new:
      add_friend_per_day: 5
      msg_per_hour: 30
      group_invite_per_day: 2
    mature:
      add_friend_per_day: 20
      msg_per_hour: 120
      group_invite_per_day: 10
  min_interval_ms:
    same_peer: 3000
    global: 800
  jitter_ms: [200, 1500]
from dataclasses import dataclass
from datetime import datetime, timedelta
import random, time

@dataclass
class RiskContext:
    appid: str
    account_age_days: int
    action: str          # send_text | add_friend | invite_group
    peer_id: str
    content: str | None

class PolicyEngine:
    def __init__(self, redis, cfg):
        self.r = redis
        self.cfg = cfg

    def evaluate(self, ctx: RiskContext) -> str:
        if self.r.get(f"gewe:freeze:{ctx.appid}"):
            return "FREEZE_BOT"

        tier = "new" if ctx.account_age_days < self.cfg["new_account_days"] else "mature"
        if not self._quota_ok(ctx, tier):
            return "THROTTLE"
        if ctx.content and self._hit_sensitive(ctx.content):
            return "DENY"
        if self._velocity_anomaly(ctx.appid):
            return "CHALLENGE"

        self._sleep_jitter()
        return "ALLOW"

    def _quota_ok(self, ctx: RiskContext, tier: str) -> bool:
        key = f"gewe:quota:{ctx.appid}:{ctx.action}:{datetime.utcnow():%Y%m%d%H}"
        n = self.r.incr(key)
        if n == 1:
            self.r.expire(key, 3600)
        limit = self.cfg["quotas"][tier].get(f"{ctx.action}_per_hour") or 10**9
        return n <= limit

    def _sleep_jitter(self):
        lo, hi = self.cfg["jitter_ms"]
        time.sleep(random.randint(lo, hi) / 1000)

    def _hit_sensitive(self, text: str) -> bool:
        return any(w in text for w in self.cfg.get("sensitive_words", []))

    def _velocity_anomaly(self, appid: str) -> bool:
        # 1 分钟窗口动作突增
        k = f"gewe:vel:{appid}:{int(time.time())//60}"
        v = self.r.incr(k)
        self.r.expire(k, 120)
        return v > 40

3.2 出站拦截中间件

async function guardedSend(input: SendInput) {
  const decision = await policy.evaluate(input);
  await audit.write({ ...input, decision });

  switch (decision) {
    case "ALLOW":
      return outbound.enqueue(input);
    case "THROTTLE":
      return outbound.enqueue({ ...input, priority: 2, delaySec: 60 });
    case "CHALLENGE":
      await ticket.opsReview(input);
      return { status: "pending_review" };
    case "DENY":
    case "FREEZE_BOT":
      await alert.pager(`risk ${decision} appid=${input.appid}`);
      return { status: decision };
  }
}

3.3 设备与网络一致性检查清单

□ 登录省份 / 代理 area 与账号常用地一致
□ 禁止频繁切换代理出口
□ 扫码登录后固定执行节点,不随意漂移
□ Token 按环境隔离,禁止运营同学共用生产 Key
□ 异常掉线自动告警,禁止脚本疯狂重登

3.4 内容安全钩子

def pre_send_content_guard(text: str) -> None:
    if re.search(r"(免费领取|加微信必赚|彩票内幕)", text):
        raise RiskDeny("marketing_spam_pattern")
    if len(re.findall(r"https?://", text)) > 2:
        raise RiskDeny("too_many_links")

四、生产环境避坑与安全风控

  1. 慢就是快:新号养号期只做客服被动回复,不做加粉。

  2. 同质化话术是高危特征:模板变量化 + 同义改写,但仍需合规。

  3. 掉线重登风暴会被判定异常:指数退避 + 人工介入。

  4. 审计留痕:谁在何时通过何 Token 触发了加好友/群发,必须可查。

  5. 法律红线:诈骗、色情、骚扰等一经发现应立即冻结机器人并终止能力。

  6. 以官方为准:能力边界与使用要求见文首官方文档。


五、本篇交付清单

  • Policy Engine 决策模型

  • 龄期配额 / 抖动 / 敏感词

  • 出站守卫与冻结机制

  • 设备网络一致性清单

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐