- 新增 GitHub Issue 模板(Bug 报告、功能请求)和 Pull Request 模板 - 新增 Code of Conduct(贡献者行为准则)和 Security Policy(安全政策) - 新增 CI 工作流(GitHub Actions),包含 ruff 代码检查和导入验证 - 新增开发依赖文件 requirements-dev.txt 📦 build(ci): 配置 GitHub Actions 持续集成 - 在 push 到 main 分支和 pull request 时自动触发 CI - 添加 lint 任务执行 ruff 代码风格检查 - 添加 import-check 任务验证核心服务模块导入 ♻️ refactor(structure): 重构项目目录结构 - 将根目录的 6 个服务模块迁移至 services/ 包 - 更新所有相关文件的导入语句(main.py、ui/、services/) - 根目录仅保留 main.py 作为唯一 Python 入口文件 🔧 chore(config): 调整配置和资源文件路径 - 将 config.json 移至 config/ 目录,更新相关引用 - 将个人头像图片移至 assets/faces/ 目录,更新 .gitignore - 更新 Dockerfile 和 docker-compose.yml 中的配置路径 📝 docs(readme): 完善 README 文档 - 添加项目状态徽章(Python 版本、License、CI) - 更新项目结构图反映实际目录布局 - 修正使用指南中的 Tab 名称和操作路径 - 替换 your-username 占位符为格式提示 🗑️ chore(cleanup): 清理冗余文件 - 删除旧版备份文件、测试脚本、临时记录和运行日志 - 删除散落的个人图片文件(已归档至 assets/faces/)
520 lines
24 KiB
Python
520 lines
24 KiB
Python
"""
|
||
services/persona.py
|
||
人设管理:常量、关键词池、主题池、人设解析
|
||
"""
|
||
import random
|
||
import logging
|
||
from .config_manager import ConfigManager
|
||
|
||
logger = logging.getLogger("autobot")
|
||
cfg = ConfigManager()
|
||
|
||
# ================= 人设池 =================
|
||
DEFAULT_PERSONAS = [
|
||
"赛博AI虚拟博主,住在2077年的数码女孩,用AI生成高颜值写真和全球场景打卡,与粉丝超高频互动",
|
||
"性感福利主播,身材火辣衣着大胆,专注分享穿衣显身材和私房写真风穿搭",
|
||
"身材管理健身美女,热爱分享好身材秘诀和穿搭显身材技巧",
|
||
"温柔知性的时尚博主,喜欢分享日常穿搭和生活美学",
|
||
"元气满满的大学生,热爱探店和平价好物分享",
|
||
"30岁都市白领丽人,专注通勤穿搭和职场干货",
|
||
"精致妈妈,分享育儿经验和家居收纳技巧",
|
||
"文艺青年摄影师,喜欢记录旅行和城市角落",
|
||
"健身达人营养师,专注减脂餐和运动分享",
|
||
"资深美妆博主,擅长化妆教程和护肤测评",
|
||
"独居女孩,分享租房改造和独居生活仪式感",
|
||
"甜品烘焙爱好者,热衷分享自制甜点和下午茶",
|
||
"数码科技女生,专注好用App和电子产品测评",
|
||
"小镇姑娘在大城市打拼,分享省钱攻略和成长日记",
|
||
"中医养生爱好者,分享节气养生和食疗方子",
|
||
"二次元coser,喜欢分享cos日常和动漫周边",
|
||
"北漂程序媛,分享高效工作法和解压生活",
|
||
"复古穿搭博主,热爱vintage风和中古饰品",
|
||
"考研上岸学姐,分享学习方法和备考经验",
|
||
"新手养猫人,记录和毛孩子的日常生活",
|
||
"咖啡重度爱好者,探遍城市独立咖啡馆",
|
||
"极简主义生活家,倡导断舍离和高质量生活",
|
||
"汉服爱好者,分享传统文化和国风穿搭",
|
||
"插画师小姐姐,分享手绘过程和创作灵感",
|
||
"海归女孩,分享中西文化差异和海外生活见闻",
|
||
"瑜伽老师,分享身心灵修行和自律生活",
|
||
"美甲设计师,分享流行甲型和美甲教程",
|
||
"家居软装设计师,分享小户型改造和氛围感布置",
|
||
]
|
||
|
||
RANDOM_PERSONA_LABEL = "🎲 随机人设(每次自动切换)"
|
||
|
||
# ================= 人设 → 分类关键词/主题池映射 =================
|
||
# 每个人设对应一组相符的评论关键词和主题,切换人设时自动同步
|
||
|
||
PERSONA_POOL_MAP = {
|
||
# ---- 性感福利类 ----
|
||
"性感福利主播": {
|
||
"topics": [
|
||
"辣妹穿搭", "内衣测评", "比基尼穿搭", "私房写真风穿搭", "吊带裙穿搭",
|
||
"低胸穿搭", "紧身连衣裙", "蕾丝穿搭", "泳衣测评", "居家睡衣穿搭",
|
||
"露背装穿搭", "热裤穿搭", "性感御姐穿搭", "渔网袜穿搭", "包臀裙穿搭",
|
||
"锁骨链饰品", "身材展示", "好身材日常", "氛围感私房照", "海边度假穿搭",
|
||
],
|
||
"keywords": [
|
||
"辣妹", "性感穿搭", "内衣", "比基尼", "吊带", "低胸",
|
||
"紧身", "蕾丝", "泳衣", "睡衣", "露背", "热裤",
|
||
"御姐", "好身材", "包臀裙", "身材展示", "私房", "氛围感",
|
||
],
|
||
},
|
||
# ---- 身材管理类 ----
|
||
"身材管理健身美女": {
|
||
"topics": [
|
||
"好身材穿搭", "显身材穿搭", "马甲线养成", "翘臀训练", "直角肩养成",
|
||
"天鹅颈锻炼", "小蛮腰秘诀", "腿型矫正", "体态管理", "维密身材",
|
||
"居家塑形", "健身穿搭", "运动内衣测评", "蜜桃臀训练", "锁骨养成",
|
||
"紧身穿搭", "比基尼身材", "纤腰丰臀", "身材对比照", "自律打卡",
|
||
],
|
||
"keywords": [
|
||
"身材", "好身材", "马甲线", "翘臀", "直角肩", "天鹅颈",
|
||
"小蛮腰", "健身女孩", "塑形", "体态", "蜜桃臀", "腰臀比",
|
||
"紧身", "显身材", "维密", "锁骨", "A4腰", "漫画腿",
|
||
],
|
||
},
|
||
# ---- 时尚穿搭类 ----
|
||
"温柔知性的时尚博主": {
|
||
"topics": [
|
||
"春季穿搭", "通勤穿搭", "约会穿搭", "显瘦穿搭", "法式穿搭",
|
||
"极简穿搭", "氛围感穿搭", "一衣多穿", "秋冬叠穿", "夏日清凉穿搭",
|
||
"生活美学", "衣橱整理", "配色技巧", "基础款穿搭", "轻熟风穿搭",
|
||
],
|
||
"keywords": [
|
||
"穿搭", "ootd", "早春穿搭", "通勤穿搭", "显瘦", "法式穿搭",
|
||
"极简风", "氛围感", "轻熟风", "高级感穿搭", "配色",
|
||
],
|
||
},
|
||
"元气满满的大学生": {
|
||
"topics": [
|
||
"学生党穿搭", "宿舍美食", "平价好物", "校园生活", "学生党护肤",
|
||
"期末复习", "社团活动", "寝室改造", "奶茶测评", "拍照打卡地",
|
||
"一人食食谱", "考研经验", "实习经验", "省钱攻略",
|
||
],
|
||
"keywords": [
|
||
"学生党", "平价好物", "宿舍", "校园", "奶茶", "探店",
|
||
"拍照", "省钱", "大学生活", "期末", "开学", "室友",
|
||
],
|
||
},
|
||
"30岁都市白领丽人": {
|
||
"topics": [
|
||
"通勤穿搭", "职场干货", "面试技巧", "简历优化", "时间管理",
|
||
"理财入门", "轻熟风穿搭", "职场妆容", "咖啡探店", "高效工作法",
|
||
"副业分享", "自律生活", "下班后充电", "职场人际关系",
|
||
],
|
||
"keywords": [
|
||
"通勤穿搭", "职场", "面试", "理财", "自律", "高效",
|
||
"咖啡", "轻熟", "白领", "上班族", "时间管理", "副业",
|
||
],
|
||
},
|
||
"精致妈妈": {
|
||
"topics": [
|
||
"育儿经验", "家居收纳", "辅食制作", "亲子游", "母婴好物",
|
||
"宝宝穿搭", "早教启蒙", "产后恢复", "家常菜做法", "小户型收纳",
|
||
"家庭教育", "孕期护理", "宝宝辅食", "妈妈穿搭",
|
||
],
|
||
"keywords": [
|
||
"育儿", "收纳", "辅食", "母婴", "亲子", "早教",
|
||
"宝宝", "家居", "待产", "产后", "妈妈", "家常菜",
|
||
],
|
||
},
|
||
"文艺青年摄影师": {
|
||
"topics": [
|
||
"旅行攻略", "小众旅行地", "拍照打卡地", "城市citywalk", "古镇旅行",
|
||
"手机摄影技巧", "胶片摄影", "人像摄影", "风光摄影", "街拍",
|
||
"咖啡探店", "文艺书店", "展览打卡", "独立书店",
|
||
],
|
||
"keywords": [
|
||
"旅行", "摄影", "打卡", "citywalk", "胶片", "拍照",
|
||
"小众", "展览", "文艺", "街拍", "风光", "人像",
|
||
],
|
||
},
|
||
"健身达人营养师": {
|
||
"topics": [
|
||
"减脂餐分享", "居家健身", "帕梅拉跟练", "跑步入门", "体态矫正",
|
||
"增肌餐", "蛋白质补充", "运动穿搭", "健身房攻略", "马甲线养成",
|
||
"热量计算", "健康早餐", "运动恢复", "减脂食谱",
|
||
],
|
||
"keywords": [
|
||
"减脂", "健身", "减脂餐", "蛋白质", "体态", "马甲线",
|
||
"帕梅拉", "跑步", "热量", "增肌", "运动", "健康餐",
|
||
],
|
||
},
|
||
"资深美妆博主": {
|
||
"topics": [
|
||
"妆容教程", "眼妆教程", "唇妆合集", "底妆测评", "护肤心得",
|
||
"防晒测评", "学生党平价护肤", "敏感肌护肤", "美白攻略",
|
||
"成分党护肤", "换季护肤", "早C晚A护肤", "抗老护肤",
|
||
],
|
||
"keywords": [
|
||
"护肤", "化妆教程", "眼影", "口红", "底妆", "防晒",
|
||
"美白", "敏感肌", "成分", "平价", "测评", "粉底",
|
||
],
|
||
},
|
||
"独居女孩": {
|
||
"topics": [
|
||
"独居生活", "租房改造", "氛围感房间", "一人食食谱", "好物分享",
|
||
"香薰推荐", "居家好物", "断舍离", "仪式感生活", "独居安全",
|
||
"解压方式", "emo急救指南", "桌面布置", "小户型装修",
|
||
],
|
||
"keywords": [
|
||
"独居", "租房改造", "好物", "氛围感", "一人食", "仪式感",
|
||
"解压", "居家", "香薰", "ins风", "房间", "断舍离",
|
||
],
|
||
},
|
||
"甜品烘焙爱好者": {
|
||
"topics": [
|
||
"烘焙教程", "0失败甜品", "下午茶推荐", "蛋糕教程", "面包制作",
|
||
"饼干烘焙", "奶油裱花", "巧克力甜品", "网红甜品", "便当制作",
|
||
"早餐食谱", "咖啡配甜品", "节日甜品", "低卡甜品",
|
||
],
|
||
"keywords": [
|
||
"烘焙", "甜品", "蛋糕", "面包", "下午茶", "曲奇",
|
||
"裱花", "抹茶", "巧克力", "奶油", "食谱", "烤箱",
|
||
],
|
||
},
|
||
"数码科技女生": {
|
||
"topics": [
|
||
"iPad生产力", "手机摄影技巧", "好用App推荐", "电子产品测评",
|
||
"桌面布置", "数码好物", "耳机测评", "平板学习", "生产力工具",
|
||
"手机壳推荐", "充电设备", "智能家居",
|
||
],
|
||
"keywords": [
|
||
"iPad", "App推荐", "数码", "测评", "手机", "耳机",
|
||
"桌面", "科技", "电子产品", "平板", "生产力", "充电",
|
||
],
|
||
},
|
||
"小镇姑娘在大城市打拼": {
|
||
"topics": [
|
||
"省钱攻略", "成长日记", "平价好物", "租房改造", "副业分享",
|
||
"理财入门", "独居生活", "面试技巧", "通勤穿搭", "自律生活",
|
||
"城市生存指南", "女性成长", "攒钱计划",
|
||
],
|
||
"keywords": [
|
||
"省钱", "平价", "租房", "副业", "理财", "成长",
|
||
"自律", "打工", "攒钱", "面试", "独居", "北漂",
|
||
],
|
||
},
|
||
"中医养生爱好者": {
|
||
"topics": [
|
||
"节气养生", "食疗方子", "泡脚养生", "体质调理", "艾灸",
|
||
"中药茶饮", "作息调整", "经络按摩", "养胃食谱", "祛湿方法",
|
||
"睡眠改善", "女性调理", "养生汤", "二十四节气",
|
||
],
|
||
"keywords": [
|
||
"养生", "食疗", "泡脚", "中医", "艾灸", "祛湿",
|
||
"节气", "体质", "养胃", "经络", "调理", "药膳",
|
||
],
|
||
},
|
||
"二次元coser": {
|
||
"topics": [
|
||
"cos日常", "动漫周边", "漫展攻略", "cos化妆教程", "假发造型",
|
||
"lolita穿搭", "二次元好物", "手办收藏", "动漫推荐", "cos道具制作",
|
||
"jk穿搭", "谷子收藏", "二次元摄影",
|
||
],
|
||
"keywords": [
|
||
"cos", "动漫", "二次元", "漫展", "lolita", "手办",
|
||
"jk", "假发", "谷子", "周边", "番剧", "coser",
|
||
],
|
||
},
|
||
"北漂程序媛": {
|
||
"topics": [
|
||
"高效工作法", "程序员日常", "好用App推荐", "副业分享", "自律生活",
|
||
"时间管理", "iPad生产力", "解压方式", "通勤穿搭", "理财入门",
|
||
"独居生活", "技术学习", "面试经验", "桌面布置",
|
||
],
|
||
"keywords": [
|
||
"程序员", "高效", "App推荐", "自律", "副业", "iPad",
|
||
"技术", "工作", "北漂", "面试", "代码", "桌面",
|
||
],
|
||
},
|
||
"复古穿搭博主": {
|
||
"topics": [
|
||
"vintage风穿搭", "中古饰品", "复古妆容", "二手vintage", "古着穿搭",
|
||
"法式穿搭", "复古包包", "跳蚤市场", "旧物改造", "港风穿搭",
|
||
"文艺穿搭", "配饰搭配", "vintage探店",
|
||
],
|
||
"keywords": [
|
||
"vintage", "复古", "中古", "古着", "港风", "法式",
|
||
"饰品", "二手", "旧物", "跳蚤市场", "复古穿搭", "文艺",
|
||
],
|
||
},
|
||
"考研上岸学姐": {
|
||
"topics": [
|
||
"考研经验", "英语学习方法", "书单推荐", "时间管理", "自律生活",
|
||
"考研择校", "政治复习", "数学刷题", "考研英语", "复试经验",
|
||
"专业课复习", "考研心态", "背诵技巧", "刷题方法",
|
||
],
|
||
"keywords": [
|
||
"考研", "英语学习", "书单", "自律", "学习方法", "上岸",
|
||
"刷题", "备考", "复习", "笔记", "时间管理", "择校",
|
||
],
|
||
},
|
||
"新手养猫人": {
|
||
"topics": [
|
||
"养猫日常", "猫粮测评", "猫咪用品", "新手养宠指南", "猫咪健康",
|
||
"猫咪行为", "驱虫攻略", "猫砂测评", "猫玩具推荐", "猫咪拍照",
|
||
"多猫家庭", "领养代替购买", "猫咪绝育",
|
||
],
|
||
"keywords": [
|
||
"养猫", "猫粮", "猫咪", "宠物", "猫砂", "驱虫",
|
||
"铲屎官", "喵喵", "猫玩具", "猫零食", "新手养猫", "猫咪日常",
|
||
],
|
||
},
|
||
"咖啡重度爱好者": {
|
||
"topics": [
|
||
"咖啡探店", "手冲咖啡", "咖啡豆推荐", "咖啡器具", "拿铁艺术",
|
||
"家庭咖啡", "咖啡配甜品", "独立咖啡馆", "冷萃咖啡", "咖啡知识",
|
||
"意式咖啡", "探店打卡", "咖啡拉花",
|
||
],
|
||
"keywords": [
|
||
"咖啡", "手冲", "拿铁", "探店", "咖啡豆", "美式",
|
||
"咖啡馆", "意式", "冷萃", "拉花", "咖啡器具", "独立咖啡馆",
|
||
],
|
||
},
|
||
"极简主义生活家": {
|
||
"topics": [
|
||
"断舍离", "极简生活", "收纳技巧", "高质量生活", "减法生活",
|
||
"胶囊衣橱", "极简护肤", "环保生活", "数字断舍离", "极简穿搭",
|
||
"极简房间", "消费降级", "物欲管理",
|
||
],
|
||
"keywords": [
|
||
"断舍离", "极简", "收纳", "高质量", "减法", "胶囊衣橱",
|
||
"简约", "环保", "整理", "少即是多", "极简风", "质感",
|
||
],
|
||
},
|
||
"汉服爱好者": {
|
||
"topics": [
|
||
"汉服穿搭", "国风穿搭", "传统文化", "汉服发型", "汉服配饰",
|
||
"汉服拍照", "古风妆容", "汉服日常", "汉服科普", "形制科普",
|
||
"古风摄影", "新中式穿搭", "汉服探店",
|
||
],
|
||
"keywords": [
|
||
"汉服", "国风", "传统文化", "古风", "新中式", "形制",
|
||
"发簪", "明制", "宋制", "唐制", "汉服日常", "古风摄影",
|
||
],
|
||
},
|
||
"插画师小姐姐": {
|
||
"topics": [
|
||
"手绘教程", "创作灵感", "iPad绘画", "插画分享", "水彩教程",
|
||
"Procreate技巧", "配色方案", "角色设计", "头像绘制", "手账素材",
|
||
"接稿经验", "画师日常", "绘画工具推荐",
|
||
],
|
||
"keywords": [
|
||
"插画", "手绘", "Procreate", "画画", "iPad绘画", "水彩",
|
||
"配色", "创作", "画师", "手账", "教程", "素材",
|
||
],
|
||
},
|
||
"海归女孩": {
|
||
"topics": [
|
||
"中西文化差异", "海外生活", "留学经验", "英语学习方法", "海归求职",
|
||
"旅行攻略", "异国美食", "海外好物", "文化冲击", "语言学习",
|
||
"签证攻略", "海归适应", "国外探店",
|
||
],
|
||
"keywords": [
|
||
"留学", "海归", "英语", "海外", "文化差异", "旅行",
|
||
"异国", "签证", "语言", "出国", "求职", "国外",
|
||
],
|
||
},
|
||
"瑜伽老师": {
|
||
"topics": [
|
||
"瑜伽入门", "冥想练习", "体态矫正", "呼吸法", "居家瑜伽",
|
||
"拉伸教程", "肩颈放松", "瑜伽体式", "自律生活", "身心灵",
|
||
"瑜伽穿搭", "晨练瑜伽", "睡前瑜伽",
|
||
],
|
||
"keywords": [
|
||
"瑜伽", "冥想", "体态", "拉伸", "放松", "呼吸",
|
||
"柔韧", "健康", "自律", "晨练", "入门", "体式",
|
||
],
|
||
},
|
||
"美甲设计师": {
|
||
"topics": [
|
||
"美甲教程", "流行甲型", "美甲合集", "简约美甲", "法式美甲",
|
||
"手绘美甲", "季节美甲", "显白美甲", "美甲配色", "短甲美甲",
|
||
"新娘美甲", "美甲工具推荐", "日式美甲",
|
||
],
|
||
"keywords": [
|
||
"美甲", "甲型", "法式美甲", "手绘", "显白", "短甲",
|
||
"指甲", "美甲教程", "配色", "日式美甲", "腮红甲", "猫眼甲",
|
||
],
|
||
},
|
||
"家居软装设计师": {
|
||
"topics": [
|
||
"小户型改造", "氛围感布置", "软装搭配", "家居好物", "收纳技巧",
|
||
"客厅布置", "卧室改造", "灯光设计", "绿植布置", "装修避坑",
|
||
"北欧风格", "ins风家居", "墙面装饰",
|
||
],
|
||
"keywords": [
|
||
"家居", "软装", "改造", "收纳", "氛围感", "小户型",
|
||
"装修", "灯光", "绿植", "北欧", "ins风", "布置",
|
||
],
|
||
},
|
||
# ---- 赛博/AI 虚拟博主类 ----
|
||
"赛博AI虚拟博主": {
|
||
"topics": [
|
||
"AI女孩日常", "虚拟人物写真", "AI生成美女", "赛博朴克穿搭", "未来风穿搭",
|
||
"全球场景打卡", "巴黎打卡写真", "东京街头拍照", "外太空写真", "古风仙侠写真",
|
||
"AI换装挑战", "粉丝许愿穿搭", "二次元风格写真", "女仆装写真", "护士制服写真",
|
||
"校园制服写真", "婚纱写真", "水下写真", "AI绘画教程", "虚拟人物背后故事",
|
||
],
|
||
"keywords": [
|
||
"AI女孩", "AI美女", "虚拟人物", "赛博朴克", "AI绘画", "AI写真",
|
||
"数码女孩", "2077", "未来风", "场景切换", "换装挑战", "粉丝许愿",
|
||
"高颜值", "特写", "全球打卡", "制服写真", "AI创作", "互动",
|
||
],
|
||
},
|
||
}
|
||
|
||
# 为"随机人设"使用的全量池(兼容旧逻辑)
|
||
DEFAULT_TOPICS = [
|
||
# 穿搭类
|
||
"春季穿搭", "通勤穿搭", "约会穿搭", "显瘦穿搭", "小个子穿搭",
|
||
"学生党穿搭", "韩系穿搭", "日系穿搭", "法式穿搭", "极简穿搭",
|
||
"国风穿搭", "运动穿搭", "闺蜜穿搭", "梨形身材穿搭", "微胖穿搭",
|
||
"氛围感穿搭", "一衣多穿", "秋冬叠穿", "夏日清凉穿搭",
|
||
# 美妆护肤类
|
||
"护肤心得", "妆容教程", "学生党平价护肤", "敏感肌护肤",
|
||
"抗老护肤", "美白攻略", "眼妆教程", "唇妆合集", "底妆测评",
|
||
"防晒测评", "早C晚A护肤", "成分党护肤", "换季护肤",
|
||
# 美食类
|
||
"减脂餐分享", "一人食食谱", "宿舍美食", "烘焙教程", "家常菜做法",
|
||
"探店打卡", "咖啡探店", "早餐食谱", "下午茶推荐", "火锅推荐",
|
||
"奶茶测评", "便当制作", "0失败甜品",
|
||
# 生活家居类
|
||
"好物分享", "平价好物", "居家好物", "收纳技巧", "租房改造",
|
||
"小户型装修", "氛围感房间", "香薰推荐", "桌面布置", "断舍离",
|
||
# 旅行出行类
|
||
"旅行攻略", "周末去哪玩", "小众旅行地", "拍照打卡地", "露营攻略",
|
||
"自驾游攻略", "古镇旅行", "海岛度假", "城市citywalk",
|
||
# 学习成长类
|
||
"书单推荐", "自律生活", "时间管理", "考研经验", "英语学习方法",
|
||
"理财入门", "副业分享", "简历优化", "面试技巧",
|
||
# 数码科技类
|
||
"iPad生产力", "手机摄影技巧", "好用App推荐", "电子产品测评",
|
||
# 健身运动类
|
||
"居家健身", "帕梅拉跟练", "跑步入门", "瑜伽入门", "体态矫正",
|
||
# 宠物类
|
||
"养猫日常", "养狗经验", "宠物好物", "新手养宠指南",
|
||
# 情感心理类
|
||
"独居生活", "emo急救指南", "社恐自救", "女性成长", "情绪管理",
|
||
]
|
||
|
||
DEFAULT_STYLES = [
|
||
"好物种草", "干货教程", "情绪共鸣", "生活Vlog", "测评避雷",
|
||
"知识科普", "经验分享", "清单合集", "对比测评", "沉浸式体验",
|
||
]
|
||
|
||
# 全量评论关键词池(兼容旧逻辑 / 随机人设)
|
||
DEFAULT_COMMENT_KEYWORDS = [
|
||
# 穿搭时尚
|
||
"穿搭", "ootd", "早春穿搭", "通勤穿搭", "显瘦", "小个子穿搭",
|
||
# 美妆护肤
|
||
"护肤", "化妆教程", "平价护肤", "防晒", "美白", "眼影",
|
||
# 美食
|
||
"美食", "减脂餐", "探店", "咖啡", "烘焙", "食谱",
|
||
# 生活好物
|
||
"好物推荐", "平价好物", "居家好物", "收纳", "租房改造",
|
||
# 旅行
|
||
"旅行", "攻略", "打卡", "周末去哪玩", "露营",
|
||
# 学习成长
|
||
"自律", "书单", "考研", "英语学习", "副业",
|
||
# 生活日常
|
||
"生活日常", "独居", "vlog", "仪式感", "解压",
|
||
# 健身
|
||
"减脂", "健身", "瑜伽", "体态",
|
||
# 宠物
|
||
"养猫", "养狗", "宠物",
|
||
]
|
||
|
||
|
||
def _match_persona_pools(persona_text: str) -> dict | None:
|
||
"""根据人设文本模糊匹配对应的关键词池和主题池
|
||
返回 {"topics": [...], "keywords": [...]} 或 None(未匹配)
|
||
"""
|
||
if not persona_text or persona_text == RANDOM_PERSONA_LABEL:
|
||
return None
|
||
# 精确匹配
|
||
for key, pools in PERSONA_POOL_MAP.items():
|
||
if key in persona_text or persona_text in key:
|
||
return pools
|
||
# 关键词模糊匹配
|
||
_CATEGORY_HINTS = {
|
||
"时尚|穿搭|搭配|衣服": "温柔知性的时尚博主",
|
||
"大学|学生|校园": "元气满满的大学生",
|
||
"白领|职场|通勤|上班": "30岁都市白领丽人",
|
||
"妈妈|育儿|宝宝|母婴": "精致妈妈",
|
||
"摄影|旅行|旅游|文艺": "文艺青年摄影师",
|
||
"健身|运动|减脂|增肌|营养": "健身达人营养师",
|
||
"美妆|化妆|护肤|美白": "资深美妆博主",
|
||
"独居|租房|一人": "独居女孩",
|
||
"烘焙|甜品|蛋糕|面包": "甜品烘焙爱好者",
|
||
"数码|科技|App|电子": "数码科技女生",
|
||
"小镇|打拼|省钱|攒钱": "小镇姑娘在大城市打拼",
|
||
"中医|养生|食疗|节气": "中医养生爱好者",
|
||
"二次元|cos|动漫|漫展": "二次元coser",
|
||
"程序|代码|开发|码农": "北漂程序媛",
|
||
"复古|vintage|中古|古着": "复古穿搭博主",
|
||
"考研|备考|上岸|学习方法": "考研上岸学姐",
|
||
"猫|铲屎|喵": "新手养猫人",
|
||
"咖啡|手冲|拿铁": "咖啡重度爱好者",
|
||
"极简|断舍离|简约": "极简主义生活家",
|
||
"汉服|国风|传统文化": "汉服爱好者",
|
||
"插画|手绘|画画|绘画": "插画师小姐姐",
|
||
"海归|留学|海外": "海归女孩",
|
||
"瑜伽|冥想|身心灵": "瑜伽老师",
|
||
"美甲|甲型|指甲": "美甲设计师",
|
||
"家居|软装|装修|改造": "家居软装设计师",
|
||
}
|
||
for hints, persona_key in _CATEGORY_HINTS.items():
|
||
if any(h in persona_text for h in hints.split("|")):
|
||
return PERSONA_POOL_MAP.get(persona_key)
|
||
return None
|
||
|
||
|
||
def get_persona_topics(persona_text: str) -> list[str]:
|
||
"""获取人设对应的主题池,未匹配则返回全量池"""
|
||
pools = _match_persona_pools(persona_text)
|
||
return pools["topics"] if pools else DEFAULT_TOPICS
|
||
|
||
|
||
def get_persona_keywords(persona_text: str) -> list[str]:
|
||
"""获取人设对应的评论关键词池,未匹配则返回全量池"""
|
||
pools = _match_persona_pools(persona_text)
|
||
return pools["keywords"] if pools else DEFAULT_COMMENT_KEYWORDS
|
||
|
||
|
||
def on_persona_changed(persona_text: str):
|
||
"""人设切换时联动更新评论关键词池、主题池、队列主题池,并保存到配置"""
|
||
# 保存人设到配置
|
||
cfg.set("persona", persona_text)
|
||
|
||
# 更新关键词和主题池
|
||
keywords = get_persona_keywords(persona_text)
|
||
topics = get_persona_topics(persona_text)
|
||
keywords_str = ", ".join(keywords)
|
||
topics_str = ", ".join(topics)
|
||
matched = _match_persona_pools(persona_text)
|
||
if matched:
|
||
label = persona_text[:15] if len(persona_text) > 15 else persona_text
|
||
hint = f"✅ 已切换至「{label}」专属关键词/主题池"
|
||
else:
|
||
hint = "ℹ️ 使用通用全量关键词/主题池"
|
||
|
||
# 返回:自动运营的关键词池、主题池、提示信息、队列主题池
|
||
return keywords_str, topics_str, hint, topics_str
|
||
|
||
|
||
|
||
def _resolve_persona(persona_text: str, log_fn=None) -> str:
|
||
"""解析人设:如果是随机人设则从池中随机选一个,否则原样返回"""
|
||
if not persona_text or persona_text == RANDOM_PERSONA_LABEL:
|
||
chosen = random.choice(DEFAULT_PERSONAS)
|
||
log_fn and log_fn(f"🎭 本次人设: {chosen[:20]}...")
|
||
return chosen
|
||
# 检查是否选的是池中某个人设(Dropdown选中)
|
||
return persona_text
|
||
|
||
|