File size: 26,361 Bytes
f2c3ad0
 
 
 
 
 
 
 
 
 
 
77f7db7
f2c3ad0
 
 
77f7db7
f2c3ad0
 
 
 
 
77f7db7
f2c3ad0
 
 
77f7db7
f2c3ad0
 
 
77f7db7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2c3ad0
 
 
 
 
 
 
 
77f7db7
 
f2c3ad0
 
 
 
 
77f7db7
f2c3ad0
 
 
77f7db7
f2c3ad0
 
 
77f7db7
f2c3ad0
77f7db7
f2c3ad0
 
77f7db7
f2c3ad0
 
77f7db7
 
 
 
 
f2c3ad0
 
 
77f7db7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27ff44d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77f7db7
 
27ff44d
77f7db7
 
27ff44d
77f7db7
 
d98fe87
f2c3ad0
d98fe87
 
 
 
 
 
 
 
f2c3ad0
 
 
d98fe87
f2c3ad0
 
 
 
e58b3a5
 
f2c3ad0
d98fe87
e58b3a5
d98fe87
77f7db7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2c3ad0
 
 
77f7db7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f2c3ad0
 
 
 
 
 
 
 
 
 
 
 
 
cd4994b
 
f2c3ad0
77f7db7
 
 
 
 
f2c3ad0
 
 
 
 
 
cd4994b
 
f2c3ad0
 
 
77f7db7
 
f2c3ad0
 
77f7db7
f2c3ad0
 
77f7db7
f2c3ad0
77f7db7
412d5ed
77f7db7
f2c3ad0
77f7db7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31aba0f
77f7db7
 
 
 
 
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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
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 get_lunar_info_for_two_people(solYear, solMonth, solDay, solHour, solYear2, solMonth2, solDay2, solHour2):
    print(solYear, solMonth, solDay, solHour, solYear2, solMonth2, solDay2, solHour2)

    rst1 = get_lunar_info(solYear, solMonth, solDay, solHour)
    rst2 = get_lunar_info(solYear2, solMonth2, solDay2, solHour2)

    print(rst1[0], rst1[1], rst1[2], rst2[0], rst2[1], rst2[2])

    #궁합
    # 두 사람의 궁합 분석
    compatibility = analyze_character_two(rst1[1], rst2[1])

    return rst1[0], rst1[1], rst1[2], rst2[0], rst2[1], rst2[2], compatibility







