Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import gradio as gr | |
import requests | |
from datetime import datetime, timedelta | |
import pycountry | |
# NewsAPI key (이것을 실제 API 키로 대체해야 합니다) | |
API_KEY = "37d83e266422487b8b2e4cb6e1ff0aa6" | |
# 국가 코드 리스트 | |
COUNTRY_CODES = "ae ar at au be bg br ca ch cn co cu cz de eg fr gb gr hk hu id ie il in it jp kr lt lv ma mx my ng nl no nz ph pl pt ro rs ru sa se sg si sk th tr tw ua us ve za".split() | |
# 국가 코드와 이름 매핑 | |
COUNTRIES = {'all': 'All Countries'} | |
for code in COUNTRY_CODES: | |
try: | |
country = pycountry.countries.get(alpha_2=code.upper()) | |
COUNTRIES[code] = country.name | |
except AttributeError: | |
COUNTRIES[code] = code.upper() # 국가 이름을 찾지 못한 경우 코드를 대문자로 사용 | |
def get_news(keyword, article_count, country): | |
base_url = "https://newsapi.org/v2/top-headlines" if country != 'all' else "https://newsapi.org/v2/everything" | |
two_days_ago = (datetime.utcnow() - timedelta(hours=48)).isoformat() | |
params = { | |
'apiKey': API_KEY, | |
'q': keyword, | |
'from': two_days_ago, | |
'language': 'en', | |
'sortBy': 'publishedAt', | |
'pageSize': article_count | |
} | |
if country != 'all': | |
params['country'] = country | |
try: | |
response = requests.get(base_url, params=params, timeout=10) | |
response.raise_for_status() | |
news_data = response.json() | |
except requests.RequestException as e: | |
return f"<p style='color: red;'>Error fetching news: {str(e)}</p>" | |
if news_data['status'] != 'ok': | |
return f"<p style='color: red;'>API Error: {news_data.get('message', 'Unknown error occurred')}</p>" | |
articles = news_data['articles'] | |
if not articles: | |
return (f"<p>No recent news found for the keyword '<strong>{keyword}</strong>' within the last 48 hours.<br>" | |
f"Try a different keyword or check back later.</p>") | |
html_output = f"<h2>News results for '{keyword}' in {COUNTRIES[country]}</h2>" | |
for article in articles: | |
title = article['title'] | |
link = article['url'] | |
pub_date = datetime.strptime(article['publishedAt'], "%Y-%m-%dT%H:%M:%SZ") | |
source = article.get('source', {}).get('name', 'Unknown Source') | |
html_output += f""" | |
<div style='margin-bottom: 20px; padding: 10px; border: 1px solid #ddd; border-radius: 5px;'> | |
<h3><a href='{link}' target='_blank' style='text-decoration: none; color: #1a0dab;'>{title}</a></h3> | |
<p style='color: #006621;'>{source}</p> | |
<p style='color: #545454;'>{pub_date.strftime('%Y-%m-%d %H:%M:%S')}</p> | |
</div> | |
""" | |
return html_output | |
iface = gr.Interface( | |
fn=get_news, | |
inputs=[ | |
gr.Textbox(label="Enter keyword"), | |
gr.Slider(minimum=10, maximum=100, step=10, value=10, label="Number of Articles"), | |
gr.Dropdown(choices=list(COUNTRIES.values()), value="All Countries", label="Select Country") | |
], | |
outputs=gr.HTML(), | |
title="Enhanced Visual News Search", | |
description="Search for news articles from the last 48 hours using NewsAPI.", | |
theme=gr.themes.Soft() | |
) | |
iface.launch() |