AstrBot 旧闻提醒插件 v3.5
当群聊中有人重复发送旧的新闻、话题或梗图时,自动识别并通过引用回复提醒该用户。
在本插件配置面板选择识图模型后,识图模型将对每一张图片都进行图像转述,如果你使用付费API,这将会产生高额的费用。
- 推荐自备费用不高的图像识别模型,或者考虑使用Qwen3 VL (32B/30B A3B) Thinking
- 智能语义匹配:使用 Embedding 技术计算内容相似度,而非简单的关键词匹配
- 图片哈希匹配:使用差值哈希(dHash)算法检测相似图片(256位高精度),与文本匹配形成"或门"逻辑
- 多模态支持:
- 支持文本消息检测
- 支持图片内容识别(自动区分表情包和内容图)
- 图片通过视觉模型转为文字描述后存储
- 表情包过滤:自动识别并忽略表情包
- 指令/关键词过滤:支持短语匹配忽略(如"何意味"、"666"等)
- 插件命令过滤:自动识别其他插件的命令并跳过(v3.0新增)
- 短文本过滤:可设置最小文本长度,忽略无意义短语(默认≥3字符)
- 人数检测:需≥3个不同用户发送相似内容才触发
- 其他机制:同一用户去重、冷却时间
- 结合历史上下文和当前上下文综合判断
- 消息格式包含时间、发送者、内容三要素,提高判断精度
- 区分"旧闻重发"和"讨论延续"
- 可通过开关关闭以节省token消耗
- 默认7天数据保留:自动清理过期消息和图片缓存
- 按天分片压缩存储:优化IO和存储空间
接收群消息
│
▼
┌─────────────────────────────────────────────┐
│ 前置过滤 │
├─────────────────────────────────────────────┤
│ 1. 群组黑名单检查 │
│ 2. 内容提取(文本/图片识别) │
│ 3. 短文本过滤(< 3字符) │
│ 4. 正则表达式过滤 │
│ 5. 🆕 插件命令自动过滤 │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 相似度检测 │
├─────────────────────────────────────────────┤
│ • 文本:Embedding 余弦相似度 ≥ 0.95 │
│ • 图片:dHash 汉明距离相似度 ≥ 0.90 │
│ • 两者为"或门"关系,任一匹配即触发 │
└─────────────────────────────────────────────┘
│
▼ (找到匹配)
┌─────────────────────────────────────────────┐
│ 触发条件检查 │
├─────────────────────────────────────────────┤
│ 1. 人数检测:≥ 3个不同用户 │
│ 2. 排除自己:同一用户重发不触发 │
│ 3. 冷却时间:与历史消息间隔 ≥ 60分钟 │
└─────────────────────────────────────────────┘
│
▼ (全部通过)
┌─────────────────────────────────────────────┐
│ 🆕 LLM判断(可选) │
├─────────────────────────────────────────────┤
│ 启用时: │
│ • 获取历史上下文(前后各40条) │
│ • 获取当前上下文(最近40条) │
│ • LLM综合判断是否为"旧闻重发" │
│ │
│ 禁用时: │
│ • 直接触发提醒(匹配即提醒) │
└─────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 发送提醒 │
├─────────────────────────────────────────────┤
│ 引用回复 + 提醒图片(或纯文本) │
└─────────────────────────────────────────────┘
| 条件 | 说明 | 阈值/规则 |
|---|---|---|
| 相似度匹配 | 文本或图片任一匹配即可 | 文本≥0.95 OR 图片哈希≥0.90 |
| 人数检测 | 需要多人发送相似内容 | ≥3个不同用户 |
| 同一用户 | 用户自己重发不触发 | 自动跳过 |
| 冷却时间 | 与历史消息间隔 | ≥60分钟 |
| LLM确认 | 最终判断是否为旧闻(可选,包含最近讨论检测) | 综合上下文判断 |
- 将插件文件夹放入 AstrBot 的
plugins目录 - 安装依赖:
pip install -r requirements.txt
- 在 AstrBot 中配置模型提供商(详见配置说明)
| 配置项 | 说明 | 要求 |
|---|---|---|
embedding_provider_id |
Embedding 模型提供商 | 需要支持 embedding 的提供商 |
vision_provider_id |
视觉模型提供商,用于识别图片内容 | 需要具备视觉能力的模型 |
judge_provider_id |
判断模型提供商,用于最终决策是否提醒 | 纯文本能力即可(需启用LLM判断) |
| 配置项 | 说明 | 默认值 |
|---|---|---|
enable_llm_judge |
🆕 启用LLM判断(关闭后匹配即提醒) | true |
auto_filter_commands |
🆕 自动过滤插件命令 | true |
| 配置项 | 说明 | 默认值 |
|---|---|---|
similarity_threshold |
文本相似度阈值 (0.0-1.0) | 0.95 |
image_hash_threshold |
图片哈希相似度阈值 (0.0-1.0) | 0.90 |
min_unique_senders |
最少不同用户数,达到此人数才触发 | 3 |
cooldown_seconds |
冷却时间(秒) | 3600(60分钟) |
data_retention_days |
数据保留天数 | 7 |
min_text_length |
最小文本长度(小于此长度的纯文本将被忽略) | 3 |
| 配置项 | 说明 | 默认值 |
|---|---|---|
blocked_groups |
黑名单群组列表 | [] |
ignore_regex |
忽略内容的关键词列表(如 ["^今日运势$", "^/.*"]) |
[] |
| 配置项 | 说明 | 默认值 |
|---|---|---|
vision_prompt |
图片识别提示词(用于区分表情包/内容图) | 默认内置Prompt |
judge_prompt |
最终判断提示词(用于决定是否提醒) | 默认内置Prompt |
配置好后插件将自动运行,如需监测请查看日志。
| 指令 | 功能 | 权限 |
|---|---|---|
记忆状态 |
查看当前群的统计数据和配置 | 管理员 |
查看过滤命令 |
查看检测到的所有插件命令 | 管理员 |
擦除记忆 |
清空当前群的所有记录(仅输出日志) | 管理员 |
✅ Memory Reboot - 记忆状态
📌 群号: 123456789
📊 消息数: 1520
🧠 含embedding: 1480
🖼️ 含图片: 320 (含哈希: 315)
⚙️ 配置参数:
📏 文本相似度阈值: 0.95
🔍 图片哈希阈值: 0.9
👥 最少不同用户: 3人
⏰ 冷却时间: 3600秒
📅 数据保留: 7天
🛠️ 环境检查:
- Pillow库: ✅ 已安装 (dHash可用)
- 提醒图片: ✅ 存在
- 命令过滤: ✅ 已启用 (检测到15个命令)
- LLM判断: ✅ 已启用 (提供商: openai-gpt4)
仅过滤纯表情包,保留有信息内容的图片。
是表情包(跳过):
- 完全无文字的表情图(熊猫头、滑稽、doge等)
- 只有1-2个简短词语或句子的表情包(如"收到"、"好的"、"无语"、"笑死")
- QQ/微信系统表情或商店贴纸
不是表情包(记录):
- 任何包含较多文字的图片(两句话以上)
- 梗图/六宫格等包含对话或情节的图
- 新闻/文章/社交媒体截图
- 聊天记录截图
- 实拍照片
- 任何有实际信息内容的图片
采用按天分片压缩存储(Gzip优化IO与空间),保存在 data/memory_reboot/{群ID}/{YYYY-MM-DD}.json.gz
{
"id": "消息UUID",
"sender_id": "发送者ID",
"sender_name": "发送者名称",
"content": "消息内容或[图片内容: 描述]",
"timestamp": 1738420000.123,
"embedding": [0.1, 0.2, ...],
"has_image": true,
"cached_image": "image_cache/群ID/20260202_041900_123456.jpg",
"image_hash": "a1b2c3d4e5f6g7h8..."
}保存在 {插件目录}/image_cache/{群ID}/
- 文件名格式:
{年月日}_{时分秒}_{微秒}.jpg - 自动清理:与消息数据同步,超过保留天数自动删除
| 场景 | 结果 | 原因 |
|---|---|---|
| A发新闻 → B讨论 → 1小时后C重发 | ✅ 提醒 | 3人发送,超过冷却,条件满足 |
| A发新闻 → 30分钟后B重发 | ❌ 不提醒 | 只有2人,未达到3人阈值 |
| A发表情包 → 多人复读 | ❌ 不提醒 | 表情包被过滤,不记录 |
| A发图片 → 10分钟后B发相同图片 | ❌ 不提醒 | 冷却时间内(< 60分钟) |
| A发图片 → A自己1小时后重发 | ❌ 不提醒 | 同一用户重发 |
| A发新闻 → 群里正在讨论相关话题 → B重发 | ❌ 不提醒 | LLM判断为讨论延续(需启用LLM判断) |
| A发新闻 → B引用讨论 → C重发表示认同 | ❌ 不提醒 | LLM判断为讨论延续(需启用LLM判断) |
| A发新闻 → 2天后D像第一次看到一样分享 | ✅ 提醒 | 明显不知道之前讨论过 |
| A发"?" → 跳过不记录 | ❌ 不记录 | 少于2个字符 |
| A发"签到" → 跳过不记录 | ❌ 不记录 | 匹配过滤规则 |
| A发"/帮助" → 跳过不记录 | ❌ 不记录 | 🆕 插件命令自动过滤 |
numpy>=1.21.0aiohttp>=3.8.0Pillow>=9.0.0(用于图片哈希计算)
- 正则匹配策略优化:关键词过滤逻辑由“部分匹配”改为“完全匹配”,解决误伤正常句子的问题(如配置“何意味”将只过滤单体词,不再误伤“你这是何意味啊”)
- 黑名单状态显示:
/记忆状态命令新增群组黑名单状态显示,明确区分正常工作与被拉黑状态
- 内存缓存优化:消息数据缓存在内存中,避免每条消息都从磁盘加载
- 批量写入优化:每10条消息才写入一次磁盘,大幅减少I/O操作
- 引用回复提醒:提醒方式从@改为引用回复,更加直观清晰
- 管理员权限控制:
记忆状态、查看过滤命令命令仅管理员可用 - 静默擦除:
擦除记忆命令执行后仅输出日志,不在群内发送消息
- 插件命令自动过滤:自动检测并过滤其他AstrBot插件的命令(如
/签到、/帮助、/天气等),避免误判 - LLM判断开关:可选择关闭LLM二次判断,匹配即提醒(更激进但省token)
- 状态显示增强:
记忆状态命令显示更多信息,包括命令过滤状态和LLM判断状态
s11IM、idiotsj