""" 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