File size: 5,221 Bytes
09ebcd0 eec4d01 efb5f18 09ebcd0 6097fb2 1b298f9 34db24b 6097fb2 1b298f9 8415ea5 6097fb2 eec4d01 8415ea5 eec4d01 1b298f9 6097fb2 eec4d01 6097fb2 ba53ac8 6097fb2 ba53ac8 1b298f9 a31c3ed 8415ea5 3adcf52 5713020 e312573 cd6f220 23588da e312573 cd6f220 5713020 b66c71d 482bc99 6097fb2 2748048 a4f4206 2196362 ef406af 73ed8f5 ba53ac8 dc63a3a ebc2f8d c43d42c 2748048 dc63a3a 2748048 dc63a3a 2748048 ebc2f8d dc63a3a 23588da dc63a3a 2196362 ef406af dc63a3a 2748048 c5cb552 dc63a3a 2748048 dc63a3a ba53ac8 2748048 dc63a3a 2196362 efb5f18 2196362 158b524 8415ea5 2196362 68a8b0c 43da967 ba53ac8 6097fb2 ab30506 2748048 ad0f104 d0b4b99 2748048 2196362 d0b4b99 2748048 43da967 ad0f104 2748048 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
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"
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)
}
}
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_recent_news(time_str):
if not time_str:
return False
time_str = time_str.lower().strip()
if "1 day ago" in time_str:
return True
if "hours ago" in time_str:
return True
return False
def format_results(results):
all_results = "## 모든 뉴스 결과\n\n"
recent_results = "## 최근 뉴스 결과 (1일 이내)\n\n"
debug_info = "## 디버그 정보\n\n"
result_table = "## 뉴스 결과 표\n\n"
result_table += "| 제목 | 링크 | 시간 | 최근 여부 |\n"
result_table += "|------|------|------|----------|\n"
debug_info += f"Raw API Response:\n```json\n{json.dumps(results, indent=2)}\n```\n\n"
try:
if not isinstance(results, dict):
raise ValueError("Results is not a dictionary")
if "results" not in results:
raise ValueError("No 'results' key in the response")
news_results = results["results"].get("news", [])
debug_info += f"뉴스 결과 수: {len(news_results)}\n\n"
for result in news_results:
title = result.get("title", "제목 없음")
url = result.get("url", "#")
snippet = result.get("snippet", "내용 없음")
channel = result.get("channel", "알 수 없음")
time_str = result.get("time", "알 수 없는 시간")
is_recent = is_recent_news(time_str)
debug_info += f"기사: {title}\n시간: {time_str}, 최근 여부: {is_recent}\n\n"
# 결과 표에 행 추가
result_table += f"| {title[:30]}... | [{url[:30]}...]({url}) | {time_str} | {is_recent} |\n"
article_info = f"""
### [{title}]({url})
{snippet}
**출처:** {channel} - {time_str}
---
"""
all_results += article_info
if is_recent:
recent_results += article_info
if recent_results == "## 최근 뉴스 결과 (1일 이내)\n\n":
recent_results += "*1일 이내의 최근 뉴스 결과가 없습니다.*\n\n"
except Exception as e:
error_message = f"결과 처리 중 오류 발생: {str(e)}"
debug_info += error_message + "\n"
all_results = error_message + "\n\n"
recent_results = error_message + "\n\n"
result_table += f"| 오류 발생 | - | - | - |\n"
return all_results, recent_results, result_table + "\n\n" + debug_info
def serphouse_search(query, country, page, num_result):
results = search_serphouse(query, country, page, num_result)
all_results, recent_results, result_table_and_debug = format_results(results)
return all_results, recent_results, result_table_and_debug
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.Markdown(label="모든 결과"),
gr.Markdown(label="최근 결과 (1일 이내)"),
gr.Markdown(label="결과 표 및 디버그 정보")
],
title="SERPHouse 뉴스 검색 인터페이스",
description="검색어를 입력하고 국가를 선택하여 SERPHouse API에서 뉴스 결과를 가져옵니다. 최근 결과(1일 이내)는 별도로 표시됩니다.",
theme="Nymbo/Nymbo_Theme",
css=css
)
iface.launch() |