ainews-db / app.py
seawolf2357's picture
Update app.py
c56613a verified
raw
history blame
5.16 kB
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, page, num_result):
url = "https://api.serphouse.com/serp/live"
now = datetime.utcnow()
yesterday = now - timedelta(days=1)
date_range = f"{yesterday.strftime('%Y-%m-%d')},{now.strftime('%Y-%m-%d')}"
payload = {
"data": {
"q": query,
"domain": "google.com",
"loc": country,
"lang": "en",
"device": "desktop",
"serp_type": "news",
"page": str(page),
"verbatim": "1",
"num": str(num_result),
"date_range": date_range
}
}
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:
error_msg = f"Error: {str(e)}"
if response.text:
error_msg += f"\nResponse content: {response.text}"
return {"error": error_msg}
def format_results_from_raw(results):
try:
if isinstance(results, dict) and "error" in results:
return "Error: " + results["error"]
if not isinstance(results, dict):
raise ValueError("๊ฒฐ๊ณผ๊ฐ€ ์‚ฌ์ „ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.")
# 'results' ํ‚ค ๋‚ด๋ถ€์˜ ๊ตฌ์กฐ ํ™•์ธ
if 'results' in results:
results_content = results['results']
# 'news' ๋˜๋Š” 'organic' ํ‚ค ํ™•์ธ
if 'news' in results_content:
news_results = results_content['news']
elif 'organic' in results_content:
news_results = results_content['organic']
else:
news_results = []
else:
news_results = []
if not news_results:
return "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."
formatted_articles = ""
for result in news_results:
title = result.get("title", "์ œ๋ชฉ ์—†์Œ")
link = result.get("url", result.get("link", "#"))
snippet = result.get("snippet", "๋‚ด์šฉ ์—†์Œ")
channel = result.get("channel", result.get("source", "์•Œ ์ˆ˜ ์—†์Œ"))
time = result.get("time", result.get("date", "์•Œ ์ˆ˜ ์—†๋Š” ์‹œ๊ฐ„"))
image_url = result.get("img", result.get("thumbnail", ""))
# ์ด๋ฏธ์ง€ ํƒœ๊ทธ ์ƒ์„ฑ
if image_url:
image_html = f'<img src="{image_url}" alt="Image" style="max-width: 100%; height: auto;">'
else:
image_html = ''
article_html = f"""
<div style="margin-bottom: 20px; border-bottom: 1px solid #ccc; padding-bottom: 20px;">
<h3><a href="{link}" target="_blank">{title}</a></h3>
<p><strong>{channel}</strong> - {time}</p>
{image_html}
<p>{snippet}</p>
</div>
"""
formatted_articles += article_html
return formatted_articles
except Exception as e:
return f"๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}"
def serphouse_search(query, country, page, num_result):
results = search_serphouse(query, country, page, num_result)
# ๋””๋ฒ„๊ทธ ์ •๋ณด ์ƒ์„ฑ
debug_info = f"Raw API Response:\n{json.dumps(results, indent=2, ensure_ascii=False)}\n\n"
# ๊ธฐ์‚ฌ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
formatted_articles = format_results_from_raw(results)
# ๊ธฐ์‚ฌ ๋ฆฌ์ŠคํŠธ์™€ ๋””๋ฒ„๊ทธ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜
return formatted_articles, debug_info
css = """
footer {
visibility: hidden;
}
"""
iface = gr.Interface(
fn=serphouse_search,
inputs=[
gr.Textbox(label="๊ฒ€์ƒ‰์–ด"),
gr.Dropdown(MAJOR_COUNTRIES, label="๊ตญ๊ฐ€"),
gr.Slider(1, 10, 1, label="ํŽ˜์ด์ง€"),
gr.Slider(1, 100, 10, label="๊ฒฐ๊ณผ ์ˆ˜")
],
outputs=[
gr.HTML(label="๋‰ด์Šค ๊ฒฐ๊ณผ"),
gr.Textbox(label="๋””๋ฒ„๊ทธ ์ •๋ณด", lines=10)
],
title="24์‹œ๊ฐ„ ์ด๋‚ด ๋‰ด์Šค ๊ฒ€์ƒ‰ ์ธํ„ฐํŽ˜์ด์Šค",
description="๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๊ตญ๊ฐ€๋ฅผ ์„ ํƒํ•˜์—ฌ 24์‹œ๊ฐ„ ์ด๋‚ด์˜ ๋‰ด์Šค ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.",
theme="Nymbo/Nymbo_Theme",
css=css
)
iface.launch(auth=("gini", "pick"))