Spaces:
Building
Building
import gradio as gr | |
import requests | |
import json | |
from datetime import datetime, timedelta | |
API_KEY = "V38CNn4HXpLtynJQyOeoUensTEYoFy8PBUxKpDqAW1pawT1vfJ2BWtPQ98h6" | |
MAJOR_COUNTRIES = [ | |
"United States", "United Kingdom", "Canada", "Australia", "Germany", | |
"France", "Japan", "South Korea", "China", "India", | |
"Brazil", "Mexico", "Russia", "Italy", "Spain", | |
"Netherlands", "Sweden", "Switzerland", "Norway", "Denmark", | |
"Finland", "Belgium", "Austria", "New Zealand", "Ireland", | |
"Singapore", "Hong Kong", "Israel", "United Arab Emirates", "Saudi Arabia", | |
"South Africa", "Turkey", "Egypt", "Poland", "Czech Republic", | |
"Hungary", "Greece", "Portugal", "Argentina", "Chile", | |
"Colombia", "Peru", "Venezuela", "Thailand", "Malaysia", | |
"Indonesia", "Philippines", "Vietnam", "Pakistan", "Bangladesh" | |
] | |
def search_serphouse(query, country, verbatim, page, num_result): | |
url = "https://api.serphouse.com/serp/live" | |
payload = { | |
"data": { | |
"q": query, | |
"domain": "google.com", | |
"loc": country, | |
"lang": "en", | |
"device": "desktop", | |
"serp_type": "news", | |
"page": str(page), | |
"verbatim": verbatim, | |
"num": str(num_result) | |
} | |
} | |
headers = { | |
"accept": "application/json", | |
"content-type": "application/json", | |
"authorization": f"Bearer {API_KEY}" | |
} | |
try: | |
response = requests.post(url, json=payload, headers=headers) | |
response.raise_for_status() | |
return response.json() | |
except requests.RequestException as e: | |
return f"Error: {str(e)}" | |
def is_within_24_hours(time_str): | |
time_parts = time_str.split() | |
if len(time_parts) >= 2: | |
try: | |
value = int(time_parts[0]) | |
unit = time_parts[1].lower() | |
if unit in ['minute', 'minutes', 'hour', 'hours']: | |
return True | |
elif unit == 'day' and value == 1: | |
return True | |
except ValueError: | |
pass | |
return False | |
def format_results(results): | |
html_output = """ | |
<style> | |
.news-container { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; } | |
.news-item { background-color: #f9f9f9; border: 1px solid #ddd; padding: 20px; margin-bottom: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } | |
.news-title { font-size: 20px; color: #1a0dab; text-decoration: none; font-weight: bold; } | |
.news-title:hover { text-decoration: underline; } | |
.news-snippet { color: #545454; margin: 15px 0; line-height: 1.4; } | |
.news-meta { font-size: 14px; color: #006621; } | |
.no-results { text-align: center; color: #666; font-style: italic; } | |
.debug-info { background-color: #f0f0f0; padding: 10px; margin-top: 20px; border-radius: 5px; white-space: pre-wrap; } | |
</style> | |
<div class="news-container"> | |
<h2 style="text-align: center; color: #333;">Search Results (Last 24 Hours)</h2> | |
""" | |
# 디버깅 정보 추가 | |
html_output += f'<div class="debug-info"><h3>Debug Info:</h3><pre>{json.dumps(results, indent=2)}</pre></div>' | |
try: | |
if isinstance(results, dict) and "results" in results: | |
news_results = results["results"].get("news", []) | |
filtered_results = [result for result in news_results if is_within_24_hours(result.get("time", "").strip())] | |
if not filtered_results: | |
html_output += '<p class="no-results">No news results found within the last 24 hours.</p>' | |
else: | |
for result in filtered_results: | |
html_output += f""" | |
<div class="news-item"> | |
<a href="{result.get('url', '#')}" class="news-title" target="_blank">{result.get('title', 'No Title')}</a> | |
<p class="news-snippet">{result.get('snippet', 'No Snippet')}</p> | |
<p class="news-meta">Source: {result.get('channel', 'Unknown')} - {result.get('time', 'Unknown time')}</p> | |
</div> | |
""" | |
else: | |
html_output += f'<p class="no-results">Unexpected response format: {type(results)}</p>' | |
except Exception as e: | |
html_output += f'<p class="no-results">Error processing results: {str(e)}</p>' | |
html_output += "</div>" | |
return html_output | |
def serphouse_search(query, country, verbatim, page, num_result): | |
verbatim = "1" if verbatim else "0" | |
results = search_serphouse(query, country, verbatim, page, num_result) | |
return format_results(results) | |
css = """ | |
footer { | |
visibility: hidden; | |
} | |
""" | |
iface = gr.Interface( | |
fn=serphouse_search, | |
inputs=[ | |
gr.Textbox(label="Search Query"), | |
gr.Dropdown(MAJOR_COUNTRIES, label="Country"), | |
gr.Checkbox(label="Verbatim"), | |
gr.Slider(1, 10, 1, label="Page"), | |
gr.Slider(1, 100, 10, label="Number of Results") | |
], | |
outputs="html", | |
title="SERPHouse News Search Interface", | |
description="Enter your search query and select a country to get news results from the SERPHouse API. Only articles from the last 24 hours will be displayed.", | |
theme="Nymbo/Nymbo_Theme", | |
css=css | |
) | |
iface.launch() |