73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
from datetime import datetime
|
|
from typing import Annotated
|
|
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
from .googlenews_utils import getNewsData
|
|
|
|
|
|
def get_google_news(
|
|
query: Annotated[str, "Query to search with"] = None,
|
|
ticker: Annotated[str, "Ticker symbol (alias for query)"] = None,
|
|
curr_date: Annotated[str, "Curr date in yyyy-mm-dd format"] = None,
|
|
look_back_days: Annotated[int, "how many days to look back"] = None,
|
|
start_date: Annotated[str, "Start date in yyyy-mm-dd format"] = None,
|
|
end_date: Annotated[str, "End date in yyyy-mm-dd format"] = None,
|
|
) -> str:
|
|
# Handle parameter aliasing (query or ticker)
|
|
if query:
|
|
search_query = query
|
|
elif ticker:
|
|
# Format ticker as a natural language query for better results
|
|
search_query = f"latest news on {ticker} stock"
|
|
else:
|
|
raise ValueError("Must provide either 'query' or 'ticker' parameter")
|
|
|
|
search_query = search_query.replace(" ", "+")
|
|
|
|
# Determine date range
|
|
if start_date and end_date:
|
|
before = start_date
|
|
target_date = end_date
|
|
elif curr_date and look_back_days:
|
|
target_date = curr_date
|
|
start_dt = datetime.strptime(curr_date, "%Y-%m-%d")
|
|
before = (start_dt - relativedelta(days=look_back_days)).strftime("%Y-%m-%d")
|
|
else:
|
|
raise ValueError(
|
|
"Must provide either (start_date, end_date) or (curr_date, look_back_days)"
|
|
)
|
|
|
|
news_results = getNewsData(search_query, before, target_date)
|
|
|
|
news_str = ""
|
|
|
|
for news in news_results:
|
|
news_str += (
|
|
f"### {news['title']} (source: {news['source']}, date: {news['date']})\n"
|
|
f"Link: {news['link']}\n"
|
|
f"Snippet: {news['snippet']}\n\n"
|
|
)
|
|
|
|
if len(news_results) == 0:
|
|
return ""
|
|
|
|
return f"## {search_query} Google News, from {before} to {target_date}:\n\n{news_str}"
|
|
|
|
|
|
def get_global_news_google(date: str, look_back_days: int = 3, limit: int = 5) -> str:
|
|
"""Retrieve global market news using Google News.
|
|
|
|
Args:
|
|
date: Date for news, yyyy-mm-dd
|
|
look_back_days: Days to look back
|
|
limit: Max number of articles (not strictly enforced by underlying function but good for interface)
|
|
|
|
Returns:
|
|
Global news report
|
|
"""
|
|
# Query for general market topics
|
|
return get_google_news(
|
|
query="financial markets macroeconomics", curr_date=date, look_back_days=look_back_days
|
|
)
|