Spaces:
Runtime error
Runtime error
File size: 19,732 Bytes
f2c3ad0 da2d938 f2c3ad0 d98fe87 f2c3ad0 d98fe87 f2c3ad0 d98fe87 f2c3ad0 d98fe87 f2c3ad0 d98fe87 57d8237 f2c3ad0 2f70157 84fc7c7 2f70157 b3f072f f2c3ad0 cd4994b 74bdad8 f2c3ad0 cd4994b f2c3ad0 74bdad8 f2c3ad0 74bdad8 f2c3ad0 31aba0f cd4994b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 |
import gradio as gr
import requests
from xml.etree import ElementTree
import os
import sys
import json
def exception_handler(exception_type, exception, traceback):
print(f"{exception_type.__name__}: {exception}")
sys.excepthook = exception_handler
sys.tracebacklimit = 0
def get_chinese_hour(birth_hour):
hour = int(birth_hour[:2])
chinese_hours = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해']
return chinese_hours[hour // 2 % 12]
def calculate_siju(birth_hour, lunIljin):
chinese_hour = get_chinese_hour(birth_hour) # 생시에 해당하는 지지
lunIljin_first = lunIljin[0] # 일주의 첫 글자
# 일주 첫 글자에 따른 시주 매핑
siju_mapping = {
('갑', '자'): '갑자(甲子)', ('기', '자'): '갑자(甲子)',
('을', '자'): '병자(丙子)', ('경', '자'): '병자(丙子)',
('병', '자'): '무자(戊子)', ('신', '자'): '무자(戊子)',
('정', '자'): '경자(庚子)', ('임', '자'): '경자(庚子)',
('무', '자'): '임자(壬子)', ('계', '자'): '임자(壬子)',
('갑', '축'): '을축(乙丑)', ('기', '축'): '을축(乙丑)',
('을', '축'): '정축(丁丑)', ('경', '축'): '정축(丁丑)',
('병', '축'): '기축(己丑)', ('신', '축'): '기축(己丑)',
('정', '축'): '신축(辛丑)', ('임', '축'): '신축(辛丑)',
('무', '축'): '계축(癸丑)', ('계', '축'): '계축(癸丑)',
('갑', '인'): '병인(丙寅)', ('기', '인'): '병인(丙寅)',
('을', '인'): '무인(戊寅)', ('경', '인'): '무인(戊寅)',
('병', '인'): '경인(庚寅)', ('신', '인'): '경인(庚寅)',
('정', '인'): '임인(壬寅)', ('임', '인'): '임인(壬寅)',
('무', '인'): '갑인(甲寅)', ('계', '인'): '갑인(甲寅)',
('갑', '묘'): '정묘(丁卯)', ('기', '묘'): '정묘(丁卯)',
('을', '묘'): '기묘(己卯)', ('경', '묘'): '기묘(己卯)',
('병', '묘'): '신묘(辛卯)', ('신', '묘'): '신묘(辛卯)',
('정', '묘'): '계묘(癸卯)', ('임', '묘'): '계묘(癸卯)',
('무', '묘'): '을묘(乙卯)', ('계', '묘'): '을묘(乙卯)',
('갑', '진'): '무진(戊辰)', ('기', '진'): '무진(戊辰)',
('을', '진'): '경진(庚辰)', ('경', '진'): '경진(庚辰)',
('병', '진'): '임진(壬辰)', ('신', '진'): '임진(壬辰)',
('정', '진'): '갑진(甲辰)', ('임', '진'): '갑진(甲辰)',
('무', '진'): '병진(丙辰)', ('계', '진'): '병진(丙辰)',
('갑', '사'): '기사(己巳)', ('기', '사'): '기사(己巳)',
('을', '사'): '신사(辛巳)', ('경', '사'): '신사(辛巳)',
('병', '사'): '계사(癸巳)', ('신', '사'): '계사(癸巳)',
('정', '사'): '을사(乙巳)', ('임', '사'): '을사(乙巳)',
('무', '사'): '정사(丁巳)', ('계', '사'): '정사(丁巳)',
('갑', '오'): '경오(庚午)', ('기', '오'): '경오(庚午)',
('을', '오'): '임오(壬午)', ('경', '오'): '임오(壬午)',
('병', '오'): '갑오(甲午)', ('신', '오'): '갑오(甲午)',
('정', '오'): '병오(丙午)', ('임', '오'): '병오(丙午)',
('무', '오'): '무오(戊午)', ('계', '오'): '무오(戊午)',
('갑', '미'): '임미(壬未)', ('기', '미'): '임미(壬未)',
('을', '미'): '갑미(甲未)', ('경', '미'): '갑미(甲未)',
('병', '미'): '병미(丙未)', ('신', '미'): '병미(丙未)',
('정', '미'): '무미(戊未)', ('임', '미'): '무미(戊未)',
('무', '미'): '경미(庚未)', ('계', '미'): '경미(庚未)',
('갑', '신'): '임신(壬申)', ('기', '신'): '임신(壬申)',
('을', '신'): '갑신(甲申)', ('경', '신'): '갑신(甲申)',
('병', '신'): '병신(丙申)', ('신', '신'): '병신(丙申)',
('정', '신'): '무신(戊申)', ('임', '신'): '무신(戊申)',
('무', '신'): '경신(庚申)', ('계', '신'): '경신(庚申)',
('갑', '유'): '계유(癸酉)', ('기', '유'): '계유(癸酉)',
('을', '유'): '을유(乙酉)', ('경', '유'): '을유(乙酉)',
('병', '유'): '정유(丁酉)', ('신', '유'): '정유(丁酉)',
('정', '유'): '기유(己酉)', ('임', '유'): '기유(己酉)',
('무', '유'): '신유(辛酉)', ('계', '유'): '신유(辛酉)',
('갑', '술'): '갑술(甲戌) ', ('기', '술'): '갑술(甲戌)',
('을', '술'): '병술(丙戌) ', ('경', '술'): '병술(丙戌)',
('병', '술'): '무술(戊戌) ', ('신', '술'): '무술(戊戌)',
('정', '술'): '경술(庚戌) ', ('임', '술'): '경술(庚戌)',
('무', '술'): '임술(壬戌) ', ('계', '술'): '임술(壬戌)',
('갑', '해'): '을해(乙亥)', ('기', '해'): '을해(乙亥)',
('을', '해'): '정해(丁亥)', ('경', '해'): '정해(丁亥)',
('병', '해'): '기해(己亥)', ('신', '해'): '기해(己亥)',
('정', '해'): '신해(辛亥)', ('임', '해'): '신해(辛亥)',
('무', '해'): '계해(癸亥)', ('계', '해'): '계해(癸亥)',
}
# 시주 계산
siju_key = (lunIljin_first, chinese_hour)
siju = siju_mapping.get(siju_key)
if not siju:
# 일주와 지지 조합에 대한 매핑이 없는 경우의 처리
siju = f"일주 '{lunIljin_first}'와 지지 '{chinese_hour}'에 해당하는 시주를 찾을 수 없습니다."
return siju
def get_lunar_info(solYear, solMonth, solDay, solHour):
base_url = "http://apis.data.go.kr/B090041/openapi/service/LrsrCldInfoService/getLunCalInfo"
service_key = "EuBjt%2B2t0KzYt5Ri%2Bzs56oymt9kHJ8uPIOV7m6UMKnOV8cpwj02EiRqMEudX%2F%2FVTKdMnwaLH0igRwY57YUplEQ%3D%3D"
url = f"{base_url}?solYear={solYear}&solMonth={solMonth}&solDay={solDay}&ServiceKey={service_key}"
response = requests.get(url)
if response.status_code == 200:
root = ElementTree.fromstring(response.content)
lunIljin = root.find(".//lunIljin").text if root.find(".//lunIljin") is not None else "정보 없음"
lunWolgeon = root.find(".//lunWolgeon").text if root.find(".//lunWolgeon") is not None else "정보 없음"
lunSecha = root.find(".//lunSecha").text if root.find(".//lunSecha") is not None else "정보 없음"
siju = calculate_siju(solHour, lunIljin)
# 사주 분석 결과를 HTML 형식으로 생성합니다.
analysis_html = 사주_분석(lunSecha, lunWolgeon, lunIljin, siju)
# JSON 결과, 일주 State, 그리고 HTML 분석 결과를 반환합니다.
return {
"년주": lunSecha,
"월주": lunWolgeon,
"일주": lunIljin,
"시주": siju
}, lunIljin, analysis_html
else:
return {"Error": "API 호출에 실패했습니다."}, "정보 없음", "<p>API 호출에 실패했습니다.</p>"
def analyze_character(lunIljin, OPENAI_API_KEY):
API_URL = "https://api.openai.com/v1/chat/completions"
payload = {
"model": "gpt-4-0125-preview", # 모델 이름 확인 필요
"messages": [{
"role": "system",
"content": "당신은 사주 팔자에 대해 설명하는 챗봇입니다."
}, {
"role": "user",
"content": f"일주 '{lunIljin}'에 대한 성격과 특징을 설명해주세요."
}],
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {OPENAI_API_KEY}"
}
response = requests.post(API_URL, headers=headers, json=payload)
if response.status_code == 200:
data = response.json()
# 대화형 API 응답에서 적절한 메시지 추출
return data["choices"][0]["message"]["content"]
else:
# 오류 메시지 개선
return f"오류가 발생했습니다. 상태 코드: {response.status_code}, 메시지: {response.json().get('error', {}).get('message', 'Unknown error')}"
# 사주 분석 데이터 예시 (간소화된 버전)
사주_데이터 = {
'갑자(甲子)' : '새로운 시작의 상징, 리더십과 독립성이 특징이며, 호쾌하고 성실한 특성을 지닌다. ',
'을축(乙丑)' : '인내심이 매우 강하며, 물질적 성취를 중요시하고 자상한 면모를 갖춘 사람이다. ',
'병인(丙寅)' : '열정적이고 모험을 즐기며, 창의력이 뛰어나고 혁신적인 아이디어를 가진다. ',
'정묘(丁卯)' : '예술적 감각이 뛰어나고 섬세한 성격으로, 관계에서의 충실함과 애정이 깊다. ',
'무진(戊辰)' : '실용적이며 안정적인 기반을 중시하고, 꾸준한 노력을 통해 성장하는 타입이다. ',
'기사(己巳)' : '유연성과 적응력이 뛰어나며, 다양한 상황에서도 잘 대처하는 능력을 가진다. ',
'경오(庚午)' : '정의와 명예를 중시하며, 성실하고 진취적인 태도로 주변의 존경을 받는다. ',
'신미(辛未)' : '세심하고 꼼꼼한 성격으로 완벽을 추구하며, 주변 사람들로부터 신뢰를 얻는다. ',
'임신(壬申)' : '지혜와 균형이 잘 조화된 성격으로, 깊은 통찰력과 함께 인생을 이해하는 능력이 있다. ',
'계유(癸酉)' : '외교적이고 조화를 중시하는 성향으로, 타인과의 관계에서 유연하고 다정다감하다. ',
'갑술(甲戌)' : '미소를 띠며 주변 사람들에게 잘하고, 타고난 영업 능력으로 성공을 이끈다. ',
'을해(乙亥)' : '시원시원한 인상과 모범생 같은 스타일로, 능력과 욕심을 겸비한 사람이다. ',
'병자(丙子)' : '호방하고 까다롭지만, 일을 확실히 처리하고 은근한 매력을 가지고 있다. ',
'정축(丁丑)' : '예술적 감각이 뛰어나며 따뜻하고 베풀 줄 아는 인간미 넘치는 사람이다. ',
'무인(戊寅)' : '모험을 즐기고 자신감이 넘치며, 세상을 발아래 두고 싶어하는 야심 찬 사람이다. ',
'기묘(己卯)' : '세심하고 예술적인 기질이 있으며, 깊은 생각과 함께 사람들과 조화롭게 지낸다. ',
'경진(庚辰)' : '안정적이고 해학적인 성격을 가지며, 주변 사람들과의 조화를 중시한다. ',
'신사(辛巳)' : '멋과 매력을 삶의 중심에 두며, 강한 사회적 능력을 지닌 사람이다. ',
'임오(壬午)' : '지적 능력이 뛰어나고 심오한 생각을 하는, 깊이 있는 인물이다. ',
'계미(癸未)' : '자신과 타인에게 친절하고 귀여운 면모를 지닌 사람으로, 사회적 상호작용에서 따스함과 배려를 보여준다. 자신의 사람들에게 잘 맞춰주며, 화합을 중요시한다. ',
'갑신(甲申)' : '내면이 변화무쌍하나 겉으로는 드러내지 않고, 강인한 면모로 어려움을 극복한다.',
'을유(乙酉)' : '타인의 비밀을 잘 지켜주는 신뢰할 수 있는 사람으로, 집중력과 생활력이 강하다. ',
'병술(丙戌)' : '관대하면서도 세세한 부분에 까다로울 수 있으며, 생활력이 강하고 현명하다. ',
'정해(丁亥)' : '포용력이 뛰어나고 삶에 대한 애착이 강하며, 진심으로 주변을 챙긴다. ',
'무자(戊子)' : '신비로운 분위기와 재물을 중시하는 성향이 있으며, 속내를 잘 드러내지 않는다. ',
'기축(己丑)' : '강인한 내면을 가지고 있으며, 자신만의 길을 걸어가는 확고한 신념을 지닌다. ',
'경인(庚寅)' : '큰 포부와 국제적인 활동을 추구하며, 사업에서 큰 성공을 꿈꾸는 사람이다. ',
'신묘(辛卯)' : '깐깐하고 날카로울 수 있지만, 기본적으로 마음이 착한 사람이다. ',
'임진(壬辰)' : '인내심이 강하고, 한 번 마음먹은 일은 끝까지 밀고 나가는 강인한 의지의 사람이다. ',
'계사(癸巳)' : '적절한 타이밍과 상황 판단력으로 눈에 띄는 성취를 이루는 사람이다. 똑똑하고 상황에 맞는 최선의 결정을 내릴 줄 알며, 삶에서의 여러 기회를 잘 살린다. ',
'갑오(甲午)' : '조금 조급하고 실수할 수 있지만, 낭만적이고 쾌활하여 주변을 밝게 만든다.',
'을미(乙未)' : '애정이 많고 끈기가 있으며, 명확한 주관과 함께 사물의 이치를 잘 파악한다. ',
'병신(丙申)' : '세련되고 맛과 멋을 추구하며, 사교적이면서도 내면의 갈등을 가진 사람이다. ',
'정유(丁酉)' : '감각적이고 재치 있는 성격으로, 주변 사람들에게 즐거움을 주는 사람이다. ',
'무술(戊戌)' : '실속을 중시하고 소박한 삶을 추구하며, 담백한 매력을 가진 실리주의자이다. ',
'기해(己亥)' : '온화하고 명랑하며, 의지가 굳건하나 때로는 망설이는 경향이 있다. ',
'경자(庚子)' : '차분하고 결단력이 있는 반면, 일의 장단점을 신중하게 판단하는 사람이다. ',
'신축(辛丑)' : '겸손함과 함께 타인을 잘 판단하는 능력을 가진, 인간 관계에서의 조율자이다. ',
'임인(壬寅)' : '안정감을 추구하며, 즐거움과 재미를 중요시하는 편안한 성격의 소유자이다. ',
'계묘(癸卯)' : '친절하고 사람들에게 잘 맞춰주는 성격으로, 대단히 착하고 상대방을 편안하게 만드는 능력이 있다. 그의 존재만으로도 주변에 긍정적인 분위기를 만들어낸다. ',
'갑진(甲辰)' : '호쾌한 성격 성실하면서 애교는 없는 무뚝뚝한 상남자 상여자 ',
'을사(乙巳)' : '사람을 끌어당기는 매력이 넘치고, 어디서나 밝은 에너지를 발산한다. 다재다능하고 유연한 사고를 가지며, 새로운 만남과 경험에서 즐거움을 찾는다. ',
'병오(丙午)' : '열정적이고 저돌적인 성격으로 주변을 이끄는 리더십과 솔선수범하는 태도를 지닌다. ',
'정미(丁未)' : '부드럽고 자상하며 열정적인 성격으로, 다양한 사람들과 잘 어울린다. ',
'무신(戊申)' : '따뜻한사람을 끌어당기는 매력이 넘치고, 어디서나 밝은 에너지를 발산한다. 다재다능하고 유연한 사고를 가지며, 새로운 만남과 경험에서 즐거움을 찾는다. 마음과 섬세한 감성을 가지고 있으며, 넓은 포용력으로 주변을 감싼다. ',
'기유(己酉)' : '대담하고 삶에 대한 열정이 넘치지만, 때로는 우유부단한 모습을 보일 수 있다. ',
'경술(庚戌)' : '냉정하고 신사적인 태도로 타인을 돕는 것을 즐기며, 때로는 까탈스러울 수 있다. ',
'신해(辛亥)' : '자존심이 강하고 명확한 취향을 가지며, 낭만적인 감성을 소유한 사람이다. ',
'임자(壬子)' : '조용하지만, 매력적이고 상황에 따라 강한 면모를 드러내는 신비한 인물이다. ',
'계축(癸丑)' : '겉보기엔 차분하지만 내면에는 강한 의지와 신념을 지닌 사람으로, 정말 사람이 좋다는 느낌을 주는 따뜻함과 균형 잡힌 성격을 갖고 있다. 주변 사람들에게 믿음직스러운 존재다. ',
'갑인(甲寅)' : '리더십이 있고 성정이 바르고 호방하다. 조직에 순응적인 사람이다.',
'을묘(乙卯)' : '내면의 강인함에도 불구하고 부드러운 사교성으로 주변 사람들과 쉽게 어울린다. 직선적인 소통 방식 뒤에는 스며드는 영향력이 있어, 많은 이들에게 긍정적인 에너지를 전달한다. ',
'병진(丙辰)' : '깔끔하고 단정한 외모에 도덕적이며, 상황을 교묘하게 조정하는 능력을 가진다. ',
'정사(丁巳)' : '경쟁을 즐기고 다른 사람을 압도하려는 강한 의지와 사교적인 능력을 가졌다. ',
'무오(戊午)' : '결코 굴하지 않는 정신력과 사업에서의 성공을 꿈꾸는, 야망 있는 사람이다. ',
'기미(己未)' : '봉사정신이 투철하고 공동체 의식이 강하며, 공익을 위해 적극적으로 기여한다. ',
'경신(庚申)' : '활동적이고 밖으로의 활동을 즐기며, 새로운 것에 도전하는 것을 두려워하지 않는다. ',
'신유(辛酉)' : '고상하고 타인을 위하는 마음이 강하지만, 감정이 격해질 때는 상당히 무서울 수 있다. ',
'임술(壬戌)' : '고집이 있지만 가족과 타인을 위해 헌신적으로 노력하는 강한 면모를 지닌다. ',
'계해(癸亥)' : '그저 빠져들게 만드는 깊은 내면의 매력을 가진 사람으로, 의외의 깊은 생각과 감성을 지니고 있다. 자신만의 세계가 풍부해 타인과의 교류에서도 독특한 관점을 제공한다. ',
}
def 사주_분석(년주, 월주, 일주, 시주):
# 각 주에 대한 설명을 HTML 형식으로 반환
html_result = f"""
<div>
<h4>사주 분석 결과</h4>
<p><b>년주 요약:</b> {년주} - {사주_데이터.get(년주, '정보 없음')}</p>
<p><b>월주 요약:</b> {월주} - {사주_데이터.get(월주, '정보 없음')}</p>
<p><b>일주 요약:</b> {일주} - {사주_데이터.get(일주, '정보 없음')}</p>
<p><b>시주 요약:</b> {시주} - {사주_데이터.get(시주, '정보 없음')}</p>
</div>
"""
return html_result
def analyze_character(lunIljin_state, OPENAI_API_KEY):
# 여기에 성격과 특징을 분석하는 함수의 내용을 구현하세요.
pass
with gr.Blocks() as demo:
with gr.Tab("AI 사주 운세 분석"):
solYear = gr.Textbox(label="생년(예: 1990)")
solMonth = gr.Textbox(label="생월(예: 01)")
solDay = gr.Textbox(label="생일(예: 31)")
solHour = gr.Textbox(label="생시(예시: 1030)", placeholder="시간을 24시간 형식으로 입력하세요 (예: 2230)")
output1 = gr.JSON(label="결과")
analysis_result = gr.HTML() # 사주 분석 결과를 출력할 HTML 컴포넌트
lunIljin_state = gr.State() # 일주를 저장할 State
get_lunar_info_btn = gr.Button("분석하기")
get_lunar_info_btn.click(
fn=get_lunar_info,
inputs=[solYear, solMonth, solDay, solHour],
outputs=[output1, lunIljin_state, analysis_result]
)
with gr.Tab("나의 성격과 특징 분석"):
OPENAI_API_KEY_input = gr.Textbox(label="OpenAI API 키", placeholder="여기에 OpenAI API 키를 입력하세요")
character_output = gr.Textbox(label="성격과 특징")
celebrity_input = gr.Textbox(label="유명인 이름")
celebrity_output = gr.HTML() # 유명인 분석 결과를 출력할 HTML 컴포넌트
analyze_button = gr.Button("분석하기")
analyze_button.click(fn=analyze_character, inputs=[lunIljin_state, OPENAI_API_KEY_input], outputs=character_output)
# 유명인 분석을 같은 탭에 추가
demo.launch() |