File size: 3,828 Bytes
5947621
09ebcd0
 
 
 
 
 
4409afe
1ac298a
09ebcd0
1d7a9d5
 
 
 
 
5947621
1d7a9d5
 
5947621
4409afe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68a8b0c
 
4409afe
1d7a9d5
09ebcd0
 
 
f42fdaf
68a8b0c
f42fdaf
68a8b0c
09ebcd0
 
 
 
 
f42fdaf
09ebcd0
f42fdaf
68a8b0c
09ebcd0
68a8b0c
 
ab30506
68a8b0c
5947621
09ebcd0
ab30506
4409afe
1d7a9d5
68a8b0c
 
 
b659602
 
 
 
 
 
 
 
 
68a8b0c
09ebcd0
b659602
68a8b0c
ab30506
 
 
1d7a9d5
 
 
ad0f104
b659602
4409afe
 
b659602
ad0f104
 
ab30506
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

import gradio as gr
import requests
from datetime import datetime, timedelta
import pycountry
import json

# NewsAPI key
API_KEY = "37d83e266422487b8b2e4cb6e1ff0aa6"

# 국가 코드 리스트
COUNTRY_CODES = "ae ar at au be bg br ca ch cn co cu cz de eg fr gb gr hk hu id ie il in it jp kr lt lv ma mx my ng nl no nz ph pl pt ro rs ru sa se sg si sk th tr tw ua us ve za".split()

# 국가 코드와 이름 매핑
COUNTRIES = {'all': 'All Countries'}
COUNTRIES.update({code: pycountry.countries.get(alpha_2=code.upper()).name for code in COUNTRY_CODES if pycountry.countries.get(alpha_2=code.upper())})

def get_news(keyword, article_count, country):
    country_code = next((code for code, name in COUNTRIES.items() if name == country), 'all')
    
    if country_code == 'all':
        base_url = "https://newsapi.org/v2/everything"
        params = {
            'apiKey': API_KEY,
            'q': keyword,
            'language': 'en',
            'sortBy': 'publishedAt',
            'pageSize': article_count
        }
    else:
        base_url = "https://newsapi.org/v2/top-headlines"
        params = {
            'apiKey': API_KEY,
            'q': keyword,
            'country': country_code,
            'pageSize': article_count
        }
    
    two_days_ago = (datetime.utcnow() - timedelta(hours=48)).isoformat()
    params['from'] = two_days_ago

    debug_info = f"API Request URL: {base_url}\n"
    debug_info += f"Parameters: {json.dumps(params, indent=2)}\n\n"

    try:
        response = requests.get(base_url, params=params, timeout=10)
        response.raise_for_status()
        news_data = response.json()

        debug_info += f"API Response Status: {response.status_code}\n"
        debug_info += f"API Response Headers: {json.dumps(dict(response.headers), indent=2)}\n\n"
        debug_info += f"API Response Body: {json.dumps(news_data, indent=2)}\n\n"

    except requests.RequestException as e:
        return f"<p style='color: red;'>Error fetching news: {str(e)}</p><pre>{debug_info}</pre>"

    if news_data['status'] != 'ok':
        return f"<p style='color: red;'>API Error: {news_data.get('message', 'Unknown error occurred')}</p><pre>{debug_info}</pre>"

    articles = news_data['articles']
    
    if not articles:
        return (f"<p>No recent news found for the keyword '<strong>{keyword}</strong>' in {country} within the last 48 hours.<br>"
                f"Try a different keyword or check back later.</p><pre>{debug_info}</pre>")

    html_output = f"<h2>News results for '{keyword}' in {country}</h2>"
    for article in articles:
        title = article['title']
        link = article['url']
        pub_date = datetime.strptime(article['publishedAt'], "%Y-%m-%dT%H:%M:%SZ")
        source = article.get('source', {}).get('name', 'Unknown Source')
        
        html_output += f"""
        <div style='margin-bottom: 20px; padding: 10px; border: 1px solid #ddd; border-radius: 5px;'>
            <h3><a href='{link}' target='_blank' style='text-decoration: none; color: #1a0dab;'>{title}</a></h3>
            <p style='color: #006621;'>{source}</p>
            <p style='color: #545454;'>{pub_date.strftime('%Y-%m-%d %H:%M:%S')}</p>
        </div>
        """

    html_output += f"<details><summary>Debug Info</summary><pre>{debug_info}</pre></details>"
    return html_output

iface = gr.Interface(
    fn=get_news,
    inputs=[
        gr.Textbox(label="Enter keyword"),
        gr.Slider(minimum=10, maximum=100, step=10, value=10, label="Number of Articles"),
        gr.Dropdown(choices=list(COUNTRIES.values()), value="All Countries", label="Select Country")
    ],
    outputs=gr.HTML(),
    title="Enhanced Visual News Search",
    description="Search for news articles from the last 48 hours using NewsAPI.",
    theme=gr.themes.Soft()
)

iface.launch()