import gradio as gr import requests import json from functools import lru_cache from datetime import datetime, timedelta # Google Custom Search API 키와 검색 엔진 ID API_KEY = "AIzaSyB8wNdEL8-SAvelRq-zenLLU-cUEmsj7uE" SEARCH_ENGINE_ID = "c01abc75e1b95483d" # 지원되는 국가 리스트 COUNTRIES = { 'United States': 'US', 'United Kingdom': 'GB', 'Canada': 'CA', 'Australia': 'AU', 'India': 'IN', 'Germany': 'DE', 'France': 'FR', 'Japan': 'JP', 'South Korea': 'KR', 'Brazil': 'BR', 'Mexico': 'MX', 'Spain': 'ES', 'Italy': 'IT', 'Netherlands': 'NL', 'Russia': 'RU', 'Sweden': 'SE', 'Switzerland': 'CH', 'Poland': 'PL', 'Turkey': 'TR', 'Saudi Arabia': 'SA' } @lru_cache(maxsize=100) def cached_search(cache_key): return search_news_impl(*json.loads(cache_key)) def search_news(keyword, country): cache_key = json.dumps((keyword, country)) return cached_search(cache_key) def search_news_impl(keyword, country): url = "https://www.googleapis.com/customsearch/v1" # 24시간 전 날짜 계산 one_day_ago = (datetime.utcnow() - timedelta(days=1)).strftime("%Y-%m-%d") params = { 'key': API_KEY, 'cx': SEARCH_ENGINE_ID, 'q': keyword, 'dateRestrict': 'd1', # 최근 1일 내 결과만 'sort': 'date', # 날짜순 정렬 'num': 10, # 결과 수 'tbm': 'nws', # 뉴스 검색으로 제한 } if country != 'All Countries': params['gl'] = COUNTRIES[country] try: response = requests.get(url, params=params) response.raise_for_status() results = response.json() debug_info = f"API Request URL: {response.url}\n" debug_info += f"API Response Status: {response.status_code}\n" debug_info += f"API Response Headers: {json.dumps(dict(response.headers), indent=2)}\n" debug_info += f"API Response Body: {json.dumps(results, indent=2)}\n" formatted_results = "" if 'items' in results: for item in results['items']: title = item['title'] link = item['link'] snippet = item.get('snippet', 'No snippet available') published_date = item.get('pagemap', {}).get('metatags', [{}])[0].get('article:published_time', 'Unknown date') formatted_results += f"

{title}

" formatted_results += f"

Published: {published_date}

" formatted_results += f"

{snippet}


" formatted_results += f"

Total results: {len(results['items'])}

" else: formatted_results = f"No news found for '{keyword}' in {country} within the last 24 hours." except requests.exceptions.HTTPError as e: formatted_results = f"An error occurred: {str(e)}" debug_info = f"Error: {str(e)}\n" debug_info += f"API Response Status: {e.response.status_code}\n" debug_info += f"API Response Headers: {json.dumps(dict(e.response.headers), indent=2)}\n" debug_info += f"API Response Body: {e.response.text}\n" except Exception as e: formatted_results = f"An unexpected error occurred: {str(e)}" debug_info = f"Unexpected Error: {str(e)}\n" formatted_results += f"
Debug Info
{debug_info}
" return formatted_results # Gradio 인터페이스 생성 iface = gr.Interface( fn=search_news, inputs=[ gr.Textbox(label="Enter keyword (in English)"), gr.Dropdown(choices=['All Countries'] + list(COUNTRIES.keys()), label="Select Country") ], outputs=gr.HTML(), title="Google News Search", description="Search for news articles from the last 24 hours using Google Custom Search API." ) # 애플리케이션 실행 iface.launch()