astrology-ziwei-api / barnum_cold_reader.py
th
🦊 v4.0 命理模块集成完成:巴纳姆+六亲+10步批命
c4d5552
Raw History Blame Contribute Delete
26.6 kB
"""
巴纳姆冷读引擎 - Barnum Cold Reader Engine
将机械解读转化为温暖有共鸣的语言
Version: 1.0
Created: 2026-02-03
Author: Sisi & TH Studio
核心技巧:
1. 两面性描述:"您有时候A,有时候B"
2. 条件性语言:"当...时","如果..."
3. 验证性钩子:让用户感觉被"看透"
4. 普遍但个性化:听起来只说给你一个人听
"""
from typing import Dict, List, Any, Optional
from enum import Enum
class BarnumTone(Enum):
"""巴纳姆语调类型"""
WARM = "warm" # 温暖亲切
INSIGHTFUL = "insightful" # 洞察深刻
SUPPORTIVE = "supportive" # 支持鼓励
CAUTIOUS = "cautious" # 谨慎提醒
class BarnumColdReader:
"""
巴纳姆冷读引擎
将机械断语转化为温暖有共鸣的语言
"""
def __init__(self):
"""初始化巴纳姆引擎"""
# 两面性描述模板
self.duality_templates = {
'personality': [
"您内心深处{trait_a},但在外人面前往往展现出{trait_b}的一面",
"您有时候{trait_a},有时候又{trait_b}——这种矛盾正是您独特魅力的来源",
"在熟悉的人面前,您会展露{trait_a}的性格;而面对陌生环境,您更倾向于{trait_b}",
"您可能已经注意到,内在的{trait_a}与外在的{trait_b},让您比一般人更能理解人性的复杂"
],
'career': [
"您既有{strength_a}的能力,也有{strength_b}的潜质——关键在于何时发挥哪种特长",
"您的职业天赋在于:能够灵活切换{strength_a}和{strength_b}两种模式",
"当需要{strength_a}时,您能做到;当需要{strength_b}时,您同样不会让人失望"
],
'relationship': [
"在感情中,您渴望{need_a},同时又珍惜{need_b}",
"您理想的伴侣,应该能够理解您对{need_a}和{need_b}的双重需求",
"您有时候需要{need_a},有时候更想要{need_b}——这很正常,真正爱您的人会懂得平衡"
]
}
# 条件性语言模板
self.conditional_templates = {
'opportunity': [
"当{condition}时,您会发现机会自然而然地向您靠近",
"如果您能够{condition},接下来的发展将会超出您的预期",
"在{condition}的情况下,您的优势会得到最大发挥"
],
'challenge': [
"当{condition}时,需要特别注意——但这同时也是成长的契机",
"如果遇到{condition},不必过于担忧,您完全有能力化解",
"在{condition}的时候,放慢脚步反而是明智之选"
]
}
# 验证性钩子模板(让用户感觉被"看透")
self.validation_hooks = {
'personality': [
"您可能已经注意到,",
"旁人或许不理解,但您心里清楚,",
"您曾经有过这样的经历——",
"有些事情您不说,但其实您早就意识到了,",
"这一点您可能不会轻易告诉别人,"
],
'experience': [
"回想过去,您应该能找到印证——",
"这解释了为什么您曾经会{event}",
"您过去的某些经历,其实正是这种特质的体现",
"或许您已经隐约感受到了这一点"
]
}
# 星曜个性化描述(温暖版)
self.star_warm_descriptions = {
'紫微': {
'opening': "紫微坐命的您,内心深处有着与生俱来的领袖气质。",
'insight': "您可能已经注意到,人们常常自然而然地向您寻求建议——即使您有时并不刻意追求这种角色。",
'duality': "有趣的是,您既有掌控全局的魄力,同时又保持着适度的谨慎。您知道什么时候该果断决策,什么时候该静观其变。",
'empathy': "当然,'高处不胜寒'的感觉您可能也体会过。但请记住,真正的领导者,往往都经历过这样的磨练。",
'closing': "您的贵气不在于张扬,而在于那份从容不迫的气度。"
},
'天机': {
'opening': "天机星让您拥有敏锐的观察力和快速的反应能力。",
'insight': "您的思维转换之快,有时候甚至会让身边的人跟不上您的节奏。",
'duality': "您既能在宏观层面把握大局,又能注意到别人忽略的细节。这种能力在适当的时候是巨大的优势。",
'empathy': "唯一需要注意的是,过度的思考有时会让您感到疲惫。学会适时放空,对您尤为重要。",
'closing': "您的智慧在于洞察,更在于知道何时该思考,何时该行动。"
},
'太阳': {
'opening': "太阳坐命,赋予您开朗热情的性格和乐于助人的天性。",
'insight': "您可能已经发现,人们喜欢围绕在您身边——您的光芒会感染周围的人。",
'duality': "您既有燃烧自己照亮他人的热忱,同时内心也渴望被理解和认可。",
'empathy': "有时候,您付出很多却不一定得到等量的回报,这会让您感到委屈。但请相信,您的善良终会得到回应。",
'closing': "您最大的财富,是那颗永远温暖的心。"
},
'武曲': {
'opening': "武曲星赋予您刚毅果断的性格和出色的理财能力。",
'insight': "您做事讲求效率,不喜欢绕弯子——这种直接的风格在关键时刻往往能发挥奇效。",
'duality': "您外表看起来强硬,但内心其实非常重情义。只是您习惯用行动而非言语来表达关心。",
'empathy': "有时候,您的直接可能会无意中伤害到敏感的人。学会适度柔软,会让您的人际关系更加融洽。",
'closing': "您的力量在于坚定,更在于知道为什么而坚定。"
},
'天同': {
'opening': "天同星让您拥有温和随性的性格,懂得享受生活的美好。",
'insight': "您可能已经注意到,自己很容易知足,对物质的追求不如别人那么强烈。",
'duality': "您既有安于现状的一面,也有追求更好生活的内在动力——关键是找到两者的平衡。",
'empathy': "有时候别人会觉得您不够上进,但其实您只是更看重内心的平静和幸福。这是一种智慧。",
'closing': "您最大的福气,是懂得什么才是真正重要的。"
},
'廉贞': {
'opening': "廉贞星赋予您多才多艺的特质和出色的社交能力。",
'insight': "您在人际交往中游刃有余,能够快速与他人建立联系。",
'duality': "您既有热情主动的一面,也有谨慎保护自己的本能。这让您在社交场合收放自如。",
'empathy': "有时候,您可能会觉得自己扮演了太多角色,不确定哪个才是真正的自己。这种困惑其实是深度自我觉察的体现。",
'closing': "您的魅力在于灵活,更在于始终保持真实的那份底色。"
},
'天府': {
'opening': "天府星让您拥有稳重踏实的性格和善于积累的能力。",
'insight': "您做事有规划,不喜欢冒险,这让您在长期发展中更有优势。",
'duality': "您既有保守谨慎的一面,也有对美好生活的追求。您知道如何在安全的范围内实现最大的收益。",
'empathy': "有时候,过于谨慎可能会让您错失一些机会。但您的稳健,在关键时刻往往能保护您免受更大的损失。",
'closing': "您最大的财富,是那份稳中求进的智慧。"
},
'太阴': {
'opening': "太阴坐命,赋予您细腻敏感的内心和深厚的情感能力。",
'insight': "您能够感知到他人忽略的情绪变化,这种能力让您在关系中更有同理心。",
'duality': "您既有温柔体贴的一面,也有坚强独立的内核。柔软是您的选择,不是软弱。",
'empathy': "敏感有时会让您承受更多的情绪波动,学会适度屏蔽负面能量,会让您更加自在。",
'closing': "您的光芒不在于耀眼,而在于那份温润如玉的气质。"
},
'贪狼': {
'opening': "贪狼星让您拥有多才多艺的特质和永不满足的进取心。",
'insight': "您的兴趣广泛,总是对新鲜事物充满好奇——这让您的人生比一般人更加丰富多彩。",
'duality': "您既有追求刺激的冒险精神,也有脚踏实地的务实一面。关键是找到两者的平衡点。",
'empathy': "有时候,您可能会感到欲望太多,精力不够分配。学会取舍,反而能成就更多。",
'closing': "您最大的魅力,是那份永远年轻的热情和好奇心。"
},
'巨门': {
'opening': "巨门星赋予您出色的口才和敏锐的分析能力。",
'insight': "您善于发现问题、表达观点,在需要沟通和辩论的场合往往能脱颖而出。",
'duality': "您既有直言不讳的勇气,也有察言观色的智慧。关键在于把握说话的时机和分寸。",
'empathy': "有时候,您的直接可能会引来是非。但请相信,真诚的沟通最终会被理解。",
'closing': "您的力量在于表达,更在于懂得何时该说、何时该静。"
},
'天相': {
'opening': "天相星让您拥有温和忠诚的性格和出色的协调能力。",
'insight': "您是天生的调和者,能够在冲突中找到各方都能接受的解决方案。",
'duality': "您既有服务他人的热心,也有坚守原则的底线。您的柔软不是没有棱角,而是知道什么时候该圆滑。",
'empathy': "有时候,您可能会因为过度照顾他人而忽略自己的需求。记住,照顾好自己,才能更好地帮助别人。",
'closing': "您最大的价值,是那份让周围人都感到舒适的能力。"
},
'天梁': {
'opening': "天梁星赋予您正直善良的性格和乐于助人的天性。",
'insight': "您有一种与生俱来的使命感,喜欢为他人排忧解难。",
'duality': "您既有清高自持的一面,也有融入世俗的智慧。您知道如何在保持原则的同时与人为善。",
'empathy': "有时候,您的善良可能不被理解,甚至被人利用。但请相信,您的付出终会得到回报——即使方式和时间出乎意料。",
'closing': "您最大的福报,是那颗始终向善的心。"
},
'七杀': {
'opening': "七杀星赋予您果敢刚毅的性格和独立自主的特质。",
'insight': "您不喜欢被束缚,喜欢按自己的方式做事——这种独立精神是您最大的优势。",
'duality': "您外表看起来强硬无畏,但内心其实非常细腻。只是您习惯了独自承担,不愿轻易示弱。",
'empathy': "有时候,您可能会觉得自己走得太孤独。但请记住,领先者往往都是孤独的——这是荣耀的代价。",
'closing': "您的力量在于勇往直前,更在于知道自己为何而战。"
},
'破军': {
'opening': "破军星让您拥有开创变革的精神和不安于现状的特质。",
'insight': "您不喜欢一成不变,总是在寻找突破和改变的机会。",
'duality': "您既有破旧立新的勇气,也有深思熟虑的一面。您的变革不是盲目的,而是有方向的。",
'empathy': "有时候,您的变化可能会让身边的人感到不安。学会在变革中给他人安全感,会让您走得更远。",
'closing': "您最大的价值,是那份敢于打破常规的勇气。"
}
}
# 宫位温暖描述
self.palace_warm_descriptions = {
'命宫': {
'positive': "这颗星落在命宫,为您的一生定下了{quality}的基调。",
'negative': "虽然这个配置带来一些挑战,但正是这些经历,造就了您的独特和坚强。",
'advice': "把握好这份特质,您的人生将会充满可能。"
},
'财帛宫': {
'positive': "这颗星守护您的财运,预示着{quality}。",
'negative': "在财务方面,您可能需要比别人多一些谨慎。但这恰恰培养了您稳健的理财能力。",
'advice': "记住,真正的财富不仅是金钱,还有您创造价值的能力。"
},
'夫妻宫': {
'positive': "这颗星照耀您的感情宫位,带来{quality}。",
'negative': "感情路上或许会有些曲折,但每一次经历都在帮您认清什么是真正的爱。",
'advice': "相信爱情,它会在对的时间、以对的方式来到您身边。"
},
'官禄宫': {
'positive': "事业宫中的这颗星,为您的职业发展带来{quality}。",
'negative': "事业上的挑战,正是磨练您能力的机会。每一次困难,都让您变得更强。",
'advice': "坚持下去,您的价值终会被看见。"
},
'福德宫': {
'positive': "福德宫的这个配置,赋予您{quality}的内在品质。",
'negative': "内心的波动有时会困扰您,但这也让您比别人更能体会人生的深度。",
'advice': "内心的平静是可以修炼的,您正在这条路上。"
}
}
# 四化温暖描述
self.sihua_warm_descriptions = {
'化禄': {
'meaning': "这份化禄,是命运给您的礼物。",
'insight': "它代表着{area}方面的顺遂和收获。",
'advice': "好好珍惜这份恩赐,它会在关键时刻护佑您。"
},
'化权': {
'meaning': "化权赋予您在{area}方面的掌控力。",
'insight': "您有能力主导自己的命运,而不是被动等待。",
'advice': "善用这份力量,但也记得保持谦逊。"
},
'化科': {
'meaning': "化科带来{area}方面的名声和认可。",
'insight': "您的才华和努力,会被越来越多的人看见。",
'advice': "继续保持学习和精进的心态,好名声会自然而来。"
},
'化忌': {
'meaning': "{area}方面可能需要您多一些关注和谨慎。",
'insight': "但请记住,这不是诅咒,而是提醒——提前知道需要注意的领域,本身就是一种保护。",
'advice': "谨慎不等于恐惧。用智慧去化解,用行动去转变,您完全有能力把挑战变成机遇。"
}
}
# 敏感内容替代词
self.sensitive_replacements = {
'主死': '需要特别关注健康和安全',
'横死': '需要特别注意人身安全',
'夭折': '早年健康需要特别呵护',
'绝后': '子女运势需要积极调整',
'克夫': '婚姻需要用心经营',
'克妻': '夫妻关系需要多些包容',
'丧偶': '需要关注配偶的健康',
'牢狱': '需要特别注意法律风险',
'破财': '财务方面需要谨慎规划',
'凶': '需要特别注意',
'死限': '健康和安全需要重点关注',
'孤独': '独立自主,个人空间需要',
'刑克': '关系中需要多些理解和沟通'
}
def apply_barnum_effect(
self,
original_text: str,
star_name: str = None,
palace_name: str = None,
tone: BarnumTone = BarnumTone.WARM
) -> Dict[str, Any]:
"""
将机械断语转化为巴纳姆风格的温暖解读
Args:
original_text: 原始断语
star_name: 星曜名称
palace_name: 宫位名称
tone: 语调类型
Returns:
dict: 巴纳姆增强后的解读
"""
result = {
'original': original_text,
'enhanced': '',
'tone': tone.value,
'components': {
'opening': '',
'insight': '',
'duality': '',
'empathy': '',
'closing': ''
}
}
# 处理敏感内容
processed_text = self._process_sensitive_content(original_text)
# 如果有星曜名称,使用星曜专属描述
if star_name and star_name in self.star_warm_descriptions:
star_desc = self.star_warm_descriptions[star_name]
result['components']['opening'] = star_desc['opening']
result['components']['insight'] = star_desc['insight']
result['components']['duality'] = star_desc['duality']
result['components']['empathy'] = star_desc['empathy']
result['components']['closing'] = star_desc['closing']
# 组合增强文本
result['enhanced'] = f"""
{star_desc['opening']}
{star_desc['insight']}
{star_desc['duality']}
{star_desc['empathy']}
{star_desc['closing']}
""".strip()
else:
# 通用巴纳姆增强
result['enhanced'] = self._apply_generic_barnum(processed_text, tone)
return result
def _process_sensitive_content(self, text: str) -> str:
"""处理敏感内容,用温和的表达替代(私有方法)"""
processed = text
for sensitive, replacement in self.sensitive_replacements.items():
processed = processed.replace(sensitive, replacement)
return processed
def replace_sensitive_content(self, text: str) -> str:
"""公共API:处理敏感内容,用温和的表达替代"""
return self._process_sensitive_content(text)
def _apply_generic_barnum(self, text: str, tone: BarnumTone) -> str:
"""应用通用巴纳姆效果"""
# 添加验证性钩子
hook = self.validation_hooks['personality'][0] # "您可能已经注意到,"
# 根据语调调整
if tone == BarnumTone.WARM:
enhanced = f"{hook}{text}\n\n但请记住,了解自己的特质,是为了更好地发挥优势、化解挑战。您完全有能力掌控自己的命运。"
elif tone == BarnumTone.INSIGHTFUL:
enhanced = f"深入分析您的命盘,{text}\n\n这种配置揭示了您独特的人生路径。理解这一点,您会对过去的经历有新的认识,对未来的选择更有把握。"
elif tone == BarnumTone.SUPPORTIVE:
enhanced = f"{text}\n\n无论命盘如何显示,您的未来永远掌握在自己手中。这只是参考,不是定数。带着这份了解,积极行动,您一定可以创造自己想要的人生。"
elif tone == BarnumTone.CAUTIOUS:
enhanced = f"{hook}{text}\n\n这需要您多一些关注,但请不要担忧——提前知道需要注意的领域,本身就是一种保护。用智慧去应对,您完全可以化险为夷。"
else:
enhanced = text
return enhanced
def generate_personality_reading(
self,
main_stars: List[str],
palace_positions: Dict[str, str]
) -> str:
"""
生成性格解读(巴纳姆风格)
Args:
main_stars: 命宫主星列表
palace_positions: 宫位星曜位置
Returns:
str: 巴纳姆风格的性格解读
"""
readings = []
for star in main_stars:
if star in self.star_warm_descriptions:
desc = self.star_warm_descriptions[star]
readings.append(desc['opening'])
readings.append(desc['insight'])
readings.append(desc['duality'])
if not readings:
# 通用解读
readings.append("您的命盘展现出独特的性格特质。")
readings.append("您既有理性分析的能力,也有感性直觉的一面。这种平衡是您的优势。")
readings.append("在不同场合,您能够灵活调整自己的表现——这是一种难得的能力。")
# 添加验证性钩子
readings.insert(1, "您可能已经注意到,这些特质在您的生活中不断得到印证。")
# 添加积极结尾
readings.append("\n💕 思思提示:了解自己是为了更好地发挥优势。您的命运,永远掌握在自己手中。")
return "\n\n".join(readings)
def enhance_fortune_text(self, fortune_level: str, score: int) -> Dict[str, str]:
"""
增强运势文本(巴纳姆风格)
Args:
fortune_level: 运势级别
score: 运势分数
Returns:
dict: 增强后的运势文本
"""
if score >= 30:
return {
'level': '上上吉',
'emoji': '✨',
'summary': "您的命盘格局优秀,一生多有贵人相助。这并不意味着一切都会轻松,而是说当您努力时,回报会比别人更可观。",
'insight': "您可能已经感受到,自己总是能在关键时刻遇到帮助——这不是偶然,而是您命盘中的贵气在起作用。",
'advice': "把握住这份优势,积极进取,您的成就将会超出预期。",
'tone': 'very_positive'
}
elif score >= 15:
return {
'level': '上吉',
'emoji': '🌟',
'summary': "您的命盘配置良好,整体运势稳健向上。只要把握机会,努力奋斗,定能成就一番事业。",
'insight': "您的人生轨迹会有起伏,但总体是上升的。那些暂时的困难,回头看都是必要的铺垫。",
'advice': "保持积极心态,您正走在正确的道路上。",
'tone': 'positive'
}
elif score >= 0:
return {
'level': '中吉',
'emoji': '🌤️',
'summary': "您的命盘平稳中带有机遇。人生不会大起大落,但需要您主动把握机会,稳健发展。",
'insight': "您可能觉得自己不够幸运,但其实您的优势在于稳定——在变化的时代,这是一种宝贵的品质。",
'advice': "不必羡慕别人的起伏跌宕,您的平稳正是许多人求而不得的。在稳定中寻找突破,是您的最佳策略。",
'tone': 'balanced'
}
elif score >= -15:
return {
'level': '平',
'emoji': '⚖️',
'summary': "您的命盘有些挑战需要面对,但同样有转机可以把握。关键在于您的选择和行动。",
'insight': "您经历的困难可能比别人多一些,但这些经历正在锻造一个更强大的您。",
'advice': "不要被眼前的困难吓倒。每一个挑战都是化妆的祝福,只要您坚持下去。",
'tone': 'cautious'
}
else:
return {
'level': '需化解',
'emoji': '🔔',
'summary': "您的命盘存在一些需要特别关注的配置。但请记住,命运不是定数——了解这些,是为了更好地化解。",
'insight': "知道自己的挑战在哪里,本身就是一种保护。很多人盲目前行,您却能有的放矢。",
'advice': "积极行动比消极等待更有意义。每一个化解的努力,都在改写您的命运轨迹。命运掌握在自己手中。",
'tone': 'supportive'
}
def get_star_warm_description(self, star_name: str) -> Optional[Dict[str, str]]:
"""
获取星曜的温暖描述(公共API)
Args:
star_name: 星曜名称(如:紫微、天机)
Returns:
dict: 星曜温暖描述,包含opening/insight/duality/empathy/closing
None: 如果星曜不存在
"""
return self.star_warm_descriptions.get(star_name)
def add_disclaimer(self) -> str:
"""添加免责声明"""
return """
---
⚠️ 温馨提示:
紫微斗数是中华传统文化的瑰宝,提供了一种认识自我的视角。但命理分析仅供参考,不能替代:
• 医学诊断和治疗
• 法律咨询和建议
• 专业心理辅导
• 重大人生决策
您的命运,永远掌握在自己手中。积极行动比被动等待更重要。
🦊 Generated with knowledge & love by Sisi
""".strip()
# 单例模式
_barnum_instance = None
def get_barnum_reader() -> BarnumColdReader:
"""获取巴纳姆冷读器单例"""
global _barnum_instance
if _barnum_instance is None:
_barnum_instance = BarnumColdReader()
return _barnum_instance
# 导出类
__all__ = ['BarnumColdReader', 'BarnumTone', 'get_barnum_reader']