Spaces:
Paused
Paused
| import gradio as gr | |
| import requests | |
| import json | |
| from datetime import datetime, timedelta | |
| import re | |
| 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" | |
| 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" | |
| 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" | |
| return all_results, recent_results, debug_info | |
| 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() |