Spaces:
Building
Building
File size: 5,653 Bytes
09ebcd0 eec4d01 efb5f18 09ebcd0 6097fb2 1b298f9 34db24b 6097fb2 1b298f9 8415ea5 6097fb2 eec4d01 8415ea5 eec4d01 1b298f9 6097fb2 eec4d01 6097fb2 ba53ac8 6097fb2 ba53ac8 1b298f9 a31c3ed ef406af e312573 8415ea5 e312573 3adcf52 5713020 ef406af 5713020 e312573 cd6f220 23588da e312573 cd6f220 5713020 e312573 b66c71d 482bc99 6097fb2 2748048 a4f4206 ef406af 73ed8f5 ba53ac8 dc63a3a ebc2f8d c43d42c 2748048 dc63a3a 2748048 dc63a3a 2748048 ebc2f8d dc63a3a ef406af e312573 dc63a3a 23588da dc63a3a ef406af dc63a3a 2748048 c5cb552 dc63a3a 2748048 dc63a3a ba53ac8 2748048 dc63a3a ef406af efb5f18 ef406af 158b524 8415ea5 ae814df e312573 68a8b0c 43da967 ba53ac8 6097fb2 ab30506 2748048 ad0f104 d0b4b99 2748048 ef406af 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 152 153 154 155 156 157 158 159 160 161 |
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):
print(f"Received time string: '{time_str}'")
if not time_str:
print("Empty time string, returning False")
return False
time_str = time_str.lower().strip()
print(f"Processed time string: '{time_str}'")
if "1 day ago" in time_str:
print("Matched '1 day ago', returning True")
return True
if "hours ago" in time_str:
print("Matched 'hours ago', returning True")
return True
print(f"No match found for '{time_str}', returning False")
return False
def format_results(results):
all_results = "## 모든 뉴스 결과\n\n"
recent_results = "## 최근 뉴스 결과 (1일 이내)\n\n"
debug_info = "## 디버그 정보\n\n"
debug_table = "## 디버깅 결과 표\n\n"
debug_table += "| 제목 | 링크 | 시간 | 최근 여부 |\n"
debug_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", "알 수 없는 시간")
print(f"\nProcessing news item: {title}")
print(f"Time string from API: '{time_str}'")
is_recent = is_recent_news(time_str)
debug_info += f"기사: {title}\n시간: {time_str}, 최근 여부: {is_recent}\n\n"
# 디버깅 결과 표에 행 추가
debug_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"
debug_table += f"| 오류 발생 | - | - | - |\n"
return all_results, recent_results, debug_info + "\n\n" + debug_table
def serphouse_search(query, country, page, num_result):
results = search_serphouse(query, country, page, num_result)
all_results, recent_results, debug_info = format_results(results)
return all_results, recent_results, 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.Markdown(label="모든 결과"),
gr.Markdown(label="최근 결과 (1일 이내)"),
gr.Markdown(label="디버그 정보 및 결과 표")
],
title="SERPHouse 뉴스 검색 인터페이스",
description="검색어를 입력하고 국가를 선택하여 SERPHouse API에서 뉴스 결과를 가져옵니다. 최근 결과(1일 이내)는 별도로 표시됩니다.",
theme="Nymbo/Nymbo_Theme",
css=css
)
iface.launch() |