# B 데이터를 활용하는 함수 추가
def get_famous_people(lunIljin):
    famous_people = {
        "갑자": "박수주[모델], 윈터, 닝닝, 이재용, 빈지노, 김재환[워너원], 설윤[엔믹스], 음문석, 조조",
        "갑술": "안소희, 장기하, 송하영[프미나], 지효[트와], 니엘, 케라 에이코[아따맘마], 이옳이[유튜버], 엠씨몽, 故 이소룡",
        "갑신": "김경욱[다나카], 지지 하디드, 로제, 예지[ITZY], 박지후, 바로[비포], 설아[우주소녀], 한승우, 최예나, 조진웅, 유해진, 황정민, 다니엘 래드클리프[해리포터], 최소라[모델], 수샤샤[유튜버]",
        "갑오": "조이현, 진구, 이기광, 민아, 설현, 텐[NCT], 김종민, 우원재, 기리보이, 양홍원, 테슬라, 후루다테 하루이치[하이큐]",
        "갑진": "해린[뉴진스], 허윤진, 리즈[아이브], 한선화, 태현[투바투], 지성[NCT], 박재범, 송혜교, 김정미[가수], 아라카와 히로무[강철의 연금술사]",
        "갑인": "김용지[배우], 카즈하, 에릭,케빈[더보이즈], 휴닝카이[투바투], 비니, 진, 이광수, 박신혜, 피오, 엠마[스우파], 배리 페퍼[배우], 쿠보 타이토[블리치], 김가람[탈퇴], 故 설리",
        "을축": "새소년, 다니엘[뉴진스], 사쿠라, 과천꿀수박[댄서], 주헌[몬엑], 윤두준, 소지섭, 신예은, 김대명, 지니[탈퇴], 박화요비, 유영진[작곡가], 故 박경리[토지 작가]",
        "을해": "김은숙[작가], 하비에르 바르뎀, 수민[스테이씨], 범규[투바투], 문재인, 홍준표, 호날두, 제이홉, 유연석, 한[스키즈], 이토 준지, 임라라[엔조이커플]",
        "을유": "김민규[배우], 김건우[더글로리], 슬리피, 김남길, 김윤석, 손흥민, 이재명, 마동석, 지호지방시",
        "을미": "신세경, 브래드 피트, 가을[아이브], 안철수, 산들[비포], 손석희, 뷔, 윤아, 해찬[NCT], 리안[스우파], 효진초이[스우파], 창빈[스키즈], 이수만, 왕가위, 아오야마 고쇼[코난], 故 윤정희[배우]",
        "을사": "이유미, 권현빈, 박서준, GD, 서인국, 박성웅, 상연[더보이즈], 츄, 전소연, 리노[스키즈], 이시야마 하지메[진격의 거인], 산범",
        "을묘": "문근영, 기우쌤, 화사, 염혜란, 규진[엔믹스], 효정, 장기용, 지성, 이근, 조용필, 리쌍, 루한, 타카하시 루미코[이누야샤]",
        "병인": "장현승, 손석구, 박지원[프미나], 라드뮤지엄, 김하온, 이홍기, 버벌진트, 혜리, 오은영, 강형욱, 백종원, 아라키 히로히코[죠죠의 기묘한 모험], 레오제이[유튜버], 히틀러",
        "병자": "신세휘, 홍승연[루트,댄서], 주우재, 필릭스[스키즈], 지호, 백지영, 김병만, 이노우에 다케히코[슬램덩크], 황의조, 풍자",
        "무신": "한소희, 이원정[우영우9회], 글렌 포웰[배우], 장도연, 박보영, 제시카, 온유, 안지영, 하연수, 박지민, 릴보이, 켄지[작곡가], 이미도[배우], 셰익스피어",
        "병신": "시은[스테이씨], 고찬빈[배우], 키, 에단 코엔, 강동원, 타블로, 이민우, 윤남기[돌싱글즈2],  한서희, 허경영, 김건희, 남태현, 토리야마 아키라[드래곤볼], 아인슈타인, 고흐",
    }
    print(lunIljin)
    return famous_people.get(lunIljin[:2], "해당 일주에 대한 유명인 정보가 없습니다.")


def analyze_character(lunIljin, OPENAI_API_KEY="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"):
    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"], get_famous_people(lunIljin)
    else:
        # 오류 메시지 개선
        return f"오류가 발생했습니다. 상태 코드: {response.status_code}, 메시지: {response.json().get('error', {}).get('message', 'Unknown error')}", ""

def analyze_character_two(lunIljin, lunIljin2, OPENAI_API_KEY="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"):
    API_URL = "https://api.openai.com/v1/chat/completions"
    payload = {
        "model": "gpt-4-0125-preview",  # 모델 이름 확인 필요
        "messages": [{
            "role": "system",
            "content": "당신은 두사람의 궁합에 대해 설명하는 챗봇입니다."
        }, {
            "role": "user",
            "content": f"다음의 두사람의 사주를 보고 궁합이 좋은지 안좋은지 성향이 맞는지 아닌지 여부를 알려주고 이것을 100% 대비 비율도 추가해서 표현해주세요 '{lunIljin}', '{lunIljin2}'"

        }],
    }
    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


with gr.Blocks() as demo:
    solYear =""
    solMonth = ""
    solDay = ""
    solHour = ""

    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_output = gr.Textbox(label="유명인 이름")

        analyze_button = gr.Button("분석하기")
        analyze_button.click(fn=analyze_character, inputs=[lunIljin_state, OPENAI_API_KEY_input],
                             outputs=[character_output, celebrity_output])


    with gr.Tab("궁합"):
        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="결과")
        solYear2 = gr.Textbox(label="생년(예: 1990)")
        solMonth2 = gr.Textbox(label="생월(예: 01)")
        solDay2 = gr.Textbox(label="생일(예: 31)")
        solHour2 = gr.Textbox(label="생시(예시: 1030)", placeholder="시간을 24시간 형식으로 입력하세요 (예: 2230)")
        output2 = 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_for_two_people,
            inputs=[solYear, solMonth, solDay, solHour, solYear2, solMonth2, solDay2, solHour2],
            outputs=[output1, lunIljin_state, analysis_result, output2, lunIljin_state, analysis_result, analysis_result]
        )

demo.launch()