90 lines
3.0 KiB
Python
90 lines
3.0 KiB
Python
import os
|
|
import requests
|
|
from typing import Annotated
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
def get_reuters_news(
|
|
ticker: Annotated[str, "Ticker of a company. e.g. AAPL, TSM"],
|
|
curr_date: Annotated[str, "Current date in yyyy-mm-dd format"],
|
|
look_back_days: int = 7
|
|
) -> str:
|
|
"""Get Reuters news for stock ticker"""
|
|
|
|
try:
|
|
api_key = os.getenv('REUTERS_API_KEY')
|
|
if not api_key:
|
|
return f"Reuters News: API credentials not configured"
|
|
|
|
company_name = get_company_name(ticker)
|
|
|
|
search_queries = [f"{ticker} stock", f"{company_name} earnings", f"{company_name} news"]
|
|
news_items = []
|
|
|
|
for query in search_queries:
|
|
try:
|
|
headers = {
|
|
"Authorization": f"Bearer {api_key}",
|
|
"Content-Type": "application/json"
|
|
}
|
|
|
|
url = "https://api.reuters.com/v2/articles/search"
|
|
|
|
params = {
|
|
'query': query,
|
|
'limit': 5,
|
|
'sortBy': 'publishedDateTime',
|
|
'sortOrder': 'desc'
|
|
}
|
|
|
|
response = requests.get(url, headers=headers, params=params)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
if data.get('data', {}).get('articles'):
|
|
for article in data['data']['articles'][:3]:
|
|
title = article.get('title', '')
|
|
summary = article.get('description', '')[:150]
|
|
category = article.get('category', {}).get('name', '')
|
|
if title and summary:
|
|
news_items.append(f"- [{category}] {title}: {summary}")
|
|
|
|
except Exception:
|
|
continue
|
|
|
|
if news_items:
|
|
return f"Reuters News for {ticker}:\n" + "\n".join(news_items[:8])
|
|
else:
|
|
try:
|
|
from reuterspy import ReutersPy
|
|
reuters = ReutersPy()
|
|
|
|
company_data = reuters.get_company_info(ticker)
|
|
if company_data:
|
|
return f"Reuters: {ticker} fundamental data available - {company_data[:200]}"
|
|
else:
|
|
return f"Reuters News: No recent news found for {ticker}"
|
|
|
|
except ImportError:
|
|
return f"Reuters News: No recent news found for {ticker}"
|
|
|
|
except Exception as e:
|
|
return f"Reuters News: Service unavailable - {str(e)[:50]}"
|
|
|
|
def get_company_name(ticker: str) -> str:
|
|
"""Map ticker to company name for Reuters search"""
|
|
ticker_mapping = {
|
|
"AAPL": "Apple Inc",
|
|
"MSFT": "Microsoft Corp",
|
|
"GOOGL": "Alphabet Inc",
|
|
"AMZN": "Amazon.com",
|
|
"TSLA": "Tesla Inc",
|
|
"NVDA": "NVIDIA Corp",
|
|
"META": "Meta Platforms",
|
|
"JPM": "JPMorgan Chase",
|
|
"JNJ": "Johnson & Johnson",
|
|
"V": "Visa Inc",
|
|
"TSM": "Taiwan Semiconductor"
|
|
}
|
|
return ticker_mapping.get(ticker, ticker) |