├── .github └── workflows │ └── rss-bot.yml ├── README.md ├── financebot.py └── requirements.txt /.github/workflows/rss-bot.yml: -------------------------------------------------------------------------------- 1 | name: 📡 RSS 财经新闻自动推送 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' # 北京时间 9:00 (UTC 1:00) 6 | - cron: '0 10 * * *' # 北京时间 17:00 (UTC 9:00) 7 | 8 | workflow_dispatch: # 允许手动触发 9 | 10 | jobs: 11 | run-script: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: 📥 克隆仓库 15 | uses: actions/checkout@v3 16 | 17 | - name: 🛠️ 设置 Python 环境 18 | uses: actions/setup-python@v4 19 | with: 20 | python-version: '3.9' 21 | 22 | - name: 📦 安装依赖 23 | run: | 24 | cd $GITHUB_WORKSPACE 25 | pip install -U pip setuptools wheel 26 | pip install lxml[html_clean] 27 | pip install -r requirements.txt 28 | 29 | - name: 🔑 设置环境变量 30 | run: | 31 | echo "OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> $GITHUB_ENV 32 | echo "SERVER_CHAN_KEYS=${{ secrets.SERVER_CHAN_KEYS }}" >> $GITHUB_ENV 33 | 34 | - name: 🚀 运行脚本 35 | run: python financebot.py 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 📈 FinNewsCollectionBot · 每日财经速递 2 | 3 | **为专业投资者打造的智能财经资讯助手** 4 | 5 | [![📡 RSS 财经新闻自动推送](https://github.com/sgrsun3/FinNewsCollectionBot/actions/workflows/rss-bot.yml/badge.svg)](https://github.com/sgrsun3/FinNewsCollectionBot/actions/workflows/rss-bot.yml) 6 | ![GitHub Stars](https://img.shields.io/github/stars/sgrsun3/FinNewsCollectionBot?style=social) 7 | ![License](https://img.shields.io/github/license/sgrsun3/FinNewsCollectionBot) 8 | 9 | --- 10 | ## 🧧 支持作者 · 让项目持续进化! 11 | 12 | 如果本项目对你有帮助,欢迎打赏支持,资助我多喝几杯咖啡 ☕,跑更多模型 💻~ 13 | 14 |
15 | 16 |
17 | 18 | - 💬 微信号:`ArkhamKni9ht` 19 | - 🙌 感谢每一位 Star、Fork 和支持者! 20 | 21 | > ✨ 金融爸爸一块钱我不嫌少,一百块我也不嫌多 😊 22 | --- 23 | 24 | ## 🎯 项目简介 25 | 26 | FinNewsCollectionBot 是一款为券商分析师、基金经理、研究员等专业投资人量身打造的**财经资讯智能摘要助手**。 27 | 28 | 它自动聚合主流财经媒体的 RSS 信息源,并调用 **DeepSeek 大语言模型**,每天两次推送核心财经摘要,帮助你快速掌握全球市场动态、产业趋势与政策走向。 29 | 30 | --- 31 | 32 | ## 🚀 核心功能 33 | 34 | - ⏰ **每日两次自动摘要推送** 35 | 每天上午 09:00、下午 17:00 定时运行,生成分析报告 36 | 37 | - 🌐 **多源财经 RSS 聚合** 38 | 支持华尔街见闻、36氪、东方财富、华尔街日报、BBC 等主流财经媒体 39 | 40 | - 🧠 **大模型深度分析** 41 | 使用 DeepSeek 大语言模型自动提炼财经新闻的核心内容与趋势判断 42 | 43 | - 📲 **微信即时推送** 44 | 集成 Server 酱服务,生成的财经摘要自动推送至你的微信 45 | 46 | --- 47 | 48 | ## 🧑‍💻 技术栈 49 | 50 | - Python 51 | - feedparser + newspaper3k 52 | - DeepSeek 大语言模型 API 53 | - GitHub Actions 自动定时部署 54 | 55 | --- 56 | 57 | ## 🔧 快速开始(快速部署) 58 | 59 | 1. **Fork 本项目** 60 | 2. 配置你的 RSS 源地址和 DeepSeek API Key 61 | 3. 在 GitHub 中设置 Secrets: 62 | ```bash 63 | OPENAI_API_KEY=your_deepseek_api_key 64 | SERVER_CHAN_KEYS=your_serverchan_key 65 | ``` 66 | 4. 自动触发 GitHub Actions 开始运行 67 | 68 | 📌 成功部署后,每天两次财经摘要将自动生成并推送到你的微信! 69 | 70 | --- 71 | 72 | ## 💼 使用场景 73 | 74 | - 券商/基金公司/研究所自动生成投资快报 75 | - 金融从业者日常资讯监测 76 | - 个人投资者快捷了解宏观政策/产业热点 77 | - 财经内容运营/财经公众号 AI 辅助创作 78 | 79 | --- 80 | 81 | ## 📌 示例流程图 82 | 83 | ```mermaid 84 | graph TD 85 | A[财经RSS源] --> B[抓取文章] 86 | B --> C[调用DeepSeek大模型] 87 | C --> D[生成财经摘要] 88 | D --> E[Server酱推送到微信] 89 | ``` 90 | 91 | --- 92 | 93 | ## 🛠️ 后续规划 94 | 95 | - ✅ 增加更多 RSS 财经数据源 96 | - ✅ 引入情绪分析与金融事件检测 97 | - ⏳ 支持多语言财经摘要生成 98 | - ⏳ 构建简洁前端页面用于非技术用户管理配置 99 | 100 | --- 101 | 102 | ## 🤝 欢迎参与 103 | 104 | 📬 欢迎 Star ⭐ / Fork 🍴 / PR 💡 本项目,一起共建更智能的财经决策工具。 105 | 106 | 你也可以通过 Issues 留言建议功能,或私信我交流使用体验~ 107 | 108 | --- 109 | 110 | © 2024 sgrsun3 | MIT License 111 | -------------------------------------------------------------------------------- /financebot.py: -------------------------------------------------------------------------------- 1 | # 福生无量天尊 2 | from openai import OpenAI 3 | import feedparser 4 | import requests 5 | from newspaper import Article 6 | from datetime import datetime 7 | import time 8 | import pytz 9 | import os 10 | 11 | # OpenAI API Key 12 | openai_api_key = os.getenv("OPENAI_API_KEY") 13 | # 从环境变量获取 Server酱 SendKeys 14 | server_chan_keys_env = os.getenv("SERVER_CHAN_KEYS") 15 | if not server_chan_keys_env: 16 | raise ValueError("环境变量 SERVER_CHAN_KEYS 未设置,请在Github Actions中设置此变量!") 17 | server_chan_keys = server_chan_keys_env.split(",") 18 | 19 | openai_client = OpenAI(api_key=openai_api_key, base_url="https://api.deepseek.com/v1") 20 | 21 | # RSS源地址列表 22 | rss_feeds = { 23 | "💲 华尔街见闻":{ 24 | "华尔街见闻":"https://dedicated.wallstreetcn.com/rss.xml", 25 | }, 26 | "💻 36氪":{ 27 | "36氪":"https://36kr.com/feed", 28 | }, 29 | "🇨🇳 中国经济": { 30 | "香港經濟日報":"https://www.hket.com/rss/china", 31 | "东方财富":"http://rss.eastmoney.com/rss_partener.xml", 32 | "百度股票焦点":"http://news.baidu.com/n?cmd=1&class=stock&tn=rss&sub=0", 33 | "中新网":"https://www.chinanews.com.cn/rss/finance.xml", 34 | "国家统计局-最新发布":"https://www.stats.gov.cn/sj/zxfb/rss.xml", 35 | }, 36 | "🇺🇸 美国经济": { 37 | "华尔街日报 - 经济":"https://feeds.content.dowjones.io/public/rss/WSJcomUSBusiness", 38 | "华尔街日报 - 市场":"https://feeds.content.dowjones.io/public/rss/RSSMarketsMain", 39 | "MarketWatch美股": "https://www.marketwatch.com/rss/topstories", 40 | "ZeroHedge华尔街新闻": "https://feeds.feedburner.com/zerohedge/feed", 41 | "ETF Trends": "https://www.etftrends.com/feed/", 42 | }, 43 | "🌍 世界经济": { 44 | "华尔街日报 - 经济":"https://feeds.content.dowjones.io/public/rss/socialeconomyfeed", 45 | "BBC全球经济": "http://feeds.bbci.co.uk/news/business/rss.xml", 46 | }, 47 | } 48 | 49 | # 获取北京时间 50 | def today_date(): 51 | return datetime.now(pytz.timezone("Asia/Shanghai")).date() 52 | 53 | # 爬取网页正文 (用于 AI 分析,但不展示) 54 | def fetch_article_text(url): 55 | try: 56 | print(f"📰 正在爬取文章内容: {url}") 57 | article = Article(url) 58 | article.download() 59 | article.parse() 60 | text = article.text[:1500] # 限制长度,防止超出 API 输入限制 61 | if not text: 62 | print(f"⚠️ 文章内容为空: {url}") 63 | return text 64 | except Exception as e: 65 | print(f"❌ 文章爬取失败: {url},错误: {e}") 66 | return "(未能获取文章正文)" 67 | 68 | # 添加 User-Agent 头 69 | def fetch_feed_with_headers(url): 70 | headers = { 71 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' 72 | } 73 | return feedparser.parse(url, request_headers=headers) 74 | 75 | 76 | # 自动重试获取 RSS 77 | def fetch_feed_with_retry(url, retries=3, delay=5): 78 | for i in range(retries): 79 | try: 80 | feed = fetch_feed_with_headers(url) 81 | if feed and hasattr(feed, 'entries') and len(feed.entries) > 0: 82 | return feed 83 | except Exception as e: 84 | print(f"⚠️ 第 {i+1} 次请求 {url} 失败: {e}") 85 | time.sleep(delay) 86 | print(f"❌ 跳过 {url}, 尝试 {retries} 次后仍失败。") 87 | return None 88 | 89 | # 获取RSS内容(爬取正文但不展示) 90 | def fetch_rss_articles(rss_feeds, max_articles=10): 91 | news_data = {} 92 | analysis_text = "" # 用于AI分析的正文内容 93 | 94 | for category, sources in rss_feeds.items(): 95 | category_content = "" 96 | for source, url in sources.items(): 97 | print(f"📡 正在获取 {source} 的 RSS 源: {url}") 98 | feed = fetch_feed_with_retry(url) 99 | if not feed: 100 | print(f"⚠️ 无法获取 {source} 的 RSS 数据") 101 | continue 102 | print(f"✅ {source} RSS 获取成功,共 {len(feed.entries)} 条新闻") 103 | 104 | articles = [] # 每个source都需要重新初始化列表 105 | for entry in feed.entries[:5]: 106 | title = entry.get('title', '无标题') 107 | link = entry.get('link', '') or entry.get('guid', '') 108 | if not link: 109 | print(f"⚠️ {source} 的新闻 '{title}' 没有链接,跳过") 110 | continue 111 | 112 | # 爬取正文用于分析(不展示) 113 | article_text = fetch_article_text(link) 114 | analysis_text += f"【{title}】\n{article_text}\n\n" 115 | 116 | print(f"🔹 {source} - {title} 获取成功") 117 | articles.append(f"- [{title}]({link})") 118 | 119 | if articles: 120 | category_content += f"### {source}\n" + "\n".join(articles) + "\n\n" 121 | 122 | news_data[category] = category_content 123 | 124 | return news_data, analysis_text 125 | 126 | # AI 生成内容摘要(基于爬取的正文) 127 | def summarize(text): 128 | completion = openai_client.chat.completions.create( 129 | model="deepseek-chat", 130 | messages=[ 131 | {"role": "system", "content": "你是一位经验丰富、逻辑严谨的财经新闻分析师,服务对象为券商分析师、基金经理、金融研究员、宏观策略师等专业人士。请基于以下财经新闻原文内容,完成高质量的内容理解与结构化总结,形成一份专业、精准、清晰的财经要点摘要,用于支持机构投资者的日常研判工作。【输出要求】1.全文控制在 2000 字以内,内容精炼、逻辑清晰;2.从宏观政策、金融市场、行业动态、公司事件、风险提示等角度进行分类总结;3.每一部分要突出数据支持、趋势研判、可能的市场影响;4.明确指出新闻背后的核心变量或政策意图,并提出投资视角下的参考意义;5.语气专业、严谨、无情绪化表达,适配专业机构投研阅读习惯;6.禁止套话,不重复新闻原文,可用条列式增强结构性;7.如涉及数据和预测,请标注来源或指出主张机构(如高盛、花旗等);8.若原文较多内容无关财经市场,可酌情略去,只保留关键影响要素。"}, 132 | {"role": "user", "content": text} 133 | ] 134 | ) 135 | return completion.choices[0].message.content.strip() 136 | 137 | # 发送微信推送 138 | def send_to_wechat(title, content): 139 | for key in server_chan_keys: 140 | url = f"https://sctapi.ftqq.com/{key}.send" 141 | data = {"title": title, "desp": content} 142 | response = requests.post(url, data=data, timeout=10) 143 | if response.ok: 144 | print(f"✅ 推送成功: {key}") 145 | else: 146 | print(f"❌ 推送失败: {key}, 响应:{response.text}") 147 | 148 | 149 | if __name__ == "__main__": 150 | today_str = today_date().strftime("%Y-%m-%d") 151 | 152 | # 每个网站获取最多 5 篇文章 153 | articles_data, analysis_text = fetch_rss_articles(rss_feeds, max_articles=5) 154 | 155 | # AI生成摘要 156 | summary = summarize(analysis_text) 157 | 158 | # 生成仅展示标题和链接的最终消息 159 | final_summary = f"📅 **{today_str} 财经新闻摘要**\n\n✍️ **今日分析总结:**\n{summary}\n\n---\n\n" 160 | for category, content in articles_data.items(): 161 | if content.strip(): 162 | final_summary += f"## {category}\n{content}\n\n" 163 | 164 | # 推送到多个server酱key 165 | send_to_wechat(title=f"📌 {today_str} 财经新闻摘要", content=final_summary) 166 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | openai 2 | feedparser 3 | requests 4 | newspaper3k 5 | pytz 6 | lxml_html_clean 7 | --------------------------------------------------------------------------------