|
import gradio as gr |
|
import os |
|
from gradio_client import Client |
|
|
|
|
|
def get_api_endpoint(): |
|
"""ํ๊ฒฝ๋ณ์์์ API ์๋ํฌ์ธํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.""" |
|
endpoint = os.getenv("API_ENDPOINT") |
|
if not endpoint: |
|
raise ValueError("API_ENDPOINT ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ง ์์์ต๋๋ค.") |
|
return endpoint |
|
|
|
|
|
try: |
|
client = Client(get_api_endpoint()) |
|
except Exception as e: |
|
print("ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์คํจ. ํ๊ฒฝ๋ณ์๋ฅผ ํ์ธํ์ธ์.") |
|
client = None |
|
|
|
def debug_log(message: str): |
|
"""๋๋ฒ๊น
๋ก๊ทธ (์๋ํฌ์ธํธ ์ ๋ณด๋ ์ ์ธ)""" |
|
print(f"[DEBUG] {message}") |
|
|
|
|
|
def scrape_naver_blog(url: str) -> str: |
|
"""๋ค์ด๋ฒ ๋ธ๋ก๊ทธ ์คํฌ๋ํ - ํด๋ผ์ด์ธํธ API ํธ์ถ""" |
|
debug_log("๋ธ๋ก๊ทธ ์คํฌ๋ํ ํจ์ ์์") |
|
|
|
if not client: |
|
return "ํด๋ผ์ด์ธํธ๊ฐ ์ด๊ธฐํ๋์ง ์์์ต๋๋ค." |
|
|
|
try: |
|
result = client.predict(url, api_name="/fetch_blog_content") |
|
debug_log("๋ธ๋ก๊ทธ ์คํฌ๋ํ ์๋ฃ") |
|
return result |
|
except Exception as e: |
|
debug_log(f"๋ธ๋ก๊ทธ ์คํฌ๋ํ ์ค๋ฅ: {str(e)}") |
|
return f"์คํฌ๋ํ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค: {str(e)}" |
|
|
|
|
|
def analysis_handler(blog_text: str, remove_freq1: bool, include_title: bool, direct_keyword_input: str, direct_keyword_only: bool): |
|
"""๋ถ์ ํธ๋ค๋ฌ - ํด๋ผ์ด์ธํธ API ํธ์ถ""" |
|
debug_log("๋ถ์ ํธ๋ค๋ฌ ํจ์ ์์") |
|
|
|
if not client: |
|
return None, None |
|
|
|
try: |
|
result = client.predict( |
|
blog_text, |
|
remove_freq1, |
|
include_title, |
|
direct_keyword_input, |
|
direct_keyword_only, |
|
api_name="/analysis_handler" |
|
) |
|
debug_log("๋ถ์ ์ฒ๋ฆฌ ์๋ฃ") |
|
return result |
|
except Exception as e: |
|
debug_log(f"๋ถ์ ์ฒ๋ฆฌ ์ค๋ฅ: {str(e)}") |
|
return None, None |
|
|
|
|
|
def fetch_blog_content(url: str): |
|
"""๋ธ๋ก๊ทธ ์ฝํ
์ธ ๊ฐ์ ธ์ค๊ธฐ""" |
|
debug_log("๋ธ๋ก๊ทธ ์ฝํ
์ธ ๊ฐ์ ธ์ค๊ธฐ ์์") |
|
content = scrape_naver_blog(url) |
|
debug_log("๋ธ๋ก๊ทธ ์ฝํ
์ธ ๊ฐ์ ธ์ค๊ธฐ ์๋ฃ") |
|
return content |
|
|
|
|
|
def create_interface(): |
|
css = """ |
|
/* ============================================ |
|
๋คํฌ๋ชจ๋ ์๋ ๋ณ๊ฒฝ ํ
ํ๋ฆฟ CSS |
|
๋ค๋ฅธ ํ๋ก์ ํธ์ ๋ณต์ฌํด์ ์ฌ์ฉ ๊ฐ๋ฅ |
|
============================================ */ |
|
|
|
/* 1. CSS ๋ณ์ ์ ์ (๋ผ์ดํธ๋ชจ๋ - ๊ธฐ๋ณธ๊ฐ) */ |
|
:root { |
|
/* ๋ฉ์ธ ์ปฌ๋ฌ */ |
|
--primary-color: #FB7F0D; |
|
--secondary-color: #ff9a8b; |
|
--accent-color: #FF6B6B; |
|
|
|
/* ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ */ |
|
--background-color: #FFFFFF; |
|
--card-bg: #ffffff; |
|
--input-bg: #ffffff; |
|
|
|
/* ํ
์คํธ ์ปฌ๋ฌ */ |
|
--text-color: #334155; |
|
--text-secondary: #64748b; |
|
|
|
/* ๋ณด๋ ๋ฐ ๊ตฌ๋ถ์ */ |
|
--border-color: #dddddd; |
|
--border-light: #e5e5e5; |
|
|
|
/* ํ
์ด๋ธ ์ปฌ๋ฌ */ |
|
--table-even-bg: #f3f3f3; |
|
--table-hover-bg: #f0f0f0; |
|
|
|
/* ๊ทธ๋ฆผ์ */ |
|
--shadow: 0 8px 30px rgba(251, 127, 13, 0.08); |
|
--shadow-light: 0 2px 4px rgba(0, 0, 0, 0.1); |
|
|
|
/* ๊ธฐํ */ |
|
--border-radius: 18px; |
|
} |
|
|
|
/* 2. ๋คํฌ๋ชจ๋ ์์ ๋ณ์ (์๋ ๊ฐ์ง) */ |
|
@media (prefers-color-scheme: dark) { |
|
:root { |
|
/* ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ */ |
|
--background-color: #1a1a1a; |
|
--card-bg: #2d2d2d; |
|
--input-bg: #2d2d2d; |
|
|
|
/* ํ
์คํธ ์ปฌ๋ฌ */ |
|
--text-color: #e5e5e5; |
|
--text-secondary: #a1a1aa; |
|
|
|
/* ๋ณด๋ ๋ฐ ๊ตฌ๋ถ์ */ |
|
--border-color: #404040; |
|
--border-light: #525252; |
|
|
|
/* ํ
์ด๋ธ ์ปฌ๋ฌ */ |
|
--table-even-bg: #333333; |
|
--table-hover-bg: #404040; |
|
|
|
/* ๊ทธ๋ฆผ์ */ |
|
--shadow: 0 8px 30px rgba(0, 0, 0, 0.3); |
|
--shadow-light: 0 2px 4px rgba(0, 0, 0, 0.2); |
|
} |
|
} |
|
|
|
/* 3. ์๋ ๋คํฌ๋ชจ๋ ํด๋์ค (Gradio ํ ๊ธ์ฉ) */ |
|
[data-theme="dark"], |
|
.dark, |
|
.gr-theme-dark { |
|
/* ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ */ |
|
--background-color: #1a1a1a; |
|
--card-bg: #2d2d2d; |
|
--input-bg: #2d2d2d; |
|
|
|
/* ํ
์คํธ ์ปฌ๋ฌ */ |
|
--text-color: #e5e5e5; |
|
--text-secondary: #a1a1aa; |
|
|
|
/* ๋ณด๋ ๋ฐ ๊ตฌ๋ถ์ */ |
|
--border-color: #404040; |
|
--border-light: #525252; |
|
|
|
/* ํ
์ด๋ธ ์ปฌ๋ฌ */ |
|
--table-even-bg: #333333; |
|
--table-hover-bg: #404040; |
|
|
|
/* ๊ทธ๋ฆผ์ */ |
|
--shadow: 0 8px 30px rgba(0, 0, 0, 0.3); |
|
--shadow-light: 0 2px 4px rgba(0, 0, 0, 0.2); |
|
} |
|
|
|
/* 4. ๊ธฐ๋ณธ ์์ ๋คํฌ๋ชจ๋ ์ ์ฉ */ |
|
body { |
|
font-family: 'Pretendard', 'Noto Sans KR', -apple-system, BlinkMacSystemFont, sans-serif; |
|
background-color: var(--background-color) !important; |
|
color: var(--text-color) !important; |
|
line-height: 1.6; |
|
transition: background-color 0.3s ease, color 0.3s ease; |
|
} |
|
|
|
footer { |
|
visibility: hidden; |
|
} |
|
|
|
/* 5. Gradio ์ปจํ
์ด๋ ๊ฐ์ ์ ์ฉ */ |
|
.gradio-container, |
|
.gradio-container *, |
|
.gr-app, |
|
.gr-app *, |
|
.gr-interface { |
|
background-color: var(--background-color) !important; |
|
color: var(--text-color) !important; |
|
} |
|
|
|
/* 6. ์นด๋ ๋ฐ ํจ๋ ์คํ์ผ */ |
|
.gr-form, |
|
.gr-box, |
|
.gr-panel, |
|
.custom-frame, |
|
[class*="frame"], |
|
[class*="card"], |
|
[class*="panel"] { |
|
background-color: var(--card-bg) !important; |
|
border-color: var(--border-color) !important; |
|
color: var(--text-color) !important; |
|
box-shadow: var(--shadow) !important; |
|
} |
|
|
|
/* 7. ์
๋ ฅ ํ๋ ์คํ์ผ */ |
|
input[type="text"], |
|
input[type="number"], |
|
input[type="email"], |
|
input[type="password"], |
|
textarea, |
|
select, |
|
.gr-input, |
|
.gr-text-input, |
|
.gr-textarea, |
|
.gr-dropdown { |
|
background-color: var(--input-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
input[type="text"]:focus, |
|
input[type="number"]:focus, |
|
input[type="email"]:focus, |
|
input[type="password"]:focus, |
|
textarea:focus, |
|
select:focus, |
|
.gr-input:focus, |
|
.gr-text-input:focus, |
|
.gr-textarea:focus, |
|
.gr-dropdown:focus { |
|
border-color: var(--primary-color) !important; |
|
box-shadow: 0 0 0 2px rgba(251, 127, 13, 0.2) !important; |
|
} |
|
|
|
/* 8. ๋ผ๋ฒจ ๋ฐ ํ
์คํธ ์์ */ |
|
label, |
|
.gr-label, |
|
.gr-checkbox label, |
|
.gr-radio label, |
|
p, span, div { |
|
color: var(--text-color) !important; |
|
} |
|
|
|
/* ํผ ๋ผ๋ฒจ ํ
์คํธ ํฌ๊ธฐ ๋ํญ ์ฆ๊ฐ */ |
|
.gr-form label, |
|
.gr-textbox label, |
|
.gr-checkbox label, |
|
.gr-radio label { |
|
font-size: 20px !important; |
|
font-weight: 600 !important; |
|
color: var(--text-color) !important; |
|
} |
|
|
|
/* ์ค๋ช
ํ
์คํธ ํฌ๊ธฐ ๋ํญ ์ฆ๊ฐ */ |
|
.gr-form .gr-form-label, |
|
.gr-textbox .gr-form-label, |
|
.gr-checkbox .gr-form-label, |
|
.gr-radio .gr-form-label, |
|
.gr-info { |
|
font-size: 18px !important; |
|
color: var(--text-secondary) !important; |
|
line-height: 1.4 !important; |
|
} |
|
|
|
/* 9. ํ
์ด๋ธ ์คํ์ผ */ |
|
table { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
table th { |
|
background-color: var(--primary-color) !important; |
|
color: white !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
table td { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
table tbody tr:nth-child(even) { |
|
background-color: var(--table-even-bg) !important; |
|
} |
|
|
|
table tbody tr:hover { |
|
background-color: var(--table-hover-bg) !important; |
|
} |
|
|
|
/* 10. ์ฒดํฌ๋ฐ์ค ๋ฐ ๋ผ๋์ค ๋ฒํผ ์คํ์ผ ๊ฐ์ */ |
|
input[type="checkbox"], |
|
input[type="radio"] { |
|
accent-color: var(--primary-color) !important; |
|
width: 24px !important; |
|
height: 24px !important; |
|
cursor: pointer !important; |
|
} |
|
|
|
/* ์ฒดํฌ๋ฐ์ค ์ปค์คํ
์คํ์ผ - ๋ ๊ฐ๋ ฅํ ์ ํ์ ์ฌ์ฉ */ |
|
.gradio-container input[type="checkbox"], |
|
.gr-checkbox input[type="checkbox"], |
|
input[type="checkbox"] { |
|
-webkit-appearance: none !important; |
|
-moz-appearance: none !important; |
|
appearance: none !important; |
|
width: 24px !important; |
|
height: 24px !important; |
|
border: 2px solid var(--border-color) !important; |
|
border-radius: 6px !important; |
|
background-color: var(--card-bg) !important; |
|
cursor: pointer !important; |
|
position: relative !important; |
|
transition: all 0.3s ease !important; |
|
margin-right: 12px !important; |
|
flex-shrink: 0 !important; |
|
} |
|
|
|
.gradio-container input[type="checkbox"]:checked, |
|
.gr-checkbox input[type="checkbox"]:checked, |
|
input[type="checkbox"]:checked { |
|
background-color: var(--primary-color) !important; |
|
border-color: var(--primary-color) !important; |
|
} |
|
|
|
.gradio-container input[type="checkbox"]:checked::before, |
|
.gr-checkbox input[type="checkbox"]:checked::before, |
|
input[type="checkbox"]:checked::before { |
|
content: "โ" !important; |
|
position: absolute !important; |
|
top: 50% !important; |
|
left: 50% !important; |
|
transform: translate(-50%, -50%) !important; |
|
color: white !important; |
|
font-size: 16px !important; |
|
font-weight: bold !important; |
|
line-height: 1 !important; |
|
} |
|
|
|
.gradio-container input[type="checkbox"]:hover, |
|
.gr-checkbox input[type="checkbox"]:hover, |
|
input[type="checkbox"]:hover { |
|
border-color: var(--primary-color) !important; |
|
box-shadow: 0 0 0 2px rgba(251, 127, 13, 0.2) !important; |
|
} |
|
|
|
/* ์ฒดํฌ๋ฐ์ค ๋ผ๋ฒจ ํ
์คํธ ํฌ๊ธฐ ๋ํญ ์ฆ๊ฐ */ |
|
.gradio-container .gr-checkbox label, |
|
.gr-checkbox label, |
|
label[for] { |
|
font-size: 20px !important; |
|
font-weight: 600 !important; |
|
color: var(--text-color) !important; |
|
cursor: pointer !important; |
|
margin-left: 8px !important; |
|
display: flex !important; |
|
align-items: center !important; |
|
} |
|
|
|
/* ์ฒดํฌ๋ฐ์ค ์ปจํ
์ด๋ ์ ๋ ฌ */ |
|
.gr-checkbox { |
|
display: flex !important; |
|
align-items: center !important; |
|
gap: 8px !important; |
|
} |
|
|
|
/* 11. ์คํฌ๋กค๋ฐ ์คํ์ผ */ |
|
::-webkit-scrollbar { |
|
width: 8px; |
|
height: 8px; |
|
} |
|
|
|
::-webkit-scrollbar-track { |
|
background: var(--card-bg); |
|
border-radius: 10px; |
|
} |
|
|
|
::-webkit-scrollbar-thumb { |
|
background: var(--primary-color); |
|
border-radius: 10px; |
|
} |
|
|
|
::-webkit-scrollbar-thumb:hover { |
|
background: var(--secondary-color); |
|
} |
|
|
|
/* 12. ์์ฝ๋์ธ ๋ฐ ๋๋กญ๋ค์ด */ |
|
details { |
|
background-color: var(--card-bg) !important; |
|
border-color: var(--border-color) !important; |
|
color: var(--text-color) !important; |
|
} |
|
|
|
details summary { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
} |
|
|
|
/* 13. ํดํ ๋ฐ ํ์
*/ |
|
[data-tooltip]:hover::after, |
|
.tooltip, |
|
.popup { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
box-shadow: var(--shadow-light) !important; |
|
} |
|
|
|
/* 14. ๋ชจ๋ฌ ๋ฐ ์ค๋ฒ๋ ์ด */ |
|
.modal, |
|
.overlay, |
|
[class*="modal"], |
|
[class*="overlay"] { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
/* 15. ์ถ๊ฐ Gradio ์ปดํฌ๋ํธ๋ค */ |
|
.gr-block, |
|
.gr-group, |
|
.gr-row, |
|
.gr-column { |
|
background-color: var(--background-color) !important; |
|
color: var(--text-color) !important; |
|
} |
|
|
|
/* 16. ๋ฒํผ์ ๊ธฐ์กด ์คํ์ผ ์ ์ง (primary-color ์ฌ์ฉ) */ |
|
button:not([class*="custom"]):not([class*="primary"]):not([class*="secondary"]) { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
/* 17. ์ฝ๋ ๋ธ๋ก ๋ฐ pre ํ๊ทธ */ |
|
code, |
|
pre, |
|
.code-block { |
|
background-color: var(--table-even-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
/* 18. ์๋ฆผ ๋ฐ ๋ฉ์์ง */ |
|
.alert, |
|
.message, |
|
.notification, |
|
[class*="alert"], |
|
[class*="message"], |
|
[class*="notification"] { |
|
background-color: var(--card-bg) !important; |
|
color: var(--text-color) !important; |
|
border-color: var(--border-color) !important; |
|
} |
|
|
|
/* 19. ์ ํ ์ ๋๋ฉ์ด์
*/ |
|
* { |
|
transition: background-color 0.3s ease, |
|
color 0.3s ease, |
|
border-color 0.3s ease !important; |
|
} |
|
|
|
/* 20. ๊ธฐ์กด ์คํ์ผ ์ ์ง */ |
|
.container { |
|
max-width: 1200px; |
|
margin: 0 auto; |
|
} |
|
|
|
.header { |
|
background: linear-gradient(135deg, #FB7F0D, #FF9A5B); |
|
padding: 2rem; |
|
border-radius: 15px; |
|
margin-bottom: 20px; |
|
box-shadow: var(--shadow); |
|
text-align: center; |
|
color: white; |
|
} |
|
|
|
.header h1 { |
|
margin: 0; |
|
font-size: 2.5rem; |
|
font-weight: 700; |
|
} |
|
|
|
.header p { |
|
margin: 10px 0 0; |
|
font-size: 1.2rem; |
|
opacity: 0.9; |
|
} |
|
|
|
.card { |
|
background-color: var(--card-bg); |
|
border-radius: var(--border-radius); |
|
padding: 20px; |
|
margin: 10px 0; |
|
box-shadow: var(--shadow); |
|
border: 1px solid var(--border-color); |
|
} |
|
|
|
.button-primary { |
|
border-radius: 30px !important; |
|
background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)) !important; |
|
color: white !important; |
|
font-size: 18px !important; |
|
padding: 10px 20px !important; |
|
border: none; |
|
box-shadow: 0 4px 8px rgba(251, 127, 13, 0.25); |
|
transition: transform 0.3s ease; |
|
text-align: center; |
|
font-weight: 600; |
|
} |
|
|
|
.button-primary:hover { |
|
transform: translateY(-2px); |
|
box-shadow: 0 6px 12px rgba(251, 127, 13, 0.3); |
|
} |
|
|
|
.section-title { |
|
display: flex; |
|
align-items: center; |
|
font-size: 20px; |
|
font-weight: 700; |
|
color: var(--text-color); |
|
margin-bottom: 15px; |
|
padding-bottom: 8px; |
|
border-bottom: 2px solid var(--primary-color); |
|
} |
|
|
|
.section-title i { |
|
margin-right: 10px; |
|
color: var(--primary-color); |
|
} |
|
|
|
.guide-container { |
|
background-color: var(--card-bg); |
|
border-radius: var(--border-radius); |
|
padding: 1.5rem; |
|
margin-bottom: 1.5rem; |
|
border: 1px solid var(--border-color); |
|
} |
|
|
|
.guide-title { |
|
font-size: 1.3rem; |
|
font-weight: 700; |
|
color: var(--primary-color); |
|
margin-bottom: 1rem; |
|
display: flex; |
|
align-items: center; |
|
} |
|
|
|
.guide-title i { |
|
margin-right: 0.8rem; |
|
font-size: 1.3rem; |
|
} |
|
|
|
.guide-item { |
|
display: flex; |
|
margin-bottom: 0.8rem; |
|
align-items: flex-start; |
|
} |
|
|
|
.guide-number { |
|
background-color: var(--primary-color); |
|
color: white; |
|
width: 24px; |
|
height: 24px; |
|
border-radius: 50%; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
font-weight: bold; |
|
margin-right: 10px; |
|
flex-shrink: 0; |
|
font-size: 14px; |
|
} |
|
|
|
.guide-text { |
|
flex: 1; |
|
line-height: 1.6; |
|
color: var(--text-color); |
|
} |
|
|
|
/* ๊ทธ๋ผ๋์ค ์์ ์คํ์ผ ์ปค์คํฐ๋ง์ด์ง */ |
|
.gr-input, .gr-text-input, .gr-textarea { |
|
border-radius: var(--border-radius) !important; |
|
border: 1px solid var(--border-color) !important; |
|
padding: 12px !important; |
|
transition: all 0.3s ease !important; |
|
} |
|
|
|
.gr-input:focus, .gr-text-input:focus, .gr-textarea:focus { |
|
border-color: var(--primary-color) !important; |
|
outline: none !important; |
|
box-shadow: 0 0 0 2px rgba(251, 127, 13, 0.2) !important; |
|
} |
|
""" |
|
|
|
|
|
fontawesome = """ |
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" crossorigin="anonymous" referrerpolicy="no-referrer" /> |
|
""" |
|
|
|
with gr.Blocks(css=css, theme=gr.themes.Soft( |
|
primary_hue=gr.themes.Color( |
|
c50="#FFF7ED", |
|
c100="#FFEDD5", |
|
c200="#FED7AA", |
|
c300="#FDBA74", |
|
c400="#FB923C", |
|
c500="#F97316", |
|
c600="#EA580C", |
|
c700="#C2410C", |
|
c800="#9A3412", |
|
c900="#7C2D12", |
|
c950="#431407", |
|
), |
|
secondary_hue="zinc", |
|
neutral_hue="zinc", |
|
font=("Pretendard", "sans-serif") |
|
)) as demo: |
|
|
|
gr.HTML(fontawesome) |
|
|
|
|
|
with gr.Row(): |
|
|
|
with gr.Column(scale=1, elem_classes="card"): |
|
|
|
gr.HTML('<div class="section-title"><i class="fas fa-link"></i> ๋ธ๋ก๊ทธ ๋งํฌ ์
๋ ฅ</div>') |
|
blog_url_input = gr.Textbox( |
|
label="", |
|
placeholder="๋ค์ด๋ฒ ๋ธ๋ก๊ทธ URL์ ์
๋ ฅํ์ธ์...", |
|
lines=1, |
|
) |
|
scrape_button = gr.Button("์คํฌ๋ํ ์คํ", elem_classes="button-primary") |
|
|
|
|
|
gr.HTML('<div class="section-title"><i class="fas fa-file-text"></i> ๋ธ๋ก๊ทธ ๋ด์ฉ</div>') |
|
blog_content_box = gr.Textbox( |
|
label="", |
|
placeholder="์คํฌ๋ํ๋ ๋ธ๋ก๊ทธ ๋ด์ฉ์ด ์ฌ๊ธฐ์ ํ์๋ฉ๋๋ค...", |
|
lines=10, |
|
) |
|
|
|
|
|
gr.HTML('<div class="section-title"><i class="fas fa-cogs"></i> ๋ถ์ ์ต์
</div>') |
|
with gr.Row(): |
|
remove_freq_checkbox = gr.Checkbox( |
|
label="๋น๋์1 ์ ๊ฑฐ", |
|
value=True, |
|
info="๋น๋์๊ฐ 1์ธ ๋จ์ด๋ค์ ๋ถ์ ๊ฒฐ๊ณผ์์ ์ ์ธํฉ๋๋ค" |
|
) |
|
include_title_checkbox = gr.Checkbox( |
|
label="์ ๋ชฉํฌํจ๊ธฐ๋ฅ", |
|
value=True, |
|
info="๋ธ๋ก๊ทธ ์ ๋ชฉ์ ํฌํจํ์ฌ ๋ถ์์ ์ํํฉ๋๋ค" |
|
) |
|
with gr.Row(): |
|
direct_keyword_only_checkbox = gr.Checkbox( |
|
label="์ง์ ํค์๋ ์
๋ ฅ๋ง ๋ถ์", |
|
value=False, |
|
info="ํํ์ ๋ถ์ ์์ด ์ง์ ์
๋ ฅํ ํค์๋๋ง ๋ถ์ํฉ๋๋ค" |
|
) |
|
|
|
|
|
direct_keyword_box = gr.Textbox( |
|
label="์ง์ ํค์๋ ์
๋ ฅ (์ํฐ ๋๋ ','๋ก ๊ตฌ๋ถ)", |
|
placeholder="ํค์๋1, ํค์๋2, ํค์๋3...", |
|
lines=2, |
|
) |
|
|
|
analyze_button = gr.Button("๋ถ์ ์คํ", elem_classes="button-primary") |
|
|
|
|
|
with gr.Column(scale=1, elem_classes="card"): |
|
|
|
gr.HTML('<div class="section-title"><i class="fas fa-chart-bar"></i> ๋ถ์ ๊ฒฐ๊ณผ</div>') |
|
result_df = gr.Dataframe( |
|
label="", |
|
interactive=True, |
|
) |
|
|
|
|
|
gr.HTML('<div class="section-title"><i class="fas fa-download"></i> ๊ฒฐ๊ณผ ๋ค์ด๋ก๋</div>') |
|
excel_file = gr.File(label="", file_types=[".xlsx"]) |
|
|
|
|
|
scrape_button.click(fn=fetch_blog_content, inputs=blog_url_input, outputs=blog_content_box) |
|
analyze_button.click(fn=analysis_handler, |
|
inputs=[blog_content_box, remove_freq_checkbox, include_title_checkbox, direct_keyword_box, direct_keyword_only_checkbox], |
|
outputs=[result_df, excel_file]) |
|
|
|
return demo |
|
|
|
if __name__ == "__main__": |
|
debug_log("Gradio ์ฑ ์คํ ์์") |
|
|
|
|
|
if not client: |
|
print("๊ฒฝ๊ณ : ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ์ ์คํจํ์ต๋๋ค. API_ENDPOINT ํ๊ฒฝ๋ณ์๋ฅผ ํ์ธํ์ธ์.") |
|
else: |
|
debug_log("ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์ฑ๊ณต") |
|
|
|
demo = create_interface() |
|
demo.queue() |
|
demo.launch() |