灵感来自 maibot 的表情包偷取和 meme_manager 的标签注入思路。并加入了可能有用的 fc 工具,可以让 bot 自己发表情包。
表情包小偷是一款基于多模态 AI 的 AstrBot 娱乐插件——自动偷取聊天中的表情包,利用视觉模型进行情绪分类,对话时按概率发送一张情绪匹配的表情包,让 Bot 的回复更有人味。偷够了可以随时金盆洗手,偷取和自动发送可独立开关。
本插件完全开源免费,欢迎 Issue 和 PR。
| 功能 | 说明 |
|---|---|
| 自动偷图 | 监听群聊图片,按概率或冷却模式自动收集,支持待审核池容量控制 |
| 待审核池 | 自动偷取的图片先进入审核区,人工通过后入库,杜绝低质量图片污染图库 |
| 智能分类 | 利用 VLM 识别图片内容与情绪预设分类 |
| 语义检索 | 图上文字 + 使用场景 + 远程文本嵌入匹配;分类只作加分,不硬过滤。嵌入不可用时降级 BM25。不跑本地 CLIP |
| 情感共鸣 | 分析对话中回复的情绪,自动追加匹配的表情包 |
| LLM 主动选图 | 对话中 LLM 可通过工具调用搜索并发送最合适的表情包 |
| 双模式情绪分析 | 智能提取检索词(轻量模型从回复中提取关键词和情绪先验,不决定是否发送)/ 原文检索模式(直接用回复原文检索,不注入标签) |
| 角色库 | WebUI 手工归档到角色(如 neurosama),与情绪分类独立;VLM 不猜角色 |
| WebUI 双区管理 | 📋 审核区:人工审核待入库表情包 / 🗄️ 表情包库:分类浏览、排序、批量操作 |
| 排序与筛选 | 最常发送 / 最近发送 / 最新入库 / 最旧入库四种排序,全走 SQL ORDER BY |
| 群聊过滤 | 黑白名单控制哪些群启用偷取/发送 |
在 AstrBot 插件管理中搜索并安装 astrbot_plugin_stealer。
必须配置视觉模型——插件依赖 VLM 对图片进行分类。可以在 AstrBot 中配置全局图片描述模型,也可以在插件配置中指定 vision_provider_id。
/meme on # 开启偷图
/meme auto_on # 开启自动发送
偷够了?
/meme off # 关闭偷图(已收集的表情包仍可使用)
在 AstrBot 插件面板中进入插件详情页,点击「表情管理」即可打开管理页面。
- 表情包浏览:按分类筛选、搜索、排序查看已收集的表情包。
- 表情包作用域管理:
public为公共图库,local仅允许在来源群发送。 - 批量操作:支持批量移动分类、批量删除、批量设置作用域、批量修复来源作用域。
- 单张上传:上传图片后可使用 AI 自动识别分类和场景标签。
- 批量导入:支持批量上传表情包。分类选择和自动分析互斥:
- 选择分类:图片保存到指定分类,不调用 VLM
- 自动分析:不选择分类,启用 VLM 自动识别每张图片的分类(会高并发调用 API)
- 存储维护:支持扫描并清理失效索引、孤儿文件、缩略图缓存和临时文件。
- 分类管理:新增、编辑、删除表情包分类。
⚠️ 高并发警告:启用自动分析时,会同时并发处理多张图片,可能造成 API 限流。请根据 API 服务限流情况分批次分析。
开启自动偷图 + 自动发送
- 启用偷图:
/meme on - 开启自动发送:
/meme auto_on - Bot 会自动偷取群聊中的表情包并分类
- Bot 回复时会根据情绪自动追加匹配的表情包
LLM 模式:Bot 回复后由后置轻量模型分析情绪,不影响回复内容 被动检索模式:不注入标签,直接用回复原文检索表情包
LLM 主动选图:对话中 Bot 可通过工具调用搜索最合适的表情包
**手动管理表情包 **
- 手动放入表情包到
plugin_data/astrbot_plugin_stealer/categories/下对应的分类目录 - 或使用 WebUI 批量上传并指定分类
- Bot 回复时仍会自动发送匹配的表情包(仅使用已有分类,不调用 VLM 分析)
精准收录 + WebUI 管理
- 使用指令精准入库:
/meme 偷进入强制收录模式,期间发送的图片直接入库 - 或 WebUI 批量导入 + 自动分析:勾选"自动识别"由 VLM 分析每张图并分类
- 通过 WebUI 查看、编辑、删除、设置作用域
所有配置项均可在 AstrBot 管理面板中修改。
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 开启表情包偷取功能 | false |
总开关 |
| 偷图模式 | probability |
probability 概率模式 / cooldown 冷却模式 |
| 偷图概率 | 0.3 |
概率模式下每次收到图片尝试偷取的概率 |
| 内容审核 | false |
开启后会过滤不当图片,可能增加处理时间 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 自动随聊发送表情包 | false |
自动随聊发送表情包 |
| 新消息取消待发送表情 | true |
同一会话有新消息到达时,取消上一轮仍在延迟等待中的自动表情 |
| 表情包发送概率 | 0.2 |
自动发送表情包的概率(0.0 ~ 1.0) |
| 真表情包样式(GIF发送) | false |
以 GIF 格式发送(更像真表情包,但内存占用略高) |
| 表情包发送延迟/秒 | 5.0 |
发送延迟(秒),避免与分段插件冲突,设为 0 立即发送 |
| 智能表情包选择 | true |
智能综合评分选择表情包;关闭则完全随机选取 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 情绪识别模式 | true |
true = LLM 模式(推荐,不污染聊天) / false = 被动标签模式 |
| 情绪分析专用模型 | "" |
LLM 模式使用的轻量模型,留空用当前会话默认模型 |
| 情绪分析提示词 | "" |
自定义轻量模型情绪分析提示词,留空使用内置模板 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 视觉模型 | "" |
用于图片分类,留空自动使用全局图片描述模型 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 发表情白名单 | [] |
发表情白名单。使用 group:群号 或 user:QQ号 |
| 发表情黑名单 | [] |
发表情黑名单。可与白名单同时生效,冲突按优先级判定 |
| 发表情名单优先级 | whitelist_first |
白黑名单可同时设置;whitelist_first=白名单优先,blacklist_first=黑名单优先 |
| 偷表情白名单 | [] |
偷表情白名单。使用 group:群号 或 user:QQ号 |
| 偷表情黑名单 | [] |
偷表情黑名单。可与白名单同时生效,冲突按优先级判定 |
| 偷表情名单优先级 | whitelist_first |
白黑名单可同时设置;whitelist_first=白名单优先,blacklist_first=黑名单优先 |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 待审核池容量上限 | 200 |
自动偷取的图片先进入待审核池,达到上限后暂停偷取,审核通过入库后自动恢复。可实时调整 |
| 启用嵌入向量检索 | true |
用 FaissVecDB 做语义相似度匹配;关闭或不可用时降级为 BM25 关键词检索 |
| 嵌入模型 ID | "" |
留空自动使用 AstrBot 首个 Embedding Provider。可在 AstrBot 后台「LLM 配置」中查看已有的嵌入模型 ID(如 openai_embedding) |
| 配置项 | 默认值 | 说明 |
|---|---|---|
| 最大表情包数量 | 100 |
表情包存储上限,超出自动清理最旧的数据 |
| VLM 分类提示词 | "" |
自定义 VLM 进行情绪分类的提示词,留空使用内置 prompts.json |
| VLM 分类提示词(带审核) | "" |
启用审核时的分类提示词,留空使用内置 prompts.json |
管理页面通过 AstrBot Dashboard 插件页面系统提供,在插件详情中点击「表情管理」即可访问,无需额外配置端口或密码。
开发中(随 2.9.0 发布):VLM 会抄录图上文字(
overlay_text);无法判断时归入最接近的情绪类,不再使用other。自动发送改为检索句 + 情绪先验,分类不再当硬门。VLM 分类提示词和 LLM 小模型情绪分析提示词都可在配置页自定义,留空使用内置模板。2C2G 环境不要上本地 CLIP。角色在 WebUI 手工归档,与情绪分类独立。v2.8.2 起每张表情包记录图片元数据(尺寸/格式/字节数/来源 URL/原始文件名/入库方式/审核时间),WebUI 预览面板可直接查看;VLM 打标统一为 tags 0
3 个、scenes 12 个(自动去重截断),并在切换视觉模型后自动失效旧分类缓存。文字距离融合权重可在「智能选择」配置分组选择预设(均衡 / 关键词优先 / 语义优先 / 严格匹配),无需手动调 5 个小权重。v2.8.4 WebUI 支持我的世界 / 辐射 4 背包主题,格子随窗口缩放;修复新图点开预览崩溃(PR #100)。
v2.8.5 辐射 4 主题改为 Pip-Boy 腕机 + RobCo 终端 + 避难所小子;WebUI 主题选择会记住为默认;详情弹窗才加载原图,修复大 GIF 把管理面板卡死(issue #101)。
| LLM 模式(默认推荐) | 被动检索模式 | |
|---|---|---|
| 原理 | Bot 回复后,轻量模型从回复中提取检索词和情绪先验;是否发送仍由概率/冷却等门控决定 | 不注入任何标签,直接用回复原文检索 |
| 对回复的影响 | ✅ 不修改 LLM 原生回复内容 | ✅ 不修改 LLM 原生回复内容 |
| 适用场景 | 希望增强表情匹配、愿意多一次轻量模型调用 | Token 紧、不想多一次模型调用 |
角色归档在 WebUI 里手工完成,和情绪分类独立:VLM 只打语义,角色由你指定(例如 neurosama)。
所有指令以 /meme 为前缀。
| 指令 | 说明 |
|---|---|
status |
查看运行状态和表情包统计 |
list [分类] [每页数量] [页码] |
列出已收集的表情包(默认每页 10,页码从 1 开始) |
emotion_stats |
查看情绪分析统计和当前模式 |
| 指令 | 说明 |
|---|---|
on / off |
开启 / 关闭表情包收集 |
auto_on / auto_off |
开启 / 关闭自动发送 |
clean [force] |
清理未分类的原始暂存图文件 |
偷 |
进入 30 秒强制收录模式,期间发送的图片直接入库 |
group show |
查看当前偷表情/发表情名单配置 |
group <send|steal> priority <wl|bl> |
设置白黑名单冲突时的优先级 |
group <send|steal> <wl|bl> <add|del|clear> [group:群号|user:QQ号] |
管理目标黑白名单策略,支持群和用户同时生效 |
delete <序号|文件名> |
删除指定表情包 |
blacklist <序号|文件名> |
删除指定表情包并加入黑名单,禁止再次收录 |
scope <序号|文件名> <public|local> |
设置表情包作用域,local 仅来源群可发送(用于作用域控制,可一定程度保护隐私) |
capacity |
立即执行容量控制判断 |
rebuild_index |
重建索引(版本迁移或索引异常时使用) |
natural_analysis <on|off> |
一键切换两套情绪识别系统模式 |
clear_emotion_cache |
清空情绪分析结果缓存 |
tag_stats [N] |
标签/场景统计:高频标签、低频噪声标签、零标签条目(打标质量体检,N 为 Top 数量默认 15) |
| 工具 | 说明 |
|---|---|
search_meme |
LLM 搜索匹配的表情包候选列表,返回分类、场景、作用域、使用次数等选择参考 |
send_meme |
LLM 从候选列表中选择并发送表情包,失败时返回明确 reason 便于重新选择 |
steal_meme |
LLM 在用户明确要求偷图或当前消息有合适图片时收录图片入库;image_ref 可留空自动取当前消息第一张图,VLM 自动完成分类、标签、描述和场景分析 |
- WebUI 删除分类会同时删除该分类下所有关联实体图片,操作务慎重。
- 开启
send_meme_as_gif时,超大图片强制转 GIF 会产生内存突刺!低内存环境建议关闭。 - 插件底层 必须配置视觉模型(VLM),未配置视觉模型时判断功能均无法工作。
自最近版本(v2.4.5+)起:
核心识别提示词改用了严谨的 JSON 格式输出,结构更稳定,解析更准确。
自 v2.9.0 起 VLM 分类提示词和 LLM 小模型情绪分析提示词都恢复为可配置:配置项非空时使用自定义提示词,留空则使用内置模板。
旧格式(管道符分隔)仍兼容,但 JSON 格式更可靠。
本项目基于 MIT 许可证开源。
好用的话给个 ⭐ Star 吧,谢谢大伙!
有问题欢迎提 Issue 或群里找我,一般很快会看到。