这个插件的核心目标是规避平台风控。它通过监控发信频率,在消息密集时自动从并行发送切换到串行队列,确保两条消息之间有足够的时间间隔。
核心能力:
- 🔍 实时烈度监控 - 统计过去1分钟内的发送量
- 🚦 自适应模式切换 - 根据负载自动调整发送策略
- ⏳ 智能延迟计算 - 模拟人类自然的发送节奏
- 📬 私聊优先机制 - 确保私聊消息不被群消息阻塞
插件根据过去1分钟内的发送量自动判断当前模式:
| 模式 | 触发条件 | 日志颜色 | 行为 |
|---|---|---|---|
| NORMAL(正常) | <10条/分钟 | 🟢 绿色 | 私聊无延迟,群聊有基础延迟 |
| THROTTLED(节流) | 10-19条/分钟 | 🟡 黄色 | 所有消息强制排队,间隔0.5-1秒 |
| CRITICAL(危急) | ≥20条/分钟 或 队列>10条 | 🔴 红色 | 严格限流,间隔2-4秒 |
模式会根据实时负载自动切换,无需手动干预。
- 用滑动窗口统计过去1分钟的发送量
- 实时判断当前应处于哪种模式
- 模式切换时输出日志
- 双队列设计:私聊队列 + 群聊队列
- 私聊优先:私聊消息优先出队
- 私聊超时保护:等待超过3秒强制发送
- 模拟人类自然的发送节奏
- 添加随机抖动,避免固定间隔被检测
- 连续发送后自动"喘息"(增加额外间隔)
- 核心协调器,管理整个流程
- 通过钩子拦截
send_envelope函数 - 所有外发消息都经过这里排队
用户发送消息
↓
send_envelope 被调用
↓
FlowController 拦截
↓
加入优先级队列(私聊/群聊分开)
↓
队列工作器按顺序取出
↓
BreathingPacer 计算延迟时间
↓
等待延迟后发送
↓
IntensityMonitor 记录发送
📤 私聊 | 队列: 1 | 等待: 0.5s | 模式: normal
│ │ │ │
│ │ │ └── 当前流量模式
│ │ └── 发送前等待的时间
│ └── 当前队列中的消息数
└── 消息类型(私聊/群聊)
01-02 16:36:03 [流量控制] 📤 私聊 | 队列: 1 | 等待: 0.1s | 模式: normal
01-02 16:36:13 [流量控制] 📤 私聊 | 队列: 1 | 等待: 0.5s | 模式: normal
01-02 16:36:18 [流量控制] 📤 私聊 | 队列: 1 | 等待: 2.3s | 模式: normal
解读:
队列: 1= 只有当前这一条消息在排队等待: 0.1s/0.5s/2.3s= 根据情况动态计算的延迟(包含随机抖动)模式: normal= 发送量低于10条/分钟,正常模式
⚡ 模式切换: normal -> throttled | 1分钟发送: 12条 | 队列积压: 3条
⚠️ 模式切换: throttled -> critical | 1分钟发送: 22条 | 队列积压: 15条
✅ 模式切换: critical -> normal | 1分钟发送: 5条 | 队列积压: 0条
配置文件位置:config/plugins/smart_flow_controller/config.toml
# 插件开关
[plugin]
enabled = true # 插件总开关
config_version = "1.0.0"
# 流量控制配置
[flow_control]
enabled = true # 流量控制开关
normal_threshold = 10 # 超过此值进入节流模式(条/分钟)
throttled_threshold = 20 # 超过此值进入危急模式(条/分钟)
# 时间配置
[timing]
min_interval = 0.5 # 节流模式下最小消息间隔(秒)
breathing_interval = 3 # 连续发几条后触发喘息间隔
# 私聊优先配置
[private_priority]
enabled = true # 启用私聊优先
max_wait = 3.0 # 私聊最大等待时间(秒),超时强制发送
# 日志配置
[log]
debug_log = false # 开启后显示详细调试日志| 配置项 | 默认值 | 说明 |
|---|---|---|
plugin.enabled |
true | 插件总开关 |
flow_control.enabled |
true | 流量控制开关 |
flow_control.normal_threshold |
10 | 正常→节流的阈值(条/分钟) |
flow_control.throttled_threshold |
20 | 节流→危急的阈值(条/分钟) |
timing.min_interval |
0.5 | 节流模式最小间隔(秒) |
timing.breathing_interval |
3 | 喘息触发间隔(条数) |
private_priority.enabled |
true | 私聊优先开关 |
private_priority.max_wait |
3.0 | 私聊最大等待时间(秒) |
log.debug_log |
false | 详细调试日志开关 |
smart_flow_controller/
├── plugin.py # 插件入口(生命周期管理)
├── __init__.py # 插件元数据
├── README.md # 本说明文档
└── src/
├── __init__.py
├── models.py # 数据模型定义
├── flow_controller.py # 核心控制器
├── intensity_monitor.py # 烈度监控模块
├── breathing_pacer.py # 呼吸节拍模块
└── priority_queue.py # 优先级队列模块
插件通过替换 uni_message_sender.send_envelope 函数实现消息拦截:
- 启动时:保存原始
send_envelope函数,注入自定义钩子 - 运行时:所有消息通过钩子进入队列
- 停止时:恢复原始函数,确保系统正常
延迟时间 = 基础延迟 + 随机抖动 + 喘息间隔
- 基础延迟:根据模式和消息类型决定
- 随机抖动:在范围内随机,避免固定模式
- 喘息间隔:连续发送后增加额外休息时间
- 使用双队列设计,私聊和群聊消息分开排队
- 出队时优先检查私聊队列
- 私聊消息超时(默认3秒)会强制发送,不被群消息阻塞
A: 这是设计特性。随机抖动可以避免固定间隔被平台检测,更像人类自然的发送行为。
A: 当队列超过10条时会自动进入危急模式,大幅增加间隔。如果问题持续,可能需要检查上游消息生成速率。
A: 在配置文件中设置 flow_control.enabled = false,或直接禁用插件 plugin.enabled = false。
A: 设置 log.debug_log = true,将输出入队/出队、延迟计算等详细信息。
- 初始版本
- 实现三级流量控制(正常/节流/危急)
- 实现私聊优先机制
- 实现呼吸节拍器
- 添加 debug_log 配置项