├── .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 | [](https://github.com/sgrsun3/FinNewsCollectionBot/actions/workflows/rss-bot.yml)
6 | 
7 | 
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 |
--------------------------------------------------------------------------------