matsuap commited on
Commit
ae968de
·
1 Parent(s): ee199e4

Enhance news fetching functionality with language support and update UI for multilingual input options.

Browse files
Files changed (1) hide show
  1. app.py +45 -19
app.py CHANGED
@@ -4,30 +4,46 @@ import pandas as pd
4
  from dotenv import load_dotenv
5
  import os
6
 
7
- # .envファイルの読み込み
8
  load_dotenv()
9
 
10
- # 環境変数からAPIキーやURLを取得
11
- API_KEY = os.getenv("API_KEY")
12
  NEWS_API_URL = os.getenv("NEWS_API_URL")
 
13
 
14
- def fetch_news(query="ecolab", sort_by="publishedAt", page_size=10):
15
  """
16
  NewsAPIからニュース情報を取得する関数
17
  """
18
  try:
 
19
  headers = {
20
- "Authorization": f"Bearer {API_KEY}",
21
  "User-Agent": "NewsApp/1.0"
22
  }
23
 
 
24
  params = {
25
  "q": query,
26
  "sortBy": sort_by,
27
  "pageSize": page_size,
28
- "language": "en"
29
  }
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  response = requests.get(NEWS_API_URL, headers=headers, params=params)
32
 
33
  if response.status_code == 200:
@@ -60,26 +76,23 @@ def fetch_news(query="ecolab", sort_by="publishedAt", page_size=10):
60
  except Exception as e:
61
  return pd.DataFrame(), f"❌ エラーが発生しました: {str(e)}"
62
 
63
- def search_news(query: str, sort_by: str, page_size: int):
64
  """
65
  Main function for searching news.
66
 
67
  Args:
68
  query (str): The search keyword for news articles.
69
  sort_by (str): The sorting method for the news results.
70
- Options are "publishedAt", "relevancy", or "popularity".
71
  page_size (int): The number of news articles to retrieve.
 
72
 
73
  Returns:
74
- tuple:
75
- - pd.DataFrame: A DataFrame containing the news articles.
76
- Columns include "タイトル", "説明", "ソース", "公開日", and "URL".
77
- - str: A status message indicating the result of the search.
78
  """
79
  if not query.strip():
80
  return pd.DataFrame(), "❌ 検索キーワードを入力してください"
81
 
82
- df, message = fetch_news(query, sort_by, page_size)
83
  return df, message
84
 
85
  # Gradioインターフェース
@@ -90,9 +103,11 @@ with gr.Blocks(title="📰 News API アプリ", theme=gr.themes.Soft()) as demo:
90
 
91
  NewsAPIを使用してリアルタイムのニュース情報を検索・取得できます。
92
 
 
 
93
  **使い方:**
94
- 1. 検索キーワードを入力
95
- 2. ソート方法を選択
96
  3. 取得件数を選択
97
  4. 「ニュース検索」ボタンをクリック
98
  """
@@ -103,10 +118,21 @@ with gr.Blocks(title="📰 News API アプリ", theme=gr.themes.Soft()) as demo:
103
  # 入力コンポーネント
104
  query_input = gr.Textbox(
105
  label="🔍 検索キーワード",
106
- placeholder="例: ecolab, technology, business...",
107
  value="ecolab"
108
  )
109
 
 
 
 
 
 
 
 
 
 
 
 
110
  sort_by_dropdown = gr.Dropdown(
111
  choices=["publishedAt", "relevancy", "popularity"],
112
  label="📊 ソート方法",
@@ -141,7 +167,7 @@ with gr.Blocks(title="📰 News API アプリ", theme=gr.themes.Soft()) as demo:
141
  # イベントハンドラー
142
  search_btn.click(
143
  fn=search_news,
144
- inputs=[query_input, sort_by_dropdown, page_size_slider],
145
  outputs=[results_df, status_output],
146
  show_api=True,
147
  )
@@ -149,14 +175,14 @@ with gr.Blocks(title="📰 News API アプリ", theme=gr.themes.Soft()) as demo:
149
  # Enter キーでも検索可能
150
  query_input.submit(
151
  fn=search_news,
152
- inputs=[query_input, sort_by_dropdown, page_size_slider],
153
  outputs=[results_df, status_output],
154
  show_api=False,
155
  )
156
 
157
  # 初期ロード時にデフォルト検索を実行
158
  demo.load(
159
- fn=lambda: search_news("ecolab", "publishedAt", 10),
160
  outputs=[results_df, status_output],
161
  show_api=False,
162
  )
 
4
  from dotenv import load_dotenv
5
  import os
6
 
 
7
  load_dotenv()
8
 
9
+ # NewsAPI設定
 
10
  NEWS_API_URL = os.getenv("NEWS_API_URL")
11
+ API_KEY = os.getenv("API_KEY")
12
 
13
+ def fetch_news(query="ecolab", sort_by="publishedAt", page_size=10, language="auto"):
14
  """
15
  NewsAPIからニュース情報を取得する関数
16
  """
17
  try:
18
+ # NewsAPIの正しいヘッダー形式
19
  headers = {
20
+ "X-API-Key": API_KEY,
21
  "User-Agent": "NewsApp/1.0"
22
  }
23
 
24
+ # 日本語検索の場合は日本語も含める
25
  params = {
26
  "q": query,
27
  "sortBy": sort_by,
28
  "pageSize": page_size,
 
29
  }
30
 
31
+ # 言語設定を動的に決定
32
+ if language == "all":
33
+ # すべての言語で検索(言語制限なし)
34
+ pass
35
+ elif language == "jp":
36
+ # 日本語のソースも含めるため、言語制限を外すか日本語圏のソースを指定
37
+ pass # NewsAPIの日本語サポートは限定的なので制限を外す
38
+ elif language == "en":
39
+ params["language"] = "en"
40
+ elif language == "auto":
41
+ # 日本語文字が含まれている場合は言語制限を外す
42
+ if any('\u3040' <= char <= '\u309F' or '\u30A0' <= char <= '\u30FF' or '\u4E00' <= char <= '\u9FAF' for char in query):
43
+ pass # 言語制限なしで検索
44
+ else:
45
+ params["language"] = "en"
46
+
47
  response = requests.get(NEWS_API_URL, headers=headers, params=params)
48
 
49
  if response.status_code == 200:
 
76
  except Exception as e:
77
  return pd.DataFrame(), f"❌ エラーが発生しました: {str(e)}"
78
 
79
+ def search_news(query: str, sort_by: str, page_size: int, language: str = "auto"):
80
  """
81
  Main function for searching news.
82
 
83
  Args:
84
  query (str): The search keyword for news articles.
85
  sort_by (str): The sorting method for the news results.
 
86
  page_size (int): The number of news articles to retrieve.
87
+ language (str): Language for search results.
88
 
89
  Returns:
90
+ tuple: DataFrame and status message
 
 
 
91
  """
92
  if not query.strip():
93
  return pd.DataFrame(), "❌ 検索キーワードを入力してください"
94
 
95
+ df, message = fetch_news(query, sort_by, page_size, language)
96
  return df, message
97
 
98
  # Gradioインターフェース
 
103
 
104
  NewsAPIを使用してリアルタイムのニュース情報を検索・取得できます。
105
 
106
+ **🔥 日本語検索対応!**
107
+
108
  **使い方:**
109
+ 1. 検索キーワードを入力(日本語・英語両方対応)
110
+ 2. 言語とソート方法を選択
111
  3. 取得件数を選択
112
  4. 「ニュース検索」ボタンをクリック
113
  """
 
118
  # 入力コンポーネント
119
  query_input = gr.Textbox(
120
  label="🔍 検索キーワード",
121
+ placeholder="例: 東京, トヨタ, AI, ecolab, technology...",
122
  value="ecolab"
123
  )
124
 
125
+ language_dropdown = gr.Dropdown(
126
+ choices=[
127
+ ("自動検出", "auto"),
128
+ ("日本語", "jp"),
129
+ ("英語", "en"),
130
+ ("すべての言語", "all")
131
+ ],
132
+ label="🌐 言語",
133
+ value="auto"
134
+ )
135
+
136
  sort_by_dropdown = gr.Dropdown(
137
  choices=["publishedAt", "relevancy", "popularity"],
138
  label="📊 ソート方法",
 
167
  # イベントハンドラー
168
  search_btn.click(
169
  fn=search_news,
170
+ inputs=[query_input, sort_by_dropdown, page_size_slider, language_dropdown],
171
  outputs=[results_df, status_output],
172
  show_api=True,
173
  )
 
175
  # Enter キーでも検索可能
176
  query_input.submit(
177
  fn=search_news,
178
+ inputs=[query_input, sort_by_dropdown, page_size_slider, language_dropdown],
179
  outputs=[results_df, status_output],
180
  show_api=False,
181
  )
182
 
183
  # 初期ロード時にデフォルト検索を実行
184
  demo.load(
185
+ fn=lambda: search_news("ecolab", "publishedAt", 10, "auto"),
186
  outputs=[results_df, status_output],
187
  show_api=False,
188
  )