2025saju / app.py
openfree's picture
Update app.py
903e17c verified
raw
history blame
32.3 kB
import gradio as gr
import requests
from xml.etree import ElementTree
import os
import sys
import json
from datetime import datetime
import pytz
from zoneinfo import ZoneInfo
# OpenAI API ํ‚ค๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ
API_KEY = os.getenv("API_KEY")
TIMEZONE_CITIES = {
# ์•„์‹œ์•„
"์„œ์šธ, ๋„์ฟ„, ํ‰์–‘ (UTC+9)": 9,
"๋ฒ ์ด์ง•, ํ™์ฝฉ, ์‹ฑ๊ฐ€ํฌ๋ฅด, ํƒ€์ดํŽ˜์ด, ๋งˆ๋‹๋ผ (UTC+8)": 8,
"๋ฐฉ์ฝ•, ์ž์นด๋ฅดํƒ€, ํ•˜๋…ธ์ด, ํ”„๋†ˆํŽœ (UTC+7)": 7,
"์–‘๊ณค (UTC+6.5)": 6.5,
"๋‹ค์นด, ์•Œ๋งˆํ‹ฐ (UTC+6)": 6,
"๋‰ด๋ธ๋ฆฌ, ๋ญ„๋ฐ”์ด, ์ฝœ๋กฌ๋ณด (UTC+5.5)": 5.5,
"ํƒ€์Šˆ์ผ„ํŠธ, ์ด์Šฌ๋ผ๋งˆ๋ฐ”๋“œ, ์นด๋ผ์น˜ (UTC+5)": 5,
"์นด๋ถˆ (UTC+4.5)": 4.5,
"๋‘๋ฐ”์ด, ์•„๋ถ€๋‹ค๋น„, ๋ฌด์Šค์นดํŠธ (UTC+4)": 4,
"ํ…Œํ—ค๋ž€ (UTC+3.5)": 3.5,
"๋ชจ์Šคํฌ๋ฐ”, ์ด์Šคํƒ„๋ถˆ, ๋ฆฌ์•ผ๋“œ, ๋ฐ”๊ทธ๋‹ค๋“œ (UTC+3)": 3,
# ์œ ๋Ÿฝ
"์•„ํ…Œ๋„ค, ํ—ฌ์‹ฑํ‚ค, ํ‚ค์˜ˆํ”„, ์นด์ด๋กœ (UTC+2)": 2,
"ํŒŒ๋ฆฌ, ๋กœ๋งˆ, ๋ฒ ๋ฅผ๋ฆฐ, ๋งˆ๋“œ๋ฆฌ๋“œ, ์•”์Šคํ…Œ๋ฅด๋‹ด (UTC+1)": 1,
"๋Ÿฐ๋˜, ๋ฆฌ์Šค๋ณธ, ๋”๋ธ”๋ฆฐ (UTC+0)": 0,
# ์•„๋ฉ”๋ฆฌ์นด
"์•„์กฐ๋ ˆ์Šค ์ œ๋„ (UTC-1)": -1,
"ํŽ˜๋ฅด๋‚œ๋„ ๋ฐ ๋…ธ๋กœ๋ƒ (UTC-2)": -2,
"์ƒํŒŒ์šธ๋ฃจ, ๋ถ€์—๋…ธ์Šค์•„์ด๋ ˆ์Šค, ๋ชฌํ…Œ๋น„๋ฐ์˜ค (UTC-3)": -3,
"์‚ฐํ‹ฐ์•„๊ณ , ์•„์ˆœ์‹œ์˜จ (UTC-4)": -4,
"๋‰ด์š•, ๋งˆ์ด์• ๋ฏธ, ๋ณด์Šคํ„ด, ํ† ๋ก ํ†  (UTC-5)": -5,
"์‹œ์นด๊ณ , ๋ฉ•์‹œ์ฝ”์‹œํ‹ฐ, ๋‹ฌ๋ผ์Šค (UTC-6)": -6,
"๋ด๋ฒ„, ํ”ผ๋‹‰์Šค, ์†”ํŠธ๋ ˆ์ดํฌ์‹œํ‹ฐ (UTC-7)": -7,
"๋กœ์Šค์•ค์ ค๋ ˆ์Šค, ์ƒŒํ”„๋ž€์‹œ์Šค์ฝ”, ๋ผ์Šค๋ฒ ๊ฐ€์Šค, ์‹œ์• ํ‹€ (UTC-8)": -8,
"์•ต์ปค๋ฆฌ์ง€, ํŽ˜์–ด๋ฑ…ํฌ์Šค (UTC-9)": -9,
"ํ•˜์™€์ด, ํƒ€ํžˆํ‹ฐ (UTC-10)": -10,
"์‚ฌ๋ชจ์•„ (UTC-11)": -11,
"๋ฒ ์ด์ปค ์„ฌ (UTC-12)": -12,
# ์˜ค์„ธ์•„๋‹ˆ์•„
"์˜คํด๋žœ๋“œ, ์›ฐ๋งํ„ด (UTC+12)": 12,
"์‹œ๋“œ๋‹ˆ, ๋ฉœ๋ฒ„๋ฅธ, ์บ”๋ฒ„๋ผ (UTC+10)": 10,
"๋‹ค์œˆ (UTC+9.5)": 9.5,
"์• ๋“ค๋ ˆ์ด๋“œ (UTC+9.5)": 9.5,
# ์•„ํ”„๋ฆฌ์นด
"์š”ํ•˜๋„ค์Šค๋ฒ„๊ทธ, ํ•˜๋ผ๋ ˆ (UTC+2)": 2,
"๋ผ๊ณ ์Šค, ์•Œ์ œ (UTC+1)": 1,
"๋‹ค์นด๋ฅด, ์นด์‚ฌ๋ธ”๋ž‘์นด (UTC+0)": 0,
}
def convert_to_seoul_time(year, month, day, hour, minute, timezone_offset):
"""
์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€์˜ ์‹œ๊ฐ„์„ ์„œ์šธ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜
"""
from datetime import datetime, timedelta
# ์„œ์šธ๊ณผ์˜ ์‹œ์ฐจ ๊ณ„์‚ฐ (์„œ์šธ์€ UTC+9)
time_difference = 9 - int(timezone_offset)
# ์ž…๋ ฅ ์‹œ๊ฐ„ ์ƒ์„ฑ
local_time = datetime(int(year), int(month), int(day), int(hour), int(minute))
# ์‹œ์ฐจ ์ ์šฉ
seoul_time = local_time + timedelta(hours=time_difference)
return {
'year': str(seoul_time.year),
'month': f"{seoul_time.month:02d}",
'day': f"{seoul_time.day:02d}",
'hour': f"{seoul_time.hour:02d}{seoul_time.minute:02d}"
}
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
# get_lunar_info ํ•จ์ˆ˜ ์ˆ˜์ •
def get_lunar_info(solYear, solMonth, solDay, solHour, timezone_offset):
try:
# ์‹œ๊ฐ„ ํŒŒ์‹ฑ
hour = int(solHour[:2])
minute = int(solHour[2:]) if len(solHour) > 2 else 0
# ์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€์—์„œ ์„œ์šธ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜
seoul_time = convert_to_seoul_time(solYear, solMonth, solDay, hour, minute, timezone_offset)
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={seoul_time['year']}&solMonth={seoul_time['month']}&solDay={seoul_time['day']}&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(seoul_time['hour'], lunIljin)
analysis_html = ์‚ฌ์ฃผ_๋ถ„์„(lunSecha, lunWolgeon, lunIljin, siju)
# ์›๋ณธ ์‹œ๊ฐ„๊ณผ ๋ณ€ํ™˜๋œ ์„œ์šธ ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๊ฒฐ๊ณผ
result = {
"์ž…๋ ฅ ์‹œ๊ฐ„": f"{selected_timezone}: {solYear}๋…„ {solMonth}์›” {solDay}์ผ {hour:02d}์‹œ {minute:02d}๋ถ„",
"๋ณ€ํ™˜๋œ ์„œ์šธ ์‹œ๊ฐ„": f"{seoul_time['year']}๋…„ {seoul_time['month']}์›” {seoul_time['day']}์ผ {seoul_time['hour'][:2]}์‹œ {seoul_time['hour'][2:]}๋ถ„",
"๋…„์ฃผ": lunSecha,
"์›”์ฃผ": lunWolgeon,
"์ผ์ฃผ": lunIljin,
"์‹œ์ฃผ": siju
}
return result, lunIljin, analysis_html
else:
return {"Error": "API ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."}, "์ •๋ณด ์—†์Œ", "<p>API ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.</p>"
except Exception as e:
return {"Error": f"์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"}, "์ •๋ณด ์—†์Œ", "<p>์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</p>"
def analyze_character(lunIljin):
API_URL = "https://api.openai.com/v1/chat/completions"
payload = {
"model": "gpt-4",
"messages": [{
"role": "system",
"content": "๋‹น์‹ ์€ ์‚ฌ์ฃผ ํŒ”์ž์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค."
}, {
"role": "user",
"content": f"์ผ์ฃผ '{lunIljin}'์— ๋Œ€ํ•œ ์„ฑ๊ฒฉ๊ณผ ํŠน์ง•์„ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."
}],
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
try:
response = requests.post(API_URL, headers=headers, json=payload)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
def analyze_2024(lunIljin):
API_URL = "https://api.openai.com/v1/chat/completions"
payload = {
"model": "gpt-4",
"messages": [{
"role": "system",
"content": "๋‹น์‹ ์€ ์‚ฌ์ฃผ ํŒ”์ž์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค."
}, {
"role": "user",
"content": f"์ผ์ฃผ '{lunIljin}'์— ๋Œ€ํ•ด, 2025๋…„์€ '์„์‚ฌ'๋…„์ž…๋‹ˆ๋‹ค. 2025๋…„ '์„์‚ฌ'๋…„ ์‹ ๋…„์šด์„ธ์— ๋Œ€ํ•ด์„œ ์ž…๋ ฅ๋œ ์ผ์ฃผ์™€ ๊ด€๋ จํ•˜์—ฌ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”."
}],
}
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
try:
response = requests.post(API_URL, headers=headers, json=payload)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
# ์‚ฌ์ฃผ ๋ถ„์„ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ (๊ฐ„์†Œํ™”๋œ ๋ฒ„์ „)
์‚ฌ์ฃผ_๋ฐ์ดํ„ฐ = {
'๊ฐ‘์ž(็”ฒๅญ)' : '์ƒˆ๋กœ์šด ์‹œ์ž‘์˜ ์ƒ์ง•, ๋ฆฌ๋”์‹ญ๊ณผ ๋…๋ฆฝ์„ฑ์ด ํŠน์ง•์ด๋ฉฐ, ํ˜ธ์พŒํ•˜๊ณ  ์„ฑ์‹คํ•œ ํŠน์„ฑ์„ ์ง€๋‹Œ๋‹ค. ',
'์„์ถ•(ไน™ไธ‘)' : '์ธ๋‚ด์‹ฌ์ด ๋งค์šฐ ๊ฐ•ํ•˜๋ฉฐ, ๋ฌผ์งˆ์  ์„ฑ์ทจ๋ฅผ ์ค‘์š”์‹œํ•˜๊ณ  ์ž์ƒํ•œ ๋ฉด๋ชจ๋ฅผ ๊ฐ–์ถ˜ ์‚ฌ๋žŒ์ด๋‹ค. ',
'๋ณ‘์ธ(ไธ™ๅฏ…)' : '์—ด์ •์ ์ด๊ณ  ๋ชจํ—˜์„ ์ฆ๊ธฐ๋ฉฐ, ์ฐฝ์˜๋ ฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ํ˜์‹ ์ ์ธ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง„๋‹ค. ',
'์ •๋ฌ˜(ไธๅฏ)' : '์˜ˆ์ˆ ์  ๊ฐ๊ฐ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์„ฌ์„ธํ•œ ์„ฑ๊ฒฉ์œผ๋กœ, ๊ด€๊ณ„์—์„œ์˜ ์ถฉ์‹คํ•จ๊ณผ ์• ์ •์ด ๊นŠ๋‹ค. ',
'๋ฌด์ง„(ๆˆŠ่พฐ)' : '์‹ค์šฉ์ ์ด๋ฉฐ ์•ˆ์ •์ ์ธ ๊ธฐ๋ฐ˜์„ ์ค‘์‹œํ•˜๊ณ , ๊พธ์ค€ํ•œ ๋…ธ๋ ฅ์„ ํ†ตํ•ด ์„ฑ์žฅํ•˜๋Š” ํƒ€์ž…์ด๋‹ค. ',
'๊ธฐ์‚ฌ(ๅทฑๅทณ)' : '์œ ์—ฐ์„ฑ๊ณผ ์ ์‘๋ ฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ๋„ ์ž˜ ๋Œ€์ฒ˜ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง„๋‹ค. ',
'๊ฒฝ์˜ค(ๅบšๅˆ)' : '์ •์˜์™€ ๋ช…์˜ˆ๋ฅผ ์ค‘์‹œํ•˜๋ฉฐ, ์„ฑ์‹คํ•˜๊ณ  ์ง„์ทจ์ ์ธ ํƒœ๋„๋กœ ์ฃผ๋ณ€์˜ ์กด๊ฒฝ์„ ๋ฐ›๋Š”๋‹ค. ',
'์‹ ๋ฏธ(่พ›ๆœช)' : '์„ธ์‹ฌํ•˜๊ณ  ๊ผผ๊ผผํ•œ ์„ฑ๊ฒฉ์œผ๋กœ ์™„๋ฒฝ์„ ์ถ”๊ตฌํ•˜๋ฉฐ, ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์‹ ๋ขฐ๋ฅผ ์–ป๋Š”๋‹ค. ',
'์ž„์‹ (ๅฃฌ็”ณ)' : '์ง€ํ˜œ์™€ ๊ท ํ˜•์ด ์ž˜ ์กฐํ™”๋œ ์„ฑ๊ฒฉ์œผ๋กœ, ๊นŠ์€ ํ†ต์ฐฐ๋ ฅ๊ณผ ํ•จ๊ป˜ ์ธ์ƒ์„ ์ดํ•ดํ•˜๋Š” ๋Šฅ๋ ฅ์ด ์žˆ๋‹ค. ',
'๊ณ„์œ (็™ธ้…‰)' : '์™ธ๊ต์ ์ด๊ณ  ์กฐํ™”๋ฅผ ์ค‘์‹œํ•˜๋Š” ์„ฑํ–ฅ์œผ๋กœ, ํƒ€์ธ๊ณผ์˜ ๊ด€๊ณ„์—์„œ ์œ ์—ฐํ•˜๊ณ  ๋‹ค์ •๋‹ค๊ฐํ•˜๋‹ค. ',
'๊ฐ‘์ˆ (็”ฒๆˆŒ)' : '๋ฏธ์†Œ๋ฅผ ๋ ๋ฉฐ ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ž˜ํ•˜๊ณ , ํƒ€๊ณ ๋‚œ ์˜์—… ๋Šฅ๋ ฅ์œผ๋กœ ์„ฑ๊ณต์„ ์ด๋ˆ๋‹ค. ',
'์„ํ•ด(ไน™ไบฅ)' : '์‹œ์›์‹œ์›ํ•œ ์ธ์ƒ๊ณผ ๋ชจ๋ฒ”์ƒ ๊ฐ™์€ ์Šคํƒ€์ผ๋กœ, ๋Šฅ๋ ฅ๊ณผ ์š•์‹ฌ์„ ๊ฒธ๋น„ํ•œ ์‚ฌ๋žŒ์ด๋‹ค. ',
'๋ณ‘์ž(ไธ™ๅญ)' : 'ํ˜ธ๋ฐฉํ•˜๊ณ  ๊นŒ๋‹ค๋กญ์ง€๋งŒ, ์ผ์„ ํ™•์‹คํžˆ ์ฒ˜๋ฆฌํ•˜๊ณ  ์€๊ทผํ•œ ๋งค๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ',
'์ •์ถ•(ไธไธ‘)' : '์˜ˆ์ˆ ์  ๊ฐ๊ฐ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ๋”ฐ๋œปํ•˜๊ณ  ๋ฒ ํ’€ ์ค„ ์•„๋Š” ์ธ๊ฐ„๋ฏธ ๋„˜์น˜๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ',
'๋ฌด์ธ(ๆˆŠๅฏ…)' : '๋ชจํ—˜์„ ์ฆ๊ธฐ๊ณ  ์ž์‹ ๊ฐ์ด ๋„˜์น˜๋ฉฐ, ์„ธ์ƒ์„ ๋ฐœ์•„๋ž˜ ๋‘๊ณ  ์‹ถ์–ดํ•˜๋Š” ์•ผ์‹ฌ ์ฐฌ ์‚ฌ๋žŒ์ด๋‹ค. ',
'๊ธฐ๋ฌ˜(ๅทฑๅฏ)' : '์„ธ์‹ฌํ•˜๊ณ  ์˜ˆ์ˆ ์ ์ธ ๊ธฐ์งˆ์ด ์žˆ์œผ๋ฉฐ, ๊นŠ์€ ์ƒ๊ฐ๊ณผ ํ•จ๊ป˜ ์‚ฌ๋žŒ๋“ค๊ณผ ์กฐํ™”๋กญ๊ฒŒ ์ง€๋‚ธ๋‹ค. ',
'๊ฒฝ์ง„(ๅบš่พฐ)' : '์•ˆ์ •์ ์ด๊ณ  ํ•ดํ•™์ ์ธ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง€๋ฉฐ, ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค๊ณผ์˜ ์กฐํ™”๋ฅผ ์ค‘์‹œํ•œ๋‹ค. ',
'์‹ ์‚ฌ(่พ›ๅทณ)' : '๋ฉ‹๊ณผ ๋งค๋ ฅ์„ ์‚ถ์˜ ์ค‘์‹ฌ์— ๋‘๋ฉฐ, ๊ฐ•ํ•œ ์‚ฌํšŒ์  ๋Šฅ๋ ฅ์„ ์ง€๋‹Œ ์‚ฌ๋žŒ์ด๋‹ค. ',
'์ž„์˜ค(ๅฃฌๅˆ)' : '์ง€์  ๋Šฅ๋ ฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์‹ฌ์˜คํ•œ ์ƒ๊ฐ์„ ํ•˜๋Š”, ๊นŠ์ด ์žˆ๋Š” ์ธ๋ฌผ์ด๋‹ค. ',
'๊ณ„๋ฏธ(็™ธๆœช)' : '์ž์‹ ๊ณผ ํƒ€์ธ์—๊ฒŒ ์นœ์ ˆํ•˜๊ณ  ๊ท€์—ฌ์šด ๋ฉด๋ชจ๋ฅผ ์ง€๋‹Œ ์‚ฌ๋žŒ์œผ๋กœ, ์‚ฌํšŒ์  ์ƒํ˜ธ์ž‘์šฉ์—์„œ ๋”ฐ์Šคํ•จ๊ณผ ๋ฐฐ๋ ค๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ž์‹ ์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ž˜ ๋งž์ถฐ์ฃผ๋ฉฐ, ํ™”ํ•ฉ์„ ์ค‘์š”์‹œํ•œ๋‹ค. ',
'๊ฐ‘์‹ (็”ฒ็”ณ)' : '๋‚ด๋ฉด์ด ๋ณ€ํ™”๋ฌด์Œํ•˜๋‚˜ ๊ฒ‰์œผ๋กœ๋Š” ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š๊ณ , ๊ฐ•์ธํ•œ ๋ฉด๋ชจ๋กœ ์–ด๋ ค์›€์„ ๊ทน๋ณตํ•œ๋‹ค.',
'์„์œ (ไน™้…‰)' : 'ํƒ€์ธ์˜ ๋น„๋ฐ€์„ ์ž˜ ์ง€์ผœ์ฃผ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์œผ๋กœ, ์ง‘์ค‘๋ ฅ๊ณผ ์ƒํ™œ๋ ฅ์ด ๊ฐ•ํ•˜๋‹ค. ',
'๋ณ‘์ˆ (ไธ™ๆˆŒ)' : '๊ด€๋Œ€ํ•˜๋ฉด์„œ๋„ ์„ธ์„ธํ•œ ๋ถ€๋ถ„์— ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ƒํ™œ๋ ฅ์ด ๊ฐ•ํ•˜๊ณ  ํ˜„๋ช…ํ•˜๋‹ค. ',
'์ •ํ•ด(ไธไบฅ)' : 'ํฌ์šฉ๋ ฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์‚ถ์— ๋Œ€ํ•œ ์• ์ฐฉ์ด ๊ฐ•ํ•˜๋ฉฐ, ์ง„์‹ฌ์œผ๋กœ ์ฃผ๋ณ€์„ ์ฑ™๊ธด๋‹ค. ',
'๋ฌด์ž(ๆˆŠๅญ)' : '์‹ ๋น„๋กœ์šด ๋ถ„์œ„๊ธฐ์™€ ์žฌ๋ฌผ์„ ์ค‘์‹œํ•˜๋Š” ์„ฑํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์†๋‚ด๋ฅผ ์ž˜ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š๋Š”๋‹ค. ',
'๊ธฐ์ถ•(ๅทฑไธ‘)' : '๊ฐ•์ธํ•œ ๋‚ด๋ฉด์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ž์‹ ๋งŒ์˜ ๊ธธ์„ ๊ฑธ์–ด๊ฐ€๋Š” ํ™•๊ณ ํ•œ ์‹ ๋…์„ ์ง€๋‹Œ๋‹ค. ',
'๊ฒฝ์ธ(ๅบšๅฏ…)' : 'ํฐ ํฌ๋ถ€์™€ ๊ตญ์ œ์ ์ธ ํ™œ๋™์„ ์ถ”๊ตฌํ•˜๋ฉฐ, ์‚ฌ์—…์—์„œ ํฐ ์„ฑ๊ณต์„ ๊ฟˆ๊พธ๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ',
'์‹ ๋ฌ˜(่พ›ๅฏ)' : '๊น๊นํ•˜๊ณ  ๋‚ ์นด๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งˆ์Œ์ด ์ฐฉํ•œ ์‚ฌ๋žŒ์ด๋‹ค. ',
'์ž„์ง„(ๅฃฌ่พฐ)' : '์ธ๋‚ด์‹ฌ์ด ๊ฐ•ํ•˜๊ณ , ํ•œ ๋ฒˆ ๋งˆ์Œ๋จน์€ ์ผ์€ ๋๊นŒ์ง€ ๋ฐ€๊ณ  ๋‚˜๊ฐ€๋Š” ๊ฐ•์ธํ•œ ์˜์ง€์˜ ์‚ฌ๋žŒ์ด๋‹ค. ',
'๊ณ„์‚ฌ(็™ธๅทณ)' : '์ ์ ˆํ•œ ํƒ€์ด๋ฐ๊ณผ ์ƒํ™ฉ ํŒ๋‹จ๋ ฅ์œผ๋กœ ๋ˆˆ์— ๋„๋Š” ์„ฑ์ทจ๋ฅผ ์ด๋ฃจ๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ๋˜‘๋˜‘ํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๋Š” ์ตœ์„ ์˜ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ค„ ์•Œ๋ฉฐ, ์‚ถ์—์„œ์˜ ์—ฌ๋Ÿฌ ๊ธฐํšŒ๋ฅผ ์ž˜ ์‚ด๋ฆฐ๋‹ค. ',
'๊ฐ‘์˜ค(็”ฒๅˆ)' : '์กฐ๊ธˆ ์กฐ๊ธ‰ํ•˜๊ณ  ์‹ค์ˆ˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ญ๋งŒ์ ์ด๊ณ  ์พŒํ™œํ•˜์—ฌ ์ฃผ๋ณ€์„ ๋ฐ๊ฒŒ ๋งŒ๋“ ๋‹ค.',
'์„๋ฏธ(ไน™ๆœช)' : '์• ์ •์ด ๋งŽ๊ณ  ๋ˆ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋ช…ํ™•ํ•œ ์ฃผ๊ด€๊ณผ ํ•จ๊ป˜ ์‚ฌ๋ฌผ์˜ ์ด์น˜๋ฅผ ์ž˜ ํŒŒ์•…ํ•œ๋‹ค. ',
'๋ณ‘์‹ (ไธ™็”ณ)' : '์„ธ๋ จ๋˜๊ณ  ๋ง›๊ณผ ๋ฉ‹์„ ์ถ”๊ตฌํ•˜๋ฉฐ, ์‚ฌ๊ต์ ์ด๋ฉด์„œ๋„ ๋‚ด๋ฉด์˜ ๊ฐˆ๋“ฑ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด๋‹ค. ',
'์ •์œ (ไธ้…‰)' : '๊ฐ๊ฐ์ ์ด๊ณ  ์žฌ์น˜ ์žˆ๋Š” ์„ฑ๊ฒฉ์œผ๋กœ, ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฆ๊ฑฐ์›€์„ ์ฃผ๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ',
'๋ฌด์ˆ (ๆˆŠๆˆŒ)' : '์‹ค์†์„ ์ค‘์‹œํ•˜๊ณ  ์†Œ๋ฐ•ํ•œ ์‚ถ์„ ์ถ”๊ตฌํ•˜๋ฉฐ, ๋‹ด๋ฐฑํ•œ ๋งค๋ ฅ์„ ๊ฐ€์ง„ ์‹ค๋ฆฌ์ฃผ์˜์ž์ด๋‹ค. ',
'๊ธฐํ•ด(ๅทฑไบฅ)' : '์˜จํ™”ํ•˜๊ณ  ๋ช…๋ž‘ํ•˜๋ฉฐ, ์˜์ง€๊ฐ€ ๊ตณ๊ฑดํ•˜๋‚˜ ๋•Œ๋กœ๋Š” ๋ง์„ค์ด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค. ',
'๊ฒฝ์ž(ๅบšๅญ)' : '์ฐจ๋ถ„ํ•˜๊ณ  ๊ฒฐ๋‹จ๋ ฅ์ด ์žˆ๋Š” ๋ฐ˜๋ฉด, ์ผ์˜ ์žฅ๋‹จ์ ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ํŒ๋‹จํ•˜๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ',
'์‹ ์ถ•(่พ›ไธ‘)' : '๊ฒธ์†ํ•จ๊ณผ ํ•จ๊ป˜ ํƒ€์ธ์„ ์ž˜ ํŒ๋‹จํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง„, ์ธ๊ฐ„ ๊ด€๊ณ„์—์„œ์˜ ์กฐ์œจ์ž์ด๋‹ค. ',
'์ž„์ธ(ๅฃฌๅฏ…)' : '์•ˆ์ •๊ฐ์„ ์ถ”๊ตฌํ•˜๋ฉฐ, ์ฆ๊ฑฐ์›€๊ณผ ์žฌ๋ฏธ๋ฅผ ์ค‘์š”์‹œํ•˜๋Š” ํŽธ์•ˆํ•œ ์„ฑ๊ฒฉ์˜ ์†Œ์œ ์ž์ด๋‹ค. ',
'๊ณ„๋ฌ˜(็™ธๅฏ)' : '์นœ์ ˆํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ž˜ ๋งž์ถฐ์ฃผ๋Š” ์„ฑ๊ฒฉ์œผ๋กœ, ๋Œ€๋‹จํžˆ ์ฐฉํ•˜๊ณ  ์ƒ๋Œ€๋ฐฉ์„ ํŽธ์•ˆํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋Šฅ๋ ฅ์ด ์žˆ๋‹ค. ๊ทธ์˜ ์กด์žฌ๋งŒ์œผ๋กœ๋„ ์ฃผ๋ณ€์— ๊ธ์ •์ ์ธ ๋ถ„์œ„๊ธฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ',
'๊ฐ‘์ง„(็”ฒ่พฐ)' : 'ํ˜ธ์พŒํ•œ ์„ฑ๊ฒฉ ์„ฑ์‹คํ•˜๋ฉด์„œ ์• ๊ต๋Š” ์—†๋Š” ๋ฌด๋š๋šํ•œ ์ƒ๋‚จ์ž ์ƒ์—ฌ์ž ',
'์„์‚ฌ(ไน™ๅทณ)' : '์‚ฌ๋žŒ์„ ๋Œ์–ด๋‹น๊ธฐ๋Š” ๋งค๋ ฅ์ด ๋„˜์น˜๊ณ , ์–ด๋””์„œ๋‚˜ ๋ฐ์€ ์—๋„ˆ์ง€๋ฅผ ๋ฐœ์‚ฐํ•œ๋‹ค. ๋‹ค์žฌ๋‹ค๋Šฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์‚ฌ๊ณ ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ƒˆ๋กœ์šด ๋งŒ๋‚จ๊ณผ ๊ฒฝํ—˜์—์„œ ์ฆ๊ฑฐ์›€์„ ์ฐพ๋Š”๋‹ค. ',
'๋ณ‘์˜ค(ไธ™ๅˆ)' : '์—ด์ •์ ์ด๊ณ  ์ €๋Œ์ ์ธ ์„ฑ๊ฒฉ์œผ๋กœ ์ฃผ๋ณ€์„ ์ด๋„๋Š” ๋ฆฌ๋”์‹ญ๊ณผ ์†”์„ ์ˆ˜๋ฒ”ํ•˜๋Š” ํƒœ๋„๋ฅผ ์ง€๋‹Œ๋‹ค. ',
'์ •๋ฏธ(ไธๆœช)' : '๋ถ€๋“œ๋Ÿฝ๊ณ  ์ž์ƒํ•˜๋ฉฐ ์—ด์ •์ ์ธ ์„ฑ๊ฒฉ์œผ๋กœ, ๋‹ค์–‘ํ•œ ์‚ฌ๋žŒ๋“ค๊ณผ ์ž˜ ์–ด์šธ๋ฆฐ๋‹ค. ',
'๋ฌด์‹ (ๆˆŠ็”ณ)' : '๋”ฐ๋œปํ•œ์‚ฌ๋žŒ์„ ๋Œ์–ด๋‹น๊ธฐ๋Š” ๋งค๋ ฅ์ด ๋„˜์น˜๊ณ , ์–ด๋””์„œ๋‚˜ ๋ฐ์€ ์—๋„ˆ์ง€๋ฅผ ๋ฐœ์‚ฐํ•œ๋‹ค. ๋‹ค์žฌ๋‹ค๋Šฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์‚ฌ๊ณ ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ƒˆ๋กœ์šด ๋งŒ๋‚จ๊ณผ ๊ฒฝํ—˜์—์„œ ์ฆ๊ฑฐ์›€์„ ์ฐพ๋Š”๋‹ค. ๋งˆ์Œ๊ณผ ์„ฌ์„ธํ•œ ๊ฐ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋„“์€ ํฌ์šฉ๋ ฅ์œผ๋กœ ์ฃผ๋ณ€์„ ๊ฐ์‹ผ๋‹ค. ',
'๊ธฐ์œ (ๅทฑ้…‰)' : '๋Œ€๋‹ดํ•˜๊ณ  ์‚ถ์— ๋Œ€ํ•œ ์—ด์ •์ด ๋„˜์น˜์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์šฐ์œ ๋ถ€๋‹จํ•œ ๋ชจ์Šต์„ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ',
'๊ฒฝ์ˆ (ๅบšๆˆŒ)' : '๋ƒ‰์ •ํ•˜๊ณ  ์‹ ์‚ฌ์ ์ธ ํƒœ๋„๋กœ ํƒ€์ธ์„ ๋•๋Š” ๊ฒƒ์„ ์ฆ๊ธฐ๋ฉฐ, ๋•Œ๋กœ๋Š” ๊นŒํƒˆ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค. ',
'์‹ ํ•ด(่พ›ไบฅ)' : '์ž์กด์‹ฌ์ด ๊ฐ•ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ทจํ–ฅ์„ ๊ฐ€์ง€๋ฉฐ, ๋‚ญ๋งŒ์ ์ธ ๊ฐ์„ฑ์„ ์†Œ์œ ํ•œ ์‚ฌ๋žŒ์ด๋‹ค. ',
'์ž„์ž(ๅฃฌๅญ)' : '์กฐ์šฉํ•˜์ง€๋งŒ, ๋งค๋ ฅ์ ์ด๊ณ  ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ•ํ•œ ๋ฉด๋ชจ๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์‹ ๋น„ํ•œ ์ธ๋ฌผ์ด๋‹ค. ',
'๊ณ„์ถ•(็™ธไธ‘)' : '๊ฒ‰๋ณด๊ธฐ์—” ์ฐจ๋ถ„ํ•˜์ง€๋งŒ ๋‚ด๋ฉด์—๋Š” ๊ฐ•ํ•œ ์˜์ง€์™€ ์‹ ๋…์„ ์ง€๋‹Œ ์‚ฌ๋žŒ์œผ๋กœ, ์ •๋ง ์‚ฌ๋žŒ์ด ์ข‹๋‹ค๋Š” ๋Š๋‚Œ์„ ์ฃผ๋Š” ๋”ฐ๋œปํ•จ๊ณผ ๊ท ํ˜• ์žกํžŒ ์„ฑ๊ฒฉ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฏฟ์Œ์ง์Šค๋Ÿฌ์šด ์กด์žฌ๋‹ค. ',
'๊ฐ‘์ธ(็”ฒๅฏ…)' : '๋ฆฌ๋”์‹ญ์ด ์žˆ๊ณ  ์„ฑ์ •์ด ๋ฐ”๋ฅด๊ณ  ํ˜ธ๋ฐฉํ•˜๋‹ค. ์กฐ์ง์— ์ˆœ์‘์ ์ธ ์‚ฌ๋žŒ์ด๋‹ค.',
'์„๋ฌ˜(ไน™ๅฏ)' : '๋‚ด๋ฉด์˜ ๊ฐ•์ธํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ๊ต์„ฑ์œผ๋กœ ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค๊ณผ ์‰ฝ๊ฒŒ ์–ด์šธ๋ฆฐ๋‹ค. ์ง์„ ์ ์ธ ์†Œํ†ต ๋ฐฉ์‹ ๋’ค์—๋Š” ์Šค๋ฉฐ๋“œ๋Š” ์˜ํ–ฅ๋ ฅ์ด ์žˆ์–ด, ๋งŽ์€ ์ด๋“ค์—๊ฒŒ ๊ธ์ •์ ์ธ ์—๋„ˆ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ',
'๋ณ‘์ง„(ไธ™่พฐ)' : '๊น”๋”ํ•˜๊ณ  ๋‹จ์ •ํ•œ ์™ธ๋ชจ์— ๋„๋•์ ์ด๋ฉฐ, ์ƒํ™ฉ์„ ๊ต๋ฌ˜ํ•˜๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง„๋‹ค. ',
'์ •์‚ฌ(ไธๅทณ)' : '๊ฒฝ์Ÿ์„ ์ฆ๊ธฐ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์••๋„ํ•˜๋ ค๋Š” ๊ฐ•ํ•œ ์˜์ง€์™€ ์‚ฌ๊ต์ ์ธ ๋Šฅ๋ ฅ์„ ๊ฐ€์กŒ๋‹ค. ',
'๋ฌด์˜ค(ๆˆŠๅˆ)' : '๊ฒฐ์ฝ” ๊ตดํ•˜์ง€ ์•Š๋Š” ์ •์‹ ๋ ฅ๊ณผ ์‚ฌ์—…์—์„œ์˜ ์„ฑ๊ณต์„ ๊ฟˆ๊พธ๋Š”, ์•ผ๋ง ์žˆ๋Š” ์‚ฌ๋žŒ์ด๋‹ค. ',
'๊ธฐ๋ฏธ(ๅทฑๆœช)' : '๋ด‰์‚ฌ์ •์‹ ์ด ํˆฌ์ฒ ํ•˜๊ณ  ๊ณต๋™์ฒด ์˜์‹์ด ๊ฐ•ํ•˜๋ฉฐ, ๊ณต์ต์„ ์œ„ํ•ด ์ ๊ทน์ ์œผ๋กœ ๊ธฐ์—ฌํ•œ๋‹ค. ',
'๊ฒฝ์‹ (ๅบš็”ณ)' : 'ํ™œ๋™์ ์ด๊ณ  ๋ฐ–์œผ๋กœ์˜ ํ™œ๋™์„ ์ฆ๊ธฐ๋ฉฐ, ์ƒˆ๋กœ์šด ๊ฒƒ์— ๋„์ „ํ•˜๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜์ง€ ์•Š๋Š”๋‹ค. ',
'์‹ ์œ (่พ›้…‰)' : '๊ณ ์ƒํ•˜๊ณ  ํƒ€์ธ์„ ์œ„ํ•˜๋Š” ๋งˆ์Œ์ด ๊ฐ•ํ•˜์ง€๋งŒ, ๊ฐ์ •์ด ๊ฒฉํ•ด์งˆ ๋•Œ๋Š” ์ƒ๋‹นํžˆ ๋ฌด์„œ์šธ ์ˆ˜ ์žˆ๋‹ค. ',
'์ž„์ˆ (ๅฃฌๆˆŒ)' : '๊ณ ์ง‘์ด ์žˆ์ง€๋งŒ ๊ฐ€์กฑ๊ณผ ํƒ€์ธ์„ ์œ„ํ•ด ํ—Œ์‹ ์ ์œผ๋กœ ๋…ธ๋ ฅํ•˜๋Š” ๊ฐ•ํ•œ ๋ฉด๋ชจ๋ฅผ ์ง€๋‹Œ๋‹ค. ',
'๊ณ„ํ•ด(็™ธไบฅ)' : '๊ทธ์ € ๋น ์ ธ๋“ค๊ฒŒ ๋งŒ๋“œ๋Š” ๊นŠ์€ ๋‚ด๋ฉด์˜ ๋งค๋ ฅ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์œผ๋กœ, ์˜์™ธ์˜ ๊นŠ์€ ์ƒ๊ฐ๊ณผ ๊ฐ์„ฑ์„ ์ง€๋‹ˆ๊ณ  ์žˆ๋‹ค. ์ž์‹ ๋งŒ์˜ ์„ธ๊ณ„๊ฐ€ ํ’๋ถ€ํ•ด ํƒ€์ธ๊ณผ์˜ ๊ต๋ฅ˜์—์„œ๋„ ๋…ํŠนํ•œ ๊ด€์ ์„ ์ œ๊ณตํ•œ๋‹ค. ',
}
def ์‚ฌ์ฃผ_๋ถ„์„(๋…„์ฃผ, ์›”์ฃผ, ์ผ์ฃผ, ์‹œ์ฃผ):
html_result = f"""
<div class="analysis-result">
<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
css = """
footer { visibility: hidden; }
/* ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ */
.container {
background: linear-gradient(135deg, #6e8efb, #a777e3);
border-radius: 15px;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
backdrop-filter: blur(4px);
border: 1px solid rgba(255, 255, 255, 0.18);
padding: 20px;
margin: 10px;
}
/* ๋ฒ„ํŠผ ์Šคํƒ€์ผ */
button {
background: linear-gradient(135deg, #FF6B6B, #FF8E53);
border: none;
color: white;
padding: 12px 24px;
text-align: center;
font-size: 16px;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s ease;
font-weight: bold;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
background: linear-gradient(135deg, #FF8E53, #FF6B6B);
}
/* ์ž…๋ ฅ ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ */
.input-container {
background: rgba(255, 255, 255, 0.95);
border-radius: 10px;
padding: 20px;
margin: 10px 0;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.input-container:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15);
}
/* ์ถœ๋ ฅ ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ */
.output-container {
background: linear-gradient(135deg, #f6f9fc, #eef2f7);
border-radius: 10px;
padding: 20px;
margin: 10px 0;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
/* ์‹œ๊ฐ„๋Œ€ ๋“œ๋กญ๋‹ค์šด ์Šคํƒ€์ผ */
.timezone-dropdown {
background: linear-gradient(135deg, #ffffff, #f8f9fa);
border-radius: 10px;
padding: 15px;
margin: 15px 0;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
border: 1px solid rgba(110, 142, 251, 0.2);
transition: all 0.3s ease;
}
.timezone-dropdown:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15);
}
.timezone-dropdown select {
width: 100%;
padding: 12px;
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.1);
font-size: 14px;
color: #2d3748;
background-color: white;
}
.timezone-info {
background: linear-gradient(135deg, rgba(110, 142, 251, 0.1), rgba(167, 119, 227, 0.1));
border-radius: 10px;
padding: 15px;
margin: 15px 0;
font-size: 14px;
color: #4a5568;
border-left: 4px solid #6e8efb;
line-height: 1.8;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.timezone-info b {
color: #2d3748;
}
/* ๋ถ„์„ ๊ฒฐ๊ณผ ์Šคํƒ€์ผ */
.analysis-result {
background: white;
border-radius: 15px;
padding: 25px;
margin: 20px 0;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
}
.analysis-result:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
}
/* ํฐ ์ถœ๋ ฅ ๋ฐ•์Šค ์Šคํƒ€์ผ */
.large-output-box {
height: 500px !important;
font-size: 16px !important;
padding: 25px !important;
background: linear-gradient(135deg, #f6f9fc, #eef2f7);
border-radius: 15px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
margin: 20px 0;
overflow-y: auto;
line-height: 1.8;
white-space: pre-wrap;
transition: all 0.3s ease;
}
.large-output-box:hover {
transform: translateY(-2px);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
}
/* ํƒญ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
.tab-nav {
background: rgba(255, 255, 255, 0.9);
border-radius: 15px;
padding: 15px;
margin-bottom: 25px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
}
/* ๋งˆํฌ๋‹ค์šด ํ…์ŠคํŠธ ์Šคํƒ€์ผ */
.markdown {
text-align: center;
color: #2d3748;
text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
font-weight: 500;
margin: 20px 0;
}
/* ์‹ ๋…„์šด์„ธ ํŠน๋ณ„ ์Šคํƒ€์ผ */
.newyear-container {
background: linear-gradient(135deg, #ffd1d1, #ffecd1);
padding: 35px;
border-radius: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
margin: 25px 0;
transition: all 0.3s ease;
}
.newyear-container:hover {
transform: translateY(-2px);
box-shadow: 0 15px 50px rgba(0, 0, 0, 0.15);
}
.newyear-title {
font-size: 26px;
color: #2d3748;
text-align: center;
margin-bottom: 25px;
text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
font-weight: bold;
}
/* ํƒญ ์ปจํ…์ธ  ์Šคํƒ€์ผ */
.tab-content {
min-height: 600px;
padding: 25px;
background: rgba(255, 255, 255, 0.02);
border-radius: 15px;
backdrop-filter: blur(10px);
}
/* ์ž…๋ ฅ ํ•„๋“œ ์Šคํƒ€์ผ */
input, select, textarea {
border-radius: 8px !important;
border: 1px solid rgba(0, 0, 0, 0.1) !important;
padding: 12px !important;
transition: all 0.3s ease !important;
}
input:focus, select:focus, textarea:focus {
border-color: #6e8efb !important;
box-shadow: 0 0 0 2px rgba(110, 142, 251, 0.2) !important;
transform: translateY(-1px);
}
/* ๋“œ๋กญ๋‹ค์šด ์˜ต์…˜ ์Šคํƒ€์ผ */
select option {
padding: 12px;
font-size: 14px;
background-color: white;
color: #2d3748;
}
select option:hover {
background-color: #f7fafc;
}
/* ์Šคํฌ๋กค๋ฐ” ์Šคํƒ€์ผ */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #6e8efb, #a777e3);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, #a777e3, #6e8efb);
}
/* ๋“œ๋กญ๋‹ค์šด ํ™”์‚ดํ‘œ ์Šคํƒ€์ผ */
select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
background-repeat: no-repeat;
background-position: right 1rem center;
background-size: 1em;
}
/* ํ˜ธ๋ฒ„ ํšจ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜ */
@keyframes float {
0% {
transform: translateY(0px);
}
50% {
transform: translateY(-5px);
}
100% {
transform: translateY(0px);
}
}
.input-container:hover,
.timezone-dropdown:hover,
.large-output-box:hover,
.newyear-container:hover {
animation: float 2s ease-in-out infinite;
}
"""
# Gradio UI ๋ถ€๋ถ„
with gr.Blocks(css=css) as demo:
gr.Markdown("# ๐Ÿ”ฎ AI ์‚ฌ์ฃผ ์šด์„ธ ๋ถ„์„ ์‹œ์Šคํ…œ โœจ", elem_id="title")
gr.Markdown("### ๐ŸŒŸ ์–‘๋ ฅ ์ƒ๋…„์›”์ผ์‹œ์™€ ์ถœ์ƒ ์ง€์—ญ์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด AI๊ฐ€ ๋‹น์‹ ์˜ ์šด์„ธ๋ฅผ ๋ถ„์„ํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ’ซ", elem_id="description1")
gr.Markdown("### ๐Ÿ’ซ ์ปค๋ฎค๋‹ˆํ‹ฐ: https://discord.gg/openfreeai ๐ŸŒˆ", elem_id="description3")
with gr.Tab("๐Ÿ“ ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ ๋ฐ ์š”์•ฝ"):
with gr.Group(elem_classes="input-container"):
solYear = gr.Textbox(label="๐ŸŽ‚ ์ƒ๋…„ (์˜ˆ: 1990)")
solMonth = gr.Textbox(label="๐Ÿ“… ์ƒ์›” (์˜ˆ: 01)")
solDay = gr.Textbox(label="๐Ÿ“† ์ƒ์ผ (์˜ˆ: 31)")
solHour = gr.Textbox(
label="โฐ ์ƒ์‹œ (์˜ˆ: 1030)",
placeholder="24์‹œ๊ฐ„ ํ˜•์‹์œผ๋กœ ์ž…๋ ฅ (์˜ˆ: 2230)"
)
timezone_select = gr.Dropdown(
choices=sorted(list(TIMEZONE_CITIES.keys())), # ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌ
value="์„œ์šธ, ๋„์ฟ„, ํ‰์–‘ (UTC+9)",
label="๐ŸŒ ์ถœ์ƒ ์ง€์—ญ ์‹œ๊ฐ„๋Œ€",
info="์ถœ์ƒ ์ง€์—ญ์˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ•˜์„ธ์š”. ๊ธฐ๋ณธ๊ฐ’์€ ์„œ์šธ(UTC+9) ์ž…๋‹ˆ๋‹ค.",
elem_classes="timezone-dropdown"
)
gr.Markdown(
"""
<div class="timezone-info">
โ„น๏ธ <b>์‹œ๊ฐ„๋Œ€ ์ •๋ณด</b>
<br>โ€ข ์„ ํƒํ•œ ์‹œ๊ฐ„๋Œ€๋Š” ์ž๋™์œผ๋กœ ์„œ์šธ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
<br>โ€ข ์˜ˆ์‹œ: ๋‰ด์š• 1์›” 1์ผ ์˜คํ›„ 2์‹œ โ†’ ์„œ์šธ ๊ธฐ์ค€ 1์›” 2์ผ ์˜ค์ „ 4์‹œ
<br>โ€ข ์ •ํ™•ํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ชจ๋ฅด์‹œ๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋Œ€๋„์‹œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.
</div>
""",
elem_classes="timezone-info"
)
with gr.Group(elem_classes="output-container"):
output1 = gr.JSON(label="๐ŸŽฏ ์‚ฌ์ฃผ ๋ถ„์„ ๊ฒฐ๊ณผ")
analysis_result = gr.HTML()
lunIljin_state = gr.State()
get_lunar_info_btn = gr.Button("โœจ ์šด์„ธ ๋ถ„์„ํ•˜๊ธฐ")
with gr.Tab("๐Ÿง ์„ฑ๊ฒฉ๊ณผ ํŠน์ง• ๋ถ„์„"):
with gr.Group(elem_classes="output-container"):
character_output = gr.Textbox(
label="๐ŸŽญ ๋‹น์‹ ์˜ ์„ฑ๊ฒฉ๊ณผ ํŠน์ง•",
elem_classes="large-output-box",
lines=15,
max_lines=30
)
analyze_button = gr.Button("๐Ÿ” ์„ฑ๊ฒฉ ๋ถ„์„ํ•˜๊ธฐ")
with gr.Tab("๐ŸŽŠ 2025๋…„ ์šด์„ธ"):
with gr.Group(elem_classes="newyear-container"):
gr.Markdown("### ๐ŸŒŸ 2025๋…„ ์„์‚ฌ๋…„ ์‹ ๋…„์šด์„ธ ๐ŸŒŸ", elem_classes="newyear-title")
newyear_output = gr.Textbox(
label="๐ŸŽ‰ ์ƒ์„ธ ์šด์„ธ ๋ถ„์„",
elem_classes="large-output-box",
lines=20,
max_lines=30,
show_label=True,
placeholder="์šด์„ธ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค..."
)
analyze_button2 = gr.Button("๐ŸŽฏ 2025๋…„ ์šด์„ธ ๋ณด๊ธฐ", size="large")
# ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •
get_lunar_info_btn.click(
fn=get_lunar_info,
inputs=[solYear, solMonth, solDay, solHour, timezone_select], # timezone_slider๋ฅผ timezone_select๋กœ ์ˆ˜์ •
outputs=[output1, lunIljin_state, analysis_result]
)
analyze_button.click(
fn=analyze_character,
inputs=[lunIljin_state],
outputs=character_output
)
analyze_button2.click(
fn=analyze_2024,
inputs=[lunIljin_state],
outputs=newyear_output
)
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
demo.launch()