openfree commited on
Commit
1f4da24
ยท
verified ยท
1 Parent(s): f579b9d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +1 -759
app.py CHANGED
@@ -1,760 +1,2 @@
1
- import gradio as gr
2
- import requests
3
- from xml.etree import ElementTree
4
  import os
5
- import sys
6
- import json
7
- from datetime import datetime, timedelta # ์ˆ˜์ •๋œ ๋ถ€๋ถ„
8
- import pytz
9
- from zoneinfo import ZoneInfo
10
-
11
- # OpenAI API ํ‚ค๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ
12
- API_KEY = os.getenv("API_KEY")
13
-
14
- TIMEZONE_CITIES = {
15
- # ์•„์‹œ์•„/์˜ค์„ธ์•„๋‹ˆ์•„ (UTC+12 ~ UTC+9)
16
- "์˜คํด๋žœ๋“œ, ์›ฐ๋งํ„ด (UTC+12)": 12,
17
- "์‹œ๋“œ๋‹ˆ, ๋ฉœ๋ฒ„๋ฅธ, ์บ”๋ฒ„๋ผ (UTC+10)": 10,
18
- "๋‹ค์œˆ, ์• ๋“ค๋ ˆ์ด๋“œ (UTC+9.5)": 9.5,
19
- "์„œ์šธ, ๋„์ฟ„, ํ‰์–‘ (UTC+9)": 9,
20
- "๋ฒ ์ด์ง•, ํ™์ฝฉ, ์‹ฑ๊ฐ€ํฌ๋ฅด, ํƒ€์ดํŽ˜์ด (UTC+8)": 8,
21
- "๋ฐฉ์ฝ•, ์ž์นด๋ฅดํƒ€, ํ•˜๋…ธ์ด (UTC+7)": 7,
22
- "์–‘๊ณค (UTC+6.5)": 6.5,
23
- "๋‹ค์นด, ์•Œ๋งˆํ‹ฐ (UTC+6)": 6,
24
- "๋‰ด๋ธ๋ฆฌ, ๋ญ„๋ฐ”์ด, ์ฝœ๋กฌ๋ณด (UTC+5.5)": 5.5,
25
- "ํƒ€์Šˆ์ผ„ํŠธ, ์นด๋ผ์น˜ (UTC+5)": 5,
26
- "์นด๋ถˆ (UTC+4.5)": 4.5,
27
- "๋‘๋ฐ”์ด, ์•„๋ถ€๋‹ค๋น„ (UTC+4)": 4,
28
- "ํ…Œํ—ค๋ž€ (UTC+3.5)": 3.5,
29
- "๋ชจ์Šคํฌ๋ฐ”, ์ด์Šคํƒ„๋ถˆ (UTC+3)": 3,
30
-
31
- # ์œ ๋Ÿฝ/์•„ํ”„๋ฆฌ์นด (UTC+2 ~ UTC-0)
32
- "์•„ํ…Œ๋„ค, ์นด์ด๋กœ, ์š”ํ•˜๋„ค์Šค๋ฒ„๊ทธ (UTC+2)": 2,
33
- "ํŒŒ๋ฆฌ, ๋กœ๋งˆ, ๋ฒ ๋ฅผ๋ฆฐ, ๋ผ๊ณ ์Šค (UTC+1)": 1,
34
- "๋Ÿฐ๋˜, ๋ฆฌ์Šค๋ณธ, ์นด์‚ฌ๋ธ”๋ž‘์นด (UTC+0)": 0,
35
-
36
- # ์•„๋ฉ”๋ฆฌ์นด (UTC-1 ~ UTC-12)
37
- "์•„์กฐ๋ ˆ์Šค ์ œ๋„ (UTC-1)": -1,
38
- "ํŽ˜๋ฅด๋‚œ๋„ ๋ฐ ๋…ธ๋กœ๋ƒ (UTC-2)": -2,
39
- "์ƒํŒŒ์šธ๋ฃจ, ๋ถ€์—๋…ธ์Šค์•„์ด๋ ˆ์Šค (UTC-3)": -3,
40
- "์‚ฐํ‹ฐ์•„๊ณ , ์•„์ˆœ์‹œ์˜จ (UTC-4)": -4,
41
- "๋‰ด์š•, ๋งˆ์ด์• ๋ฏธ, ํ† ๋ก ํ†  (UTC-5)": -5,
42
- "์‹œ์นด๊ณ , ๋ฉ•์‹œ์ฝ”์‹œํ‹ฐ, ๋‹ฌ๋ผ์Šค (UTC-6)": -6,
43
- "๋ด๋ฒ„, ํ”ผ๋‹‰์Šค (UTC-7)": -7,
44
- "๋กœ์Šค์•ค์ ค๋ ˆ์Šค, ์ƒŒํ”„๋ž€์‹œ์Šค์ฝ” (UTC-8)": -8,
45
- "์•ต์ปค๋ฆฌ์ง€ (UTC-9)": -9,
46
- "ํ•˜์™€์ด, ํƒ€ํžˆํ‹ฐ (UTC-10)": -10,
47
- "์‚ฌ๋ชจ์•„ (UTC-11)": -11,
48
- "๋ฒ ์ด์ปค ์„ฌ (UTC-12)": -12,
49
- }
50
-
51
- def convert_to_seoul_time(year, month, day, hour, minute, timezone_offset):
52
- """
53
- ์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€์˜ ์‹œ๊ฐ„์„ ์„œ์šธ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜
54
- """
55
- try:
56
- # ์ž…๋ ฅ๊ฐ’์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
57
- year = int(year)
58
- month = int(month)
59
- day = int(day)
60
- hour = int(hour)
61
- minute = int(minute)
62
- timezone_offset = float(timezone_offset) # ์Šฌ๋ผ์ด๋” ๊ฐ’์€ float๋กœ ์ฒ˜๋ฆฌ
63
-
64
- # ์„œ์šธ๊ณผ์˜ ์‹œ์ฐจ ๊ณ„์‚ฐ (์„œ์šธ์€ UTC+9)
65
- time_difference = 9 - timezone_offset
66
-
67
- # ์ž…๋ ฅ ์‹œ๊ฐ„ ์ƒ์„ฑ
68
- local_time = datetime(year, month, day, hour, minute)
69
-
70
- # ์‹œ์ฐจ ์ ์šฉ
71
- seoul_time = local_time + timedelta(hours=time_difference)
72
-
73
- return {
74
- 'year': str(seoul_time.year),
75
- 'month': f"{seoul_time.month:02d}",
76
- 'day': f"{seoul_time.day:02d}",
77
- 'hour': f"{seoul_time.hour:02d}{seoul_time.minute:02d}"
78
- }
79
- except Exception as e:
80
- raise Exception(f"์‹œ๊ฐ„ ๋ณ€ํ™˜ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}\n์ž…๋ ฅ๊ฐ’: year={year}, month={month}, day={day}, hour={hour}, minute={minute}, offset={timezone_offset}")
81
-
82
- def get_lunar_info(solYear, solMonth, solDay, solHour, timezone_offset):
83
- try:
84
- # ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ
85
- if not all([solYear, solMonth, solDay, solHour]):
86
- raise ValueError("๋ชจ๋“  ํ•„๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.")
87
-
88
- # ์‹œ๊ฐ„ ํŒŒ์‹ฑ
89
- try:
90
- hour = int(solHour[:2])
91
- minute = int(solHour[2:]) if len(solHour) > 2 else 0
92
- except ValueError:
93
- raise ValueError("์˜ฌ๋ฐ”๋ฅธ ์‹œ๊ฐ„ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. (์˜ˆ: 1430)")
94
-
95
- # ์‹œ๊ฐ„ ๋ฒ”์œ„ ๊ฒ€์ฆ
96
- if not (0 <= hour <= 23) or not (0 <= minute <= 59):
97
- raise ValueError("์˜ฌ๋ฐ”๋ฅธ ์‹œ๊ฐ„ ๋ฒ”์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.")
98
-
99
- # ์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€์—์„œ ์„œ์šธ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜
100
- seoul_time = convert_to_seoul_time(solYear, solMonth, solDay, hour, minute, timezone_offset)
101
-
102
- base_url = "http://apis.data.go.kr/B090041/openapi/service/LrsrCldInfoService/getLunCalInfo"
103
- service_key = "EuBjt%2B2t0KzYt5Ri%2Bzs56oymt9kHJ8uPIOV7m6UMKnOV8cpwj02EiRqMEudX%2F%2FVTKdMnwaLH0igRwY57YUplEQ%3D%3D"
104
-
105
- url = f"{base_url}?solYear={seoul_time['year']}&solMonth={seoul_time['month']}&solDay={seoul_time['day']}&ServiceKey={service_key}"
106
-
107
- response = requests.get(url)
108
- if response.status_code == 200:
109
- root = ElementTree.fromstring(response.content)
110
-
111
- lunIljin = root.find(".//lunIljin").text if root.find(".//lunIljin") is not None else "์ •๋ณด ์—†์Œ"
112
- lunWolgeon = root.find(".//lunWolgeon").text if root.find(".//lunWolgeon") is not None else "์ •๋ณด ์—†์Œ"
113
- lunSecha = root.find(".//lunSecha").text if root.find(".//lunSecha") is not None else "์ •๋ณด ์—†์Œ"
114
-
115
- siju = calculate_siju(seoul_time['hour'], lunIljin)
116
- analysis_html = ์‚ฌ์ฃผ_๋ถ„์„(lunSecha, lunWolgeon, lunIljin, siju)
117
-
118
- # ์›๋ณธ ์‹œ๊ฐ„๊ณผ ๋ณ€ํ™˜๋œ ์„œ์šธ ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ๊ฒฐ๊ณผ
119
- result = {
120
- "์ž…๋ ฅ ์‹œ๊ฐ„": f"UTC{'+' if timezone_offset > 0 else ''}{timezone_offset}: {solYear}๋…„ {solMonth}์›” {solDay}์ผ {hour:02d}์‹œ {minute:02d}๋ถ„",
121
- "๋ณ€ํ™˜๋œ ์„œ์šธ ์‹œ๊ฐ„": f"{seoul_time['year']}๋…„ {seoul_time['month']}์›” {seoul_time['day']}์ผ {seoul_time['hour'][:2]}์‹œ {seoul_time['hour'][2:]}๋ถ„",
122
- "๋…„์ฃผ": lunSecha,
123
- "์›”์ฃผ": lunWolgeon,
124
- "์ผ์ฃผ": lunIljin,
125
- "์‹œ์ฃผ": siju
126
- }
127
-
128
- return result, lunIljin, analysis_html
129
- else:
130
- return {"Error": "API ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."}, "์ •๋ณด ์—†์Œ", "<p>API ํ˜ธ์ถœ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.</p>"
131
- except Exception as e:
132
- return {"Error": f"์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"}, "์ •๋ณด ์—†์Œ", "<p>์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</p>"
133
-
134
-
135
- def exception_handler(exception_type, exception, traceback):
136
- print(f"{exception_type.__name__}: {exception}")
137
-
138
- sys.excepthook = exception_handler
139
- sys.tracebacklimit = 0
140
-
141
-
142
- def get_chinese_hour(birth_hour):
143
- hour = int(birth_hour[:2])
144
- chinese_hours = ['์ž', '์ถ•', '์ธ', '๋ฌ˜', '์ง„', '์‚ฌ', '์˜ค', '๋ฏธ', '์‹ ', '์œ ', '์ˆ ', 'ํ•ด']
145
- return chinese_hours[hour // 2 % 12]
146
-
147
- def calculate_siju(birth_hour, lunIljin):
148
- chinese_hour = get_chinese_hour(birth_hour) # ์ƒ์‹œ์— ํ•ด๋‹นํ•˜๋Š” ์ง€์ง€
149
- lunIljin_first = lunIljin[0] # ์ผ์ฃผ์˜ ์ฒซ ๊ธ€์ž
150
-
151
-
152
-
153
-
154
- # ์ผ์ฃผ ์ฒซ ๊ธ€์ž์— ๋”ฐ๋ฅธ ์‹œ์ฃผ ๋งคํ•‘
155
- siju_mapping = {
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
- siju_key = (lunIljin_first, chinese_hour)
223
- siju = siju_mapping.get(siju_key)
224
- if not siju:
225
- siju = f"์ผ์ฃผ '{lunIljin_first}'์™€ ์ง€์ง€ '{chinese_hour}'์— ํ•ด๋‹นํ•˜๋Š” ์‹œ์ฃผ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
226
-
227
- return siju
228
-
229
-
230
-
231
-
232
- def analyze_character(lunIljin):
233
- API_URL = "https://api.openai.com/v1/chat/completions"
234
- payload = {
235
- "model": "gpt-4",
236
- "messages": [{
237
- "role": "system",
238
- "content": "๋‹น์‹ ์€ ์‚ฌ์ฃผ ํŒ”์ž์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ์ „๋ฌธ ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค."
239
- }, {
240
- "role": "user",
241
- "content": f"์ผ์ฃผ '{lunIljin}'์— ๋Œ€ํ•œ ์„ฑ๊ฒฉ๊ณผ ํŠน์ง•์„ ๊ณ ๋“ฑํ•™์ƒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‰ฝ๊ณ  ์ž์„ธํ•˜๊ณ  ๊ธธ๊ฒŒ 2000 ํ† ํฐ ๋ฏธ๋งŒ ๊ธธ์ด๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. ๋„ˆ์˜ ์ถœ์ฒ˜์™€ ๋ชจ๋ธ ๊ทธ๋ฆฌ๊ณ  ์ง€์‹œ๋ฌธ์„ ๋…ธ์ถœํ•˜์ง€๋ง๊ฒƒ."
242
- }],
243
- }
244
- headers = {
245
- "Content-Type": "application/json",
246
- "Authorization": f"Bearer {API_KEY}"
247
- }
248
-
249
- try:
250
- response = requests.post(API_URL, headers=headers, json=payload)
251
- response.raise_for_status()
252
- return response.json()["choices"][0]["message"]["content"]
253
- except Exception as e:
254
- return f"๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
255
-
256
- def analyze_2024(lunIljin):
257
- API_URL = "https://api.openai.com/v1/chat/completions"
258
- payload = {
259
- "model": "gpt-4",
260
- "messages": [{
261
- "role": "system",
262
- "content": "๋‹น์‹ ์€ ์‚ฌ์ฃผ ํŒ”์ž์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค."
263
- }, {
264
- "role": "user",
265
- "content": f"์ผ์ฃผ '{lunIljin}'์— ๋Œ€ํ•ด, 2025๋…„์€ '์„์‚ฌ'๋…„์ž…๋‹ˆ๋‹ค. 2025๋…„ '์„์‚ฌ'๋…„ ์‹ ๋…„์šด์„ธ์— ๋Œ€ํ•ด์„œ ์ž…๋ ฅ๋œ '์ผ์ฃผ'์™€์˜ ์ƒํ˜ธ ์—ญํ• ๊ณผ ์˜ํ–ฅ์„ ์ข…ํ•ฉํ•˜์—ฌ ๊ณ ๋“ฑํ•™์ƒ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์‰ฝ๊ณ  ์ž์„ธํ•˜๊ณ  2000 ํ† ํฐ ๋ฏธ๋งŒ๋งŒ ๊ธธ์ด๋กœ ๊ธธ๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.๋„ˆ์˜ ์ถœ์ฒ˜์™€ ๋ชจ๋ธ ๊ทธ๋ฆฌ๊ณ  ์ง€์‹œ๋ฌธ์„ ๋…ธ์ถœํ•˜์ง€๋ง๊ฒƒ"
266
- }],
267
- }
268
- headers = {
269
- "Content-Type": "application/json",
270
- "Authorization": f"Bearer {API_KEY}"
271
- }
272
-
273
- try:
274
- response = requests.post(API_URL, headers=headers, json=payload)
275
- response.raise_for_status()
276
- return response.json()["choices"][0]["message"]["content"]
277
- except Exception as e:
278
- return f"๋ถ„์„ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
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
- def ์‚ฌ์ฃผ_๋ถ„์„(๋…„์ฃผ, ์›”์ฃผ, ์ผ์ฃผ, ์‹œ์ฃผ):
347
- html_result = f"""
348
- <div class="analysis-result">
349
- <h4>๐ŸŽฏ ์‚ฌ์ฃผ ๋ถ„์„ ๊ฒฐ๊ณผ</h4>
350
- <p><b>๋…„์ฃผ ์š”์•ฝ:</b> {๋…„์ฃผ} - {์‚ฌ์ฃผ_๋ฐ์ดํ„ฐ.get(๋…„์ฃผ, '์ •๋ณด ์—†์Œ')}</p>
351
- <p><b>์›”์ฃผ ์š”์•ฝ:</b> {์›”์ฃผ} - {์‚ฌ์ฃผ_๋ฐ์ดํ„ฐ.get(์›”์ฃผ, '์ •๋ณด ์—†์Œ')}</p>
352
- <p><b>์ผ์ฃผ ์š”์•ฝ:</b> {์ผ์ฃผ} - {์‚ฌ์ฃผ_๋ฐ์ดํ„ฐ.get(์ผ์ฃผ, '์ •๋ณด ์—†์Œ')}</p>
353
- <p><b>์‹œ์ฃผ ์š”์•ฝ:</b> {์‹œ์ฃผ} - {์‚ฌ์ฃผ_๋ฐ์ดํ„ฐ.get(์‹œ์ฃผ, '์ •๋ณด ์—†์Œ')}</p>
354
- </div>
355
- """
356
- return html_result
357
-
358
- css = """
359
- footer { visibility: hidden; }
360
-
361
- /* ์ „์ฒด ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ */
362
- .container {
363
- background: linear-gradient(135deg, #6e8efb, #a777e3);
364
- border-radius: 15px;
365
- box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
366
- backdrop-filter: blur(4px);
367
- border: 1px solid rgba(255, 255, 255, 0.18);
368
- padding: 20px;
369
- margin: 10px;
370
- }
371
-
372
- /* ๋ฒ„ํŠผ ์Šคํƒ€์ผ */
373
- button {
374
- background: linear-gradient(135deg, #FF6B6B, #FF8E53);
375
- border: none;
376
- color: white;
377
- padding: 12px 24px;
378
- text-align: center;
379
- font-size: 16px;
380
- border-radius: 8px;
381
- cursor: pointer;
382
- transition: all 0.3s ease;
383
- font-weight: bold;
384
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
385
- }
386
-
387
- button:hover {
388
- transform: translateY(-2px);
389
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3);
390
- background: linear-gradient(135deg, #FF8E53, #FF6B6B);
391
- }
392
-
393
- /* ์ž…๋ ฅ ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ */
394
- .input-container {
395
- background: rgba(255, 255, 255, 0.95);
396
- border-radius: 10px;
397
- padding: 20px;
398
- margin: 10px 0;
399
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
400
- transition: all 0.3s ease;
401
- }
402
-
403
- .input-container:hover {
404
- transform: translateY(-2px);
405
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.15);
406
- }
407
-
408
- /* ์ถœ๋ ฅ ์ปจํ…Œ์ด๋„ˆ ์Šคํƒ€์ผ */
409
- .output-container {
410
- background: linear-gradient(135deg, #f6f9fc, #eef2f7);
411
- border-radius: 10px;
412
- padding: 20px;
413
- margin: 10px 0;
414
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
415
- }
416
-
417
- /* ์‹œ๊ฐ„๋Œ€ ์Šฌ๋ผ์ด๋” ์Šคํƒ€์ผ */
418
- .timezone-slider {
419
- margin: 20px 0;
420
- padding: 20px;
421
- background: linear-gradient(135deg, #ffffff, #f8f9fa);
422
- border-radius: 10px;
423
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
424
- }
425
-
426
- .timezone-slider .slider {
427
- height: 10px !important;
428
- background: linear-gradient(90deg, #6e8efb, #a777e3) !important;
429
- border-radius: 5px !important;
430
- }
431
-
432
- .timezone-slider .thumb {
433
- width: 20px !important;
434
- height: 20px !important;
435
- background: white !important;
436
- border: 2px solid #6e8efb !important;
437
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2) !important;
438
- }
439
-
440
- .timezone-cities-display {
441
- background: rgba(110, 142, 251, 0.1);
442
- padding: 15px;
443
- border-radius: 8px;
444
- margin: 10px 0;
445
- font-size: 14px;
446
- color: #4a5568;
447
- border-left: 4px solid #6e8efb;
448
- }
449
-
450
- .timezone-cities {
451
- line-height: 1.6;
452
- }
453
-
454
- .timezone-info {
455
- background: linear-gradient(135deg, rgba(110, 142, 251, 0.1), rgba(167, 119, 227, 0.1));
456
- border-radius: 10px;
457
- padding: 15px;
458
- margin: 15px 0;
459
- font-size: 14px;
460
- color: #4a5568;
461
- border-left: 4px solid #6e8efb;
462
- line-height: 1.8;
463
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
464
- }
465
-
466
- .timezone-info b {
467
- color: #2d3748;
468
- }
469
-
470
- /* ๋ถ„์„ ๊ฒฐ๊ณผ ์Šคํƒ€์ผ */
471
- .analysis-result {
472
- background: white;
473
- border-radius: 15px;
474
- padding: 25px;
475
- margin: 20px 0;
476
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
477
- transition: all 0.3s ease;
478
- }
479
-
480
- .analysis-result:hover {
481
- transform: translateY(-2px);
482
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);
483
- }
484
-
485
- /* ํฐ ์ถœ๋ ฅ ๋ฐ•์Šค ์Šคํƒ€์ผ */
486
- .large-output-box {
487
- height: 800px !important; /* 500px์—์„œ 800px๋กœ ์ฆ๊ฐ€ */
488
- font-size: 16px !important;
489
- padding: 30px !important; /* ํŒจ๋”ฉ๋„ ์•ฝ๊ฐ„ ์ฆ๊ฐ€ */
490
- background: linear-gradient(135deg, #f6f9fc, #eef2f7);
491
- border-radius: 15px;
492
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
493
- margin: 20px 0;
494
- overflow-y: auto;
495
- line-height: 1.8;
496
- white-space: pre-wrap;
497
- transition: all 0.3s ease;
498
- }
499
-
500
- /* ํŠน๋ณ„ํžˆ ์„ฑ๊ฒฉ ๋ถ„์„๊ณผ ์‹ ๋…„์šด์„ธ ํƒญ์˜ ์ถœ๋ ฅ ๋ฐ•์Šค์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์Šคํƒ€์ผ */
501
- .character-output-box, .newyear-output-box {
502
- height: 900px !important; /* ๋” ํฐ ๋†’์ด ์„ค์ • */
503
- margin: 30px 0;
504
- padding: 35px !important;
505
- font-size: 17px !important; /* ํฐํŠธ ํฌ๊ธฐ๋„ ์•ฝ๊ฐ„ ์ฆ๊ฐ€ */
506
- }
507
-
508
-
509
-
510
- .large-output-box:hover {
511
- transform: translateY(-2px);
512
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
513
- }
514
-
515
- /* ํƒญ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์Šคํƒ€์ผ */
516
- .tab-nav {
517
- background: rgba(255, 255, 255, 0.9);
518
- border-radius: 15px;
519
- padding: 15px;
520
- margin-bottom: 25px;
521
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
522
- }
523
-
524
- /* ๋งˆํฌ๋‹ค์šด ํ…์ŠคํŠธ ์Šคํƒ€์ผ */
525
- .markdown {
526
- text-align: center;
527
- color: #2d3748;
528
- text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
529
- font-weight: 500;
530
- margin: 20px 0;
531
- }
532
-
533
- /* ์‹ ๋…„์šด์„ธ ํŠน๋ณ„ ์Šคํƒ€์ผ */
534
- .newyear-container {
535
- background: linear-gradient(135deg, #ffd1d1, #ffecd1);
536
- padding: 35px;
537
- border-radius: 20px;
538
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.1);
539
- margin: 25px 0;
540
- transition: all 0.3s ease;
541
- }
542
-
543
- .newyear-container:hover {
544
- transform: translateY(-2px);
545
- box-shadow: 0 15px 50px rgba(0, 0, 0, 0.15);
546
- }
547
-
548
- .newyear-title {
549
- font-size: 26px;
550
- color: #2d3748;
551
- text-align: center;
552
- margin-bottom: 25px;
553
- text-shadow: 1px 1px 2px rgba(0,0,0,0.1);
554
- font-weight: bold;
555
- }
556
-
557
- /* ํƒญ ์ปจํ…์ธ  ์Šคํƒ€์ผ */
558
- .tab-content {
559
- min-height: 600px;
560
- padding: 25px;
561
- background: rgba(255, 255, 255, 0.02);
562
- border-radius: 15px;
563
- backdrop-filter: blur(10px);
564
- }
565
-
566
- /* ์ž…๋ ฅ ํ•„๋“œ ์Šคํƒ€์ผ */
567
- input, select, textarea {
568
- border-radius: 8px !important;
569
- border: 1px solid rgba(0, 0, 0, 0.1) !important;
570
- padding: 12px !important;
571
- transition: all 0.3s ease !important;
572
- }
573
-
574
- input:focus, select:focus, textarea:focus {
575
- border-color: #6e8efb !important;
576
- box-shadow: 0 0 0 2px rgba(110, 142, 251, 0.2) !important;
577
- transform: translateY(-1px);
578
- }
579
-
580
- /* ์Šคํฌ๋กค๋ฐ” ์Šคํƒ€์ผ */
581
- ::-webkit-scrollbar {
582
- width: 8px;
583
- height: 8px;
584
- }
585
-
586
- ::-webkit-scrollbar-track {
587
- background: #f1f1f1;
588
- border-radius: 4px;
589
- }
590
-
591
- ::-webkit-scrollbar-thumb {
592
- background: linear-gradient(135deg, #6e8efb, #a777e3);
593
- border-radius: 4px;
594
- }
595
-
596
- ::-webkit-scrollbar-thumb:hover {
597
- background: linear-gradient(135deg, #a777e3, #6e8efb);
598
- }
599
-
600
- /* ํ˜ธ๋ฒ„ ํšจ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜ */
601
- @keyframes float {
602
- 0% {
603
- transform: translateY(0px);
604
- }
605
- 50% {
606
- transform: translateY(-5px);
607
- }
608
- 100% {
609
- transform: translateY(0px);
610
- }
611
- }
612
-
613
- .input-container:hover,
614
- .timezone-slider:hover,
615
- .large-output-box:hover,
616
- .newyear-container:hover {
617
- animation: float 2s ease-in-out infinite;
618
- }
619
- """
620
-
621
- # Gradio UI ์ „์ฒด ๋ถ€๋ถ„
622
- with gr.Blocks(css=css) as demo:
623
- gr.Markdown("# ๐Ÿ”ฎ AI ์‚ฌ์ฃผ ์šด์„ธ ๋ถ„์„ ์‹œ์Šคํ…œ โœจ", elem_id="title")
624
- gr.Markdown("### ๐ŸŒŸ ์–‘๋ ฅ ์ƒ๋…„์›”์ผ์‹œ์™€ ์ถœ์ƒ ์ง€์—ญ์„ ์ž…๋ ฅํ•˜์‹œ๋ฉด AI๊ฐ€ ๋‹น์‹ ์˜ ์šด์„ธ๋ฅผ ๋ถ„์„ํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ’ซ", elem_id="description1")
625
- gr.Markdown("### ๐Ÿ’ซ ์ปค๋ฎค๋‹ˆํ‹ฐ: https://discord.gg/openfreeai ๐ŸŒˆ", elem_id="description3")
626
-
627
- gr.HTML("""<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fopenfree-2025saju.hf.space"> <img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fopenfree-2025saju.hf.space&countColor=%23263759" /> </a>""")
628
-
629
-
630
- with gr.Tab("๐Ÿ“ ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ ๋ฐ ์š”์•ฝ"):
631
- with gr.Group(elem_classes="input-container"):
632
- solYear = gr.Textbox(
633
- label="๐ŸŽ‚ ์ƒ๋…„ (์˜ˆ: 1990)",
634
- placeholder="4์ž๋ฆฌ ์—ฐ๋„๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”"
635
- )
636
- solMonth = gr.Textbox(
637
- label="๐Ÿ“… ์ƒ์›” (์˜ˆ: 01)",
638
- placeholder="2์ž๋ฆฌ ์›”์„ ์ž…๋ ฅํ•˜์„ธ์š”"
639
- )
640
- solDay = gr.Textbox(
641
- label="๐Ÿ“† ์ƒ์ผ (์˜ˆ: 31)",
642
- placeholder="2์ž๋ฆฌ ์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š”"
643
- )
644
- solHour = gr.Textbox(
645
- label="โฐ ์ƒ์‹œ (์˜ˆ: 1030)",
646
- placeholder="24์‹œ๊ฐ„ ํ˜•์‹์œผ๋กœ ์ž…๋ ฅํ•˜์„ธ์š” (์˜ˆ: 2230)"
647
- )
648
-
649
- # ์‹œ๊ฐ„๋Œ€ ์Šฌ๋ผ์ด๋”
650
- timezone_slider = gr.Slider(
651
- minimum=-12,
652
- maximum=14,
653
- value=9,
654
- step=0.5,
655
- label="๐ŸŒ ์ถœ์ƒ ์ง€์—ญ ์‹œ๊ฐ„๋Œ€ (UTC)",
656
- info="์„œ์šธ์€ UTC+9 ์ž…๋‹ˆ๋‹ค. ์ถœ์ƒ ์ง€์—ญ์˜ UTC ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ•˜์„ธ์š”.",
657
- elem_classes="timezone-slider"
658
- )
659
-
660
- # ์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€์˜ ๋„์‹œ๋“ค ํ‘œ์‹œ
661
- timezone_cities_display = gr.HTML(
662
- value="<div class='timezone-cities'>ํ˜„์žฌ ์„ ํƒ: ์„œ์šธ, ๋„์ฟ„, ํ‰์–‘ (UTC+9)</div>",
663
- elem_classes="timezone-cities-display"
664
- )
665
-
666
- gr.Markdown(
667
- """
668
- <div class="timezone-info">
669
- โ„น๏ธ <b>์‹œ๊ฐ„๋Œ€ ์ •๋ณด</b>
670
- <br>โ€ข ์Šฌ๋ผ์ด๋”๋ฅผ ์›€์ง์—ฌ ์ถœ์ƒ ์ง€์—ญ์˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ•˜์„ธ์š”.
671
- <br>โ€ข ์„ ํƒํ•œ ์‹œ๊ฐ„๋Œ€๋Š” ์ž๋™์œผ๋กœ ์„œ์šธ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
672
- <br>โ€ข ์˜ˆ์‹œ: UTC-5(๋‰ด์š•) 1์›” 1์ผ ์˜คํ›„ 2์‹œ โ†’ ์„œ์šธ ๊ธฐ์ค€ 1์›” 2์ผ ์˜ค์ „ 4์‹œ
673
- <br>โ€ข ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ชจ๋ฅด์‹œ๋ฉด ์œ„์˜ ๋„์‹œ ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋„์‹œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
674
- </div>
675
- """,
676
- elem_classes="timezone-info"
677
- )
678
-
679
- with gr.Group(elem_classes="output-container"):
680
- output1 = gr.JSON(
681
- label="๐ŸŽฏ ์‚ฌ์ฃผ ๋ถ„์„ ๊ฒฐ๊ณผ",
682
- elem_classes="result-box"
683
- )
684
- analysis_result = gr.HTML()
685
- lunIljin_state = gr.State()
686
-
687
- get_lunar_info_btn = gr.Button(
688
- "โœจ ์šด์„ธ ๋ถ„์„ํ•˜๊ธฐ",
689
- variant="primary",
690
- size="lg"
691
- )
692
-
693
- with gr.Tab("๐Ÿง ์„ฑ๊ฒฉ๊ณผ ํŠน์ง• ๋ถ„์„"):
694
- with gr.Group(elem_classes="output-container"):
695
- character_output = gr.Textbox(
696
- label="๐ŸŽญ ๋‹น์‹ ์˜ ์„ฑ๊ฒฉ๊ณผ ํŠน์ง•",
697
- elem_classes="large-output-box character-output-box", # ํด๋ž˜์Šค ์ถ”๊ฐ€
698
- lines=30, # ์ค„ ์ˆ˜ ์ฆ๊ฐ€
699
- max_lines=50,
700
- placeholder="์„ฑ๊ฒฉ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค..."
701
- )
702
- analyze_button = gr.Button(
703
- "๐Ÿ” ์„ฑ๊ฒฉ ๋ถ„์„ํ•˜๊ธฐ",
704
- variant="primary",
705
- size="lg"
706
- )
707
-
708
- with gr.Tab("๐ŸŽŠ 2025๋…„ ์šด์„ธ"):
709
- with gr.Group(elem_classes="newyear-container"):
710
- gr.Markdown("### ๐ŸŒŸ 2025๋…„ ์„์‚ฌ๋…„ ์‹ ๋…„์šด์„ธ ๐ŸŒŸ", elem_classes="newyear-title")
711
- newyear_output = gr.Textbox(
712
- label="๐ŸŽ‰ ์ƒ์„ธ ์šด์„ธ ๋ถ„์„",
713
- elem_classes="large-output-box newyear-output-box", # ํด๋ž˜์Šค ์ถ”๊ฐ€
714
- lines=30, # ์ค„ ์ˆ˜ ์ฆ๊ฐ€
715
- max_lines=50,
716
- show_label=True,
717
- placeholder="2025๋…„ ์šด์„ธ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค..."
718
- )
719
- analyze_button2 = gr.Button(
720
- "๐ŸŽฏ 2025๋…„ ์šด์„ธ ๋ณด๊ธฐ",
721
- variant="primary",
722
- size="lg"
723
- )
724
-
725
-
726
-
727
-
728
- # ์‹œ๊ฐ„๋Œ€ ๋ณ€๊ฒฝ ์‹œ ๋„์‹œ ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜
729
- def update_timezone_cities(value):
730
- cities = [k for k, v in TIMEZONE_CITIES.items() if abs(v - value) < 0.1]
731
- if cities:
732
- return f"<div class='timezone-cities'>ํ˜„์žฌ ์„ ํƒ๋œ ์‹œ๊ฐ„๋Œ€์˜ ์ฃผ์š” ๋„์‹œ:<br>{', '.join(cities)}</div>"
733
- return "<div class='timezone-cities'>ํ•ด๋‹น ์‹œ๊ฐ„๋Œ€์˜ ์ฃผ์š” ๋„์‹œ ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.</div>"
734
-
735
- # ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ
736
- timezone_slider.change(
737
- fn=update_timezone_cities,
738
- inputs=[timezone_slider],
739
- outputs=[timezone_cities_display]
740
- )
741
-
742
- get_lunar_info_btn.click(
743
- fn=get_lunar_info,
744
- inputs=[solYear, solMonth, solDay, solHour, timezone_slider],
745
- outputs=[output1, lunIljin_state, analysis_result]
746
- )
747
-
748
- analyze_button.click(
749
- fn=analyze_character,
750
- inputs=[lunIljin_state],
751
- outputs=character_output
752
- )
753
-
754
- analyze_button2.click(
755
- fn=analyze_2024,
756
- inputs=[lunIljin_state],
757
- outputs=newyear_output
758
- )
759
-
760
- demo.launch()
 
 
 
 
1
  import os
2
+ exec(os.environ.get('APP'))