| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import os
- import requests
- from snownlp import SnowNLP
- import smtplib
- from email.message import EmailMessage
- from datetime import datetime
- # Configuration
- NEWS_API_KEY = os.getenv('NEWS_API_KEY') # Get from https://newsapi.org
- EMAIL_ADDRESS = os.getenv('EMAIL_ADDRESS')
- EMAIL_PASSWORD = os.getenv('EMAIL_PASSWORD')
- SEARCH_TERMS = "新能源 OR IPO OR 电动汽车 IPO OR 中国汽车"
- # def fetch_news():
- # """Fetch Chinese news articles about new energy/car IPOs"""
- # url = 'https://newsapi.org/v2/everything'
- # params = {
- # 'q': SEARCH_TERMS,
- # 'language': 'zh',
- # 'sortBy': 'publishedAt',
- # 'apiKey': NEWS_API_KEY,
- # 'pageSize': 20
- # }
- # print(f"NEWS_API_KEY: {NEWS_API_KEY}")
- # response = requests.get(url, params=params)
- # response.raise_for_status()
- # return response.json().get('articles', [])
- def fetch_news():
- """Fetch top headlines about new energy/car IPOs in China and Hong Kong"""
- url = 'https://newsapi.org/v2/top-headlines'
- params = {
- 'q': SEARCH_TERMS,
- 'language': 'zh',
- 'apiKey': NEWS_API_KEY,
- 'pageSize': 20,
- 'country': 'cn', # Country code for China
- # 'country': 'hk', # Uncomment this line to switch to Hong Kong
- }
- print(f"NEWS_API_KEY: {NEWS_API_KEY}")
- response = requests.get(url, params=params)
- response.raise_for_status()
-
- print(f"Complete URL for testing: {response.request.url}")
- print(f"Request Params: {params}")
- print(f"Response Status Code: {response.status_code}")
- print(f"Response Content: {response.text}")
- return response.json().get('articles', [])
- def analyze_articles(articles):
- """Analyze sentiment and filter relevant news"""
- processed = []
-
- for article in articles:
- content = f"{article['title']}. {article['description']}"
- sentiment = SnowNLP(content).sentiments
-
- # Filter criteria (adjust as needed)
- if any(keyword in content for keyword in ["IPO", "上市", "申购"]) and sentiment >= 0.4:
- processed.append({
- 'title': article['title'],
- 'url': article['url'],
- 'source': article['source']['name'],
- 'date': article['publishedAt'],
- 'sentiment': round(sentiment, 2)
- })
-
- return processed
- def send_notification(articles, debug_mode=True):
- """Send alerts to console (debug) or email (production)"""
- if not articles:
- return
- if debug_mode:
- # Console output version
- print(f"\n=== IPO Alerts ({datetime.now().strftime('%Y-%m-%d %H:%M')}) ===")
- for idx, article in enumerate(articles, 1):
- print(f"{idx}. {article['title']}")
- print(f" Source: {article['source']}")
- print(f" Sentiment: {article['sentiment']}")
- print(f" URL: {article['url']}")
- print(f" Date: {article['date']}\n{'-'*50}")
- else:
- # Original email version (kept for reference)
- msg = EmailMessage()
- msg['Subject'] = f"新能源IPO警报 - {datetime.now().strftime('%Y-%m-%d %H:%M')}"
- msg['From'] = EMAIL_ADDRESS
- msg['To'] = EMAIL_ADDRESS
-
- email_body = "发现重要IPO相关新闻:\n\n"
- for idx, article in enumerate(articles, 1):
- email_body += f"""【{idx}】{article['title']}
- - 来源: {article['source']}
- - 情绪值: {article['sentiment']}
- - 链接: {article['url']}
- - 时间: {article['date']}
- \n"""
-
- msg.set_content(email_body)
-
- with smtplib.SMTP('smtp.gmail.com', 587) as server:
- server.starttls()
- server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
- server.send_message(msg)
- def main():
- # Step 1: Fetch news
- articles = fetch_news()
-
- # Step 2: Analyze content
- filtered_articles = analyze_articles(articles)
-
- # Step 3: Send notification (debug mode to console)
- if filtered_articles:
- send_notification(filtered_articles, debug_mode=True)
- print(f"Found {len(filtered_articles)} relevant articles")
- else:
- print("No significant updates found")
- if __name__ == "__main__":
- main()
|