- 🌍 多样化新闻源 - 50+个有效源,覆盖8+个地区,避免信息茧房
- 🤖 本地AI处理 - 使用Ollama,保护隐私,零API费用
- 🎯 智能筛选 - AI相关新闻精准识别,自动去重
- 📊 GitHub/HF集成 - 自动获取热门项目和模型
- 🌐 双模型处理 - 国内用Qwen,国际用Llama
- 📧 美观邮件 - 现代化HTML模板,响应式设计
- ⚡ 高性能 - 3分钟完成抓取和处理,支持动态并发
- 🖥️ Web管理界面 - 可视化管理、数据分析、配置管理 🆕
- 💾 数据库自动保存 - 抓取后自动同步到SQLite数据库
- ✅ Web界面实时显示最新数据,无需手动导入
- ✅ 自动去重,相同新闻链接不会重复保存
- ✅ 完整记录,保存新闻标题、链接、来源、地区、评分等信息
- ✅ 每日汇总,自动统计每天的抓取情况
- ✅ 运行历史,记录每次运行的详细信息
- 🖥️ Web管理界面 - 可视化管理、数据分析、配置管理
- 🌍 多样化新闻源 - 新增40+个源,覆盖欧洲、亚太、学术、开源社区
- ⚡ 性能优化 - 运行时间优化到3分钟,成功率提升到70%+
- 🔧 智能重试 - 指数退避算法,自动处理请求失败
- 📈 动态并发 - 根据成功率自动调整线程数(8-10个)
- 💾 智能缓存 - 新闻历史缓存 + AI结果缓存
- 🏥 健康监控 - 新闻源可用性监控和质量评分
🌏 国内源(3个):雷锋网AI、新浪科技AI、IT之家AI
🇺🇸 北美源(20+个):
- 媒体:TechCrunch AI、VentureBeat、ArsTechnica、Wired、MIT Tech Review
- 公司博客:Google DeepMind、Microsoft AI、Microsoft Research、NVIDIA、AWS AI Blog
- 社区:Towards Data Science、Machine Learning Mastery、Papers with Code
🇪🇺 欧洲源(5+个):
- AI Business(英国)、The Guardian Tech(英国)
- ScienceDaily(国际学术)、Tech.eu(欧洲)
- Silicon Republic(爱尔兰)
🌏 亚太源(5+个):
- Tech in Asia(亚洲)、Nikkei Asia(日本)
- Analytics India Mag、YourStory AI、Inc42 AI(印度)
🎓 学术/研究(10+个):
- 顶级机构:Stanford AI Blog、MIT CSAIL、Allen Institute for AI
- 会议/出版:AAAI、ACM AI、IEEE AI
💼 产业/投资(5+个):
- VC视角:Sequoia AI、a16z AI
- 咨询:McKinsey AI、BCG AI、Gartner AI
👥 开源社区(5+个):
- Dev.to AI、Medium AI Tag、DataReport AI、KDnuggets
🔧 开发工具:
- GitHub Trending:5个热门AI项目
- Hugging Face:5个热门模型
- 媒体类:30%
- 公司博客:25%
- 学术机构:15%
- 开源社区:15%
- 产业投资:10%
- 社区论坛:5%
- 智能筛选: 关键词预筛选 + AI精准筛选
- 分别处理:
- 国内新闻: qwen3:8b处理,保留前5名
- 国际新闻: llama3.1:8b处理,保留前10名
- 摘要生成: 国内外分别生成摘要
- 趋势分析: 国内外分别分析趋势
- 综合汇总: qwen3:8b生成最终概要和趋势
- GitHub热门项目(5个)
- Hugging Face热门模型(5个)
- 国内AI新闻(5篇)
- 国际AI新闻(10篇)
- AI综合摘要
- AI趋势分析
ai_news_automation_github/
├── src/
│ ├── __init__.py
│ ├── main.py # 主程序入口
│ ├── config/ # 配置模块
│ │ ├── __init__.py
│ │ ├── constants.py # 常量定义、新闻源配置
│ │ └── settings.py # 配置管理
│ ├── fetchers/ # 新闻抓取模块
│ │ ├── __init__.py
│ │ ├── base.py # 基础抓取器、NewsItem类
│ │ ├── html_fetcher.py # HTML网页抓取器
│ │ ├── rss_fetcher.py # RSS订阅抓取器
│ │ ├── github_fetcher.py # GitHub Trending抓取器
│ │ ├── huggingface_fetcher.py # Hugging Face抓取器
│ │ └── manager.py # 抓取管理器(并发、去重)
│ ├── ai/ # AI处理模块
│ │ ├── __init__.py
│ │ ├── ollama_client.py # Ollama客户端(支持多模型)
│ │ ├── processor.py # AI处理器(摘要、趋势)
│ │ └── filter.py # AI筛选器(关键词+AI筛选)
│ ├── email/ # 邮件模块
│ │ ├── __init__.py
│ │ ├── templates.py # 邮件模板(4种风格)
│ │ └── sender.py # 邮件发送器
│ ├── web/ # Web管理界面 🆕
│ │ ├── __init__.py
│ │ ├── app.py # Flask应用入口
│ │ ├── models.py # 数据库模型
│ │ ├── routes/ # 路由
│ │ │ ├── main.py # 主页路由
│ │ │ ├── news.py # 新闻相关路由
│ │ │ ├── stats.py # 统计分析路由
│ │ │ ├── config.py # 配置管理路由
│ │ │ └── api.py # API路由
│ │ ├── services/ # 业务逻辑层
│ │ │ ├── news_service.py # 新闻业务逻辑
│ │ │ ├── stats_service.py# 统计业务逻辑
│ │ │ ├── config_service.py # 配置业务逻辑
│ │ │ └── data_importer.py # 数据导入服务
│ │ └── templates/ # Jinja2模板
│ │ ├── base.html # 基础模板
│ │ ├── index.html # 首页
│ │ ├── news/ # 新闻模板
│ │ ├── stats/ # 统计模板
│ │ ├── config/ # 配置模板
│ │ └── errors/ # 错误页面
│ └── utils/ # 工具模块
│ ├── __init__.py
│ ├── logger.py # 日志系统
│ └── helpers.py # 辅助函数
├── static/ # 静态资源 🆕
│ ├── css/
│ │ └── style.css # 自定义样式
│ └── js/
│ ├── app.js # 主要JavaScript
│ └── charts.js # 图表配置
├── data/ # 数据库目录 🆕
│ └── news.db # SQLite数据库
├── tests/ # 测试模块
├── logs/ # 日志目录
├── output/ # 输出目录
├── config.json # 配置文件
├── requirements.txt # 依赖列表
├── run.py # 快速启动脚本
├── run_web.py # Web服务器启动脚本 🆕
├── run_web.bat # Web启动批处理 🆕
└── README.md # 项目说明
- Python 3.8+
- Ollama (本地AI服务)
- qwen3:8b 模型
- llama3.1:8b 模型(用于国际新闻处理)
从 ollama.com 下载并安装Ollama。
# 国内新闻处理模型(必需)
ollama pull qwen3:8b
# 国际新闻处理模型(必需)
ollama pull llama3.1:8bpip install -r requirements.txt编辑 config.json,填入邮箱信息:
{
"email": {
"sender_email": "your_email@qq.com",
"sender_password": "", // 留空,通过环境变量设置
"smtp_server": "smtp.qq.com",
"smtp_port": 465,
"recipient_email": "recipient@foxmail.com"
}
}设置环境变量 AI_NEWS_EMAIL_PASSWORD 为QQ邮箱授权码:
# Windows (PowerShell)
$env:AI_NEWS_EMAIL_PASSWORD="your_qq_auth_code"
[Environment]::SetEnvironmentVariable("AI_NEWS_EMAIL_PASSWORD", $env:AI_NEWS_EMAIL_PASSWORD, "User")直接双击 run_ai_news.bat 文件即可运行!
优点:
- ✅ 自动切换到正确的项目目录
- ✅ 自动加载配置文件
- ✅ 显示运行状态和当前目录
- ✅ 运行完成后暂停,方便查看输出
文件位置:
ai_news_automation_github/
└── run_ai_news.bat # 一键启动脚本
python run.py如果配置文件不在默认位置,可以使用:
python run.py --config "D:\path\to\config.json"| 配置项 | 说明 | 默认值 |
|---|---|---|
ai.enabled |
是否启用AI处理 | true |
ai.model_name |
默认AI模型 | qwen3:8b |
ai.temperature |
AI温度参数 | 0.7 |
ai.timeout |
AI请求超时(秒) | 60 |
ai.enable_filter |
是否启用AI筛选 | true |
| 配置项 | 说明 | 默认值 |
|---|---|---|
fetcher.concurrent_requests |
并发请求数 | 3 |
fetcher.enable_github |
是否抓取GitHub | true |
fetcher.enable_huggingface |
是否抓取HuggingFace | true |
| 配置项 | 说明 | 默认值 |
|---|---|---|
settings.qq_mail_format |
使用QQ邮箱兼容格式 | true |
settings.html_email |
发送HTML邮件 | true |
| 任务 | 使用模型 | 说明 |
|---|---|---|
| 国内新闻筛选 | qwen3:8b | 保留前5篇 |
| 国际新闻筛选 | qwen3:8b | 保留前10篇 |
| 国内新闻摘要 | qwen3:8b | 100字以内 |
| 国际新闻摘要 | llama3.1:8b | 100字以内 |
| 国内趋势分析 | qwen3:8b | 150字以内 |
| 国际趋势分析 | llama3.1:8b | 200字以内 |
| 综合汇总 | qwen3:8b | 合并国内外内容 |
如需使用其他模型,修改 src/ai/processor.py 中的模型名称:
# 国内新闻使用其他模型
domestic_summary = self.generate_summary_for_region(news_list, "domestic", "your_model_name")python run.py --help| 参数 | 说明 |
|---|---|
--config |
指定配置文件路径 |
--no-email |
不发送邮件,仅保存文件 |
--test-ai |
测试AI功能 |
--web |
启动Web管理界面 |
--web-host |
Web服务器主机地址(默认: 127.0.0.1) |
--web-port |
Web服务器端口(默认: 5000) |
--import-data |
导入历史数据到数据库 |
--log-level |
日志级别 (DEBUG/INFO/WARNING/ERROR) |
系统新增了Web管理界面,提供可视化的数据浏览、统计分析和配置管理功能。
# 双击运行
run_web.bat# 启动Web服务器
python run.py --web
# 指定主机和端口
python run.py --web --host 0.0.0.0 --port 8080
# 使用独立脚本
python run_web.py-
首页仪表盘
- 系统概览统计(总新闻数、今日新闻、国内/国际分布)
- 最近7天趋势图表
- 最新新闻列表
-
新闻浏览
- 分页浏览所有历史新闻
- 多条件筛选(日期、分类、地区、类型、来源)
- 关键词搜索
- 新闻详情查看
-
统计分析
- 新闻数量趋势图(支持7天/30天/90天)
- 分类分布饼图
- 新闻源性能统计
-
配置管理
- 系统预设源查看
- 自定义新闻源添加/删除
- 支持RSS和HTML类型源
-
数据导入
- 导入历史JSON文件到SQLite数据库
- 自动同步output目录下的数据
- 启动Web服务器
- 访问 http://localhost:5000
- 导入历史数据(可选):
python run.py --import-data
- 本地访问:http://localhost:5000
- 局域网访问:http://0.0.0.0:5000(使用
--web-host 0.0.0.0)
运行后会在 output/ 目录生成:
ai_news_YYYYMMDD.json- JSON格式新闻数据ai_news_YYYYMMDD.html- HTML格式邮件预览
-
GitHub热门项目 (5个)
- 项目名称和描述
- Star数量(右下角黑色徽章)
- 项目链接
-
Hugging Face热门模型 (5个)
- 模型名称
- 下载量(右下角紫色徽章)
- 任务类型和点赞数
- 模型链接
-
国内AI新闻 (5篇)
- 按AI评分排序
- 包含标题、来源、日期
- 新闻链接
-
国际AI新闻 (10篇)
- 按AI评分排序
- 包含标题、来源、日期
- 新闻链接
-
AI洞察
- 今日摘要(国内外综合)
- 趋势分析(国内外综合)
- 打开"任务计划程序"
- 创建基本任务
- 设置触发器(每天指定时间)
- 操作:启动程序
python run.py - 起始于:项目根目录路径
创建 daily_task.bat:
@echo off
cd /d D:\ai_news_automation1\ai_news_refactored
python run.py原因: RSS新闻类型为"rss",需要包含在过滤条件中
解决: 确保 src/ai/processor.py 中的过滤条件为:
real_news = [n for n in news_list if n.news_type in ["news", "rss"]]原因: AI模型未正确响应或模型未加载
解决:
- 检查Ollama是否运行:
curl http://localhost:11434/api/tags - 确认模型已下载:
ollama list - 查看日志中的AI处理错误
原因: 新闻筛选条件过于严格
解决:
- 检查日志中抓取到的新闻数量
- 降低关键词筛选阈值(
filter.py中的min_score) - 检查新闻源是否可访问
原因: 字段访问错误
解决: 确保 src/fetchers/huggingface_fetcher.py 第65行为:
downloads = model_data.get('downloads', 0)编辑 src/config/constants.py 中的 DEFAULT_SOURCES:
DEFAULT_SOURCES = {
"domestic": [
{"name": "新闻源名称", "url": "https://...", "enabled": True}
],
"global": [
{"name": "News Source", "url": "https://...", "enabled": True}
]
}编辑 src/fetchers/manager.py:
# GitHub项目数量
GitHubTrendingFetcher(token=github_token, max_news=5)
# Hugging Face模型数量
HuggingFaceFetcher(max_news=5)修改 src/email/templates.py 中的模板类。
- 💾 数据库自动保存:修复Web界面数据更新问题
- 新增 DatabaseSaver 服务类,自动保存新闻到数据库
- 抓取新闻后自动同步到数据库,Web界面实时显示
- 支持自动去重,避免重复保存相同新闻
- 记录运行历史和统计信息
- 🐛 修复导入错误:添加 SITE_SPECIFIC_SELECTORS 常量定义
- 📊 数据库特性:
- 自动去重:相同的新闻链接不会重复保存
- 实时更新:每次抓取后自动更新数据库
- 完整记录:保存新闻标题、链接、来源、地区、评分等信息
- 每日汇总:自动统计每天的抓取情况
- 运行历史:记录每次运行的详细信息
- 🌐 全新Web管理界面:Flask 3.0 + SQLAlchemy + Bootstrap 5
- 📊 实时数据仪表盘:统计、趋势图表、最新新闻
- ⚡ 一键立即抓取:实时进度显示,完成后自动刷新
- 🤖 AI分析展示:智能摘要和趋势分析实时显示
- 📰 历史新闻浏览:筛选、搜索、分页,支持移动端
- 📈 统计分析图表:趋势图、饼图、柱状图数据可视化
- ⚙️ 配置管理界面:新闻源启停、自定义源管理
- 🎨 现代化UI设计:渐变色、动画效果、响应式布局
- 🔧 数据导入服务:自动将历史JSON文件导入SQLite数据库
- 📊 实时更新机制:Web界面实时同步抓取进度和结果
- 📱 移动端适配:支持手机、平板、桌面全平台访问
- 🐛 性能优化:优化数据库查询,提升页面加载速度
- ✨ 智能去重系统:URL指纹识别 + 标题相似度检测,自动移除重复内容
- ✨ 质量评分系统:6维度评分(标题质量、源质量、AI相关性等),智能排序
- 🐛 修复中文编码:改进编码检测逻辑,正确处理国内网站UTF-8/GBK编码
- 🎯 优化AI筛选:增加输入输出数量,改进提示词,保留更多高质量新闻
- ⚙️ 配置改进:禁用增量抓取(改为智能去重),新增去重和评分配置项
- 📊 效果提升:新闻数量从20条提升到31条(+55%),国际新闻从10条提升到20条(+100%)
- 🌏 新增国内AI官方渠道:智谱AI、MiniMax、百度文心、阿里通义、DeepSeek
- 📰 新增国内科技媒体:IT之家AI、中关村在线AI、至顶网、雷锋网AI
- 🤖 扩展AI关键词库,新增GLM-4/5、MiniMax-2.5、DeepSeek V3、Qwen 2.5等国内大模型
- 📉 降低新闻预筛选门槛(1.5→1.0),提高国内新闻覆盖率
- 📊 增加国内新闻AI评估数量(15→20条),优化筛选质量
- 🔧 新增环境变量设置脚本(setup_env.bat)
- 🐛 优化新闻源筛选逻辑
- ✨ 新增智能缓存系统(新闻历史 + AI结果)
- ✨ 新增增量抓取模式(只抓取24小时内新内容)
- ✨ 新增智能重试机制(指数退避 + 随机抖动)
- ✨ 新增User-Agent轮换(10+种浏览器UA)
- ✨ 新增动态并发调整(根据成功率自动调整)
- ✨ 新增自动缓存清理(LRU策略 + 数量限制)
- 🐛 修复部分新闻源SSL证书问题
- 📝 添加Docker和Docker Compose支持
- ♻️ 完全重构代码结构,模块化设计
- ✨ 新增GitHub Trending集成(5个热门项目)
- ✨ 新增Hugging Face集成(5个热门模型)
- ✨ 实现双模型处理:国内用Qwen,国际用Llama3.1:8b
- ✨ 国内外新闻分别排名(国内前5,国际前10)
- 🐛 修复RSS新闻类型过滤问题
- 🐛 修复Hugging Face下载量显示为0的问题
- 📝 优化AI摘要和趋势生成流程
- 🎉 初始版本
# 1. 复制配置文件
cp config.example.json config.json
# 编辑 config.json 填入配置
# 2. 设置环境变量
export AI_NEWS_EMAIL_PASSWORD=your_password
# 3. 启动服务(包含Ollama)
docker-compose up -d
# 查看日志
docker-compose logs -f ai-news# 构建镜像
docker build -t ai-news .
# 运行容器
docker run -v $(pwd)/config.json:/app/config.json \
-v $(pwd)/logs:/app/logs \
-v $(pwd)/cache:/app/cache \
-v $(pwd)/output:/app/output \
-e AI_NEWS_EMAIL_PASSWORD=your_password \
ai-news在GitHub上启用后,可实现每日自动抓取:
- Fork本仓库
- 在Settings > Secrets中添加:
SENDER_EMAIL: 发件邮箱RECIPIENT_EMAIL: 收件邮箱EMAIL_PASSWORD: 邮箱授权码
- 启用Actions
查看完整配置:.github/workflows/scheduled.yml
欢迎贡献!请查看 CONTRIBUTING.md
MIT License - 详见 LICENSE
MIT License