- 新增 /sn <关键词> [日期] 命令搜索历史新闻 - 支持按日期筛选 (YYYY-MM-DD 格式) - 分页显示搜索结果,每页5条 - 内联键盘按钮翻页 - 更新 /help 和 README 文档 |
||
|---|---|---|
| src | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
🤖 加密货币新闻广播机器人
一个基于 Rust 开发的生产级 Telegram 机器人,自动获取、分析并推送加密货币相关新闻。
✨ 功能特性
核心功能
- 📰 自动新闻获取: 每 5 分钟从 Yahoo Finance 获取加密货币相关新闻
- 🤖 AI 智能分析: 使用 Cloudflare Workers AI (qwen3-30b-a3b-fp8) 生成摘要和市场影响分析
- 📊 市场影响预测: 对每条新闻分析其对用户关注币种的潜在影响(看涨/看跌/中性)
- 📱 Telegram 推送: 自动将新闻推送给所有订阅用户
- 🖼️ 图片支持: 如果新闻包含图片,会以图文形式发送
- 🗑️ 垃圾过滤: 自动过滤无实质内容的新闻和废话摘要
- 💰 实时价格查询: Binance USDT 交易对实时价格、24h涨跌幅、高低价、交易量
- 📈 趋势分析: 基于24小时新闻情绪分析币种涨跌趋势
- 🔔 价格提醒: 自动通知 BTC/ETH 价格波动(BTC 每 1000 USDT,ETH 每 100 USDT)
用户功能
- 🪙 自定义币种: 用户可自定义关注的加密货币(BTC、ETH、SOL、BNB 等12种)
- 🌐 双语支持: 支持中文/英文切换,推送内容跟随用户语言偏好
- 🏷️ 类别筛选: 用户可选择关注的新闻类别(14种类别)
- ⚙️ 筛选模式: 支持 OR/AND 模式组合币种和类别筛选
- 🔘 交互式菜单: 内联键盘按钮,快速访问各项功能
生产级特性
- 💾 多数据库支持: SQLite(本地)和 PostgreSQL(云端),完全独立运行
- 🔧 统一接口: DatabaseBackend 枚举封装,应用层无感知切换
- 🏗️ 可扩展架构: Trait-based 设计,便于扩展新渠道和存储后端
- 🌐 价格API集成: Binance API 实时 USDT 交易对数据
- 🐳 Docker 支持: 开箱即用的容器化部署方案
📋 系统要求
- Rust 1.70.0 或更高版本
- macOS / Linux / Windows
- 网络连接(访问 Telegram API、Yahoo Finance、Cloudflare AI)
🚀 快速开始
1. 克隆项目
git clone <your-repo-url>
cd crypto-news-bot
2. 配置环境变量
复制示例配置文件并填入你的配置:
cp .env.example .env
编辑 .env 文件:
# Telegram Bot Token(从 @BotFather 获取)
TELEGRAM_TOKEN=your_telegram_bot_token_here
# Cloudflare API Token
CLOUDFLARE_API_KEY=your_cloudflare_api_key_here
# Cloudflare Workers AI 端点
CLOUDFLARE_ENDPOINT=https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/ai/run/@cf/qwen/qwen3-30b-a3b-fp8
# 数据库类型: sqlite 或 postgresql(默认 sqlite)
DATABASE_TYPE=sqlite
# SQLite 数据库路径
DATABASE_PATH=news_bot.db
# PostgreSQL 配置(当 DATABASE_TYPE=postgresql 时使用)
# DATABASE_URL=postgres://user:password@localhost:5432/newsbot
# 新闻获取间隔(秒,可选,默认 300)
FETCH_INTERVAL_SECS=300
3. 获取所需的 API 密钥
Telegram Bot Token
- 在 Telegram 中搜索
@BotFather - 发送
/newbot命令 - 按提示设置机器人名称和用户名
- 获取 Bot Token(格式类似:
123456789:ABCdefGHIjklMNOpqrsTUVwxyz)
Cloudflare API Token
- 登录 Cloudflare Dashboard
- 进入 My Profile → API Tokens
- 点击 Create Token
- 选择 Workers AI 权限模板或自定义权限
- 复制生成的 Token
Cloudflare Account ID
- 在 Cloudflare Dashboard 首页
- 右侧边栏可以看到 Account ID
- 将其填入
CLOUDFLARE_ENDPOINT的YOUR_ACCOUNT_ID位置
4. 编译运行
# 编译(Release 模式)
cargo build --release
# 运行
cargo run --release
或者直接运行调试版本:
cargo run
🐳 Docker 部署
方式一:Docker Compose(推荐)
SQLite 模式(轻量级)
# 创建环境变量文件
cp .env.example .env
# 编辑 .env 填入你的配置
# 启动
docker-compose up -d newsbot
# 查看日志
docker-compose logs -f newsbot
# 停止
docker-compose down
PostgreSQL 模式(生产环境)
# 启动(包含 PostgreSQL)
docker-compose --profile postgres up -d
# 查看日志
docker-compose logs -f newsbot-pg
# 停止
docker-compose --profile postgres down
方式二:手动 Docker 构建
# 构建镜像
docker build -t crypto-news-bot .
# 运行(SQLite 模式)
docker run -d \
--name crypto-news-bot \
-e TELEGRAM_TOKEN=your_token \
-e CLOUDFLARE_API_KEY=your_key \
-e CLOUDFLARE_ENDPOINT=your_endpoint \
-e DATABASE_TYPE=sqlite \
-v newsbot-data:/app/data \
crypto-news-bot
# 查看日志
docker logs -f crypto-news-bot
Docker 环境变量
| 变量 | 说明 | 默认值 |
|---|---|---|
TELEGRAM_TOKEN |
Telegram Bot Token | 必填 |
CLOUDFLARE_API_KEY |
Cloudflare API Key | 必填 |
CLOUDFLARE_ENDPOINT |
AI 模型端点 | 必填 |
DATABASE_TYPE |
数据库类型 | sqlite |
DATABASE_PATH |
SQLite 文件路径 | /app/data/news_bot.db |
DATABASE_URL |
PostgreSQL 连接串 | - |
FETCH_INTERVAL_SECS |
新闻获取间隔 | 300 |
RUST_LOG |
日志级别 | crypto_news_bot=info |
TZ |
时区 | Asia/Shanghai |
📖 使用方法
Telegram 命令
在 Telegram 中与机器人对话,支持以下命令:
| 命令 | 说明 |
|---|---|
/start |
订阅新闻推送(显示带按钮的主菜单) |
/stop |
取消订阅 |
/status |
查看订阅状态 |
/latest |
获取最近 3 条新闻 |
/sn <关键词> [日期] |
搜索历史新闻(支持分页) |
/crypto BTC,ETH,SOL |
设置关注的币种 |
/mycrypto |
查看当前关注的币种 |
/s BTC |
查询币种实时价格 |
/p BTC |
24小时新闻趋势分析 |
/lang |
切换语言(中文/英文) |
/category |
设置新闻类别偏好 |
/menu |
显示主菜单 |
/help |
显示帮助信息 |
新闻搜索功能
使用 /sn 命令搜索历史新闻,支持关键词和日期筛选:
| 示例 | 说明 |
|---|---|
/sn Bitcoin |
搜索包含 "Bitcoin" 的所有新闻 |
/sn ETF 2024-01-15 |
搜索 2024年1月15日 包含 "ETF" 的新闻 |
/sn SEC |
搜索包含 "SEC" 的所有新闻 |
搜索特性:
- 支持中英文关键词
- 在标题和摘要中搜索
- 每页显示 5 条结果
- 点击翻页按钮浏览更多结果
价格提醒功能
自动监控 BTC 和 ETH 价格,当价格穿越整数点位时通知:
| 币种 | 点位间隔 | 示例 |
|---|---|---|
| BTC | $1000 | 穿越 $93000, $94000, $95000... |
| ETH | $100 | 穿越 $3200, $3300, $3400... |
触发规则:
- ✅ 价格从 $93500 涨到 $94100 → 通知 "📈 突破 $94000"
- ✅ 价格从 $3100 跌到 $2980 → 通知 "📉 跌破 $3000"
- ✅ 价格从 $93000 涨到 $96500 → 连续通知 $94000, $95000, $96000
- ❌ 启动时不通知当前点位(只记录)
- ❌ 价格在 $93500-$93999 波动 → 无通知
冷却机制:
- 每 60 秒检测一次价格
- 12 小时冷却:同一点位通知后,12 小时内不再重复通知
- 新用户默认关注 BTC 和 ETH
交互式按钮
机器人提供内联键盘按钮,方便快速操作:
- 🪙 币种设置 - 选择关注的12种加密货币
- 🏷️ 分类设置 - 选择关注的14种新闻类别
- 🌐 English/中文 - 一键切换推送语言
- ⚙️ 筛选模式 - OR/AND 模式切换
新闻推送格式
📰 新闻标题
📝 摘要:
这是 AI 生成的新闻摘要(根据用户语言偏好显示中文或英文)...
📊 市场影响分析:
🟠 BTC: Bullish 📈 - 这条新闻对比特币有积极影响...
🔷 ETH: Neutral ➡️ - 对以太坊影响有限...
🟣 SOL: Bearish 📉 - 可能对 Solana 造成负面影响...
(显示用户关注的所有币种)
🔗 阅读原文
价格查询格式 (/s)
💰 Bitcoin (BTC) 价格
💵 当前价格: $67,234.56
📈 24小时涨跌: +2.35%
📊 24小时交易量: $28.5B
🏦 市值: $1.32T
📅 数据来源: CoinGecko
趋势分析格式 (/p)
📈 BTC 24小时分析
📊 趋势预测: 看涨 (可能上涨)
🎯 置信度: 中
💵 当前价格: $67,234.56 (+2.35% 📈)
📰 新闻情绪:
📈 看涨: 3 | 📉 看跌: 1 | ➡️ 中性: 2
📝 近期新闻摘要:
• SEC 批准新的比特币 ETF 申请...
• 机构投资者大量增持 BTC...
• 比特币网络活跃度达到新高...
⚠️ 以上为 AI 分析,仅供参考,不构成投资建议。
支持的币种
系统支持30+种主流加密货币(Binance USDT 交易对):
| 币种 | 名称 | 币种 | 名称 | 币种 | 名称 |
|---|---|---|---|---|---|
| BTC | Bitcoin | ETH | Ethereum | SOL | Solana |
| BNB | BNB | XRP | XRP | ADA | Cardano |
| DOGE | Dogecoin | DOT | Polkadot | AVAX | Avalanche |
| MATIC | Polygon | LINK | Chainlink | UNI | Uniswap |
| SHIB | Shiba Inu | LTC | Litecoin | ATOM | Cosmos |
| TRX | TRON | TON | Toncoin | SUI | Sui |
| APT | Aptos | NEAR | NEAR | OP | Optimism |
| ARB | Arbitrum | PEPE | Pepe | WIF | dogwifhat |
| FET | Fetch.ai | INJ | Injective | RENDER | Render |
| SEI | Sei | TIA | Celestia | JUP | Jupiter |
新闻类别
支持14种新闻类别:
| 类别 | 说明 | 类别 | 说明 |
|---|---|---|---|
| 🪙 加密货币 | 通用加密货币新闻 | 💰 DeFi | 去中心化金融 |
| 🎨 NFT | 非同质化代币 | ⚖️ 监管政策 | 政府监管相关 |
| 📈 市场分析 | 价格走势分析 | 🔧 区块链技术 | 技术发展动态 |
| 🏦 交易所 | 交易所相关新闻 | 💵 稳定币 | 稳定币动态 |
| ⚡ Layer2 | Layer2 解决方案 | 🌐 Web3 | Web3 生态 |
| 🔐 安全事件 | 黑客/漏洞事件 | 💼 机构动态 | 机构投资动向 |
| 🎮 GameFi | 游戏金融 | 🧬 元宇宙 | 元宇宙相关 |
筛选模式
| 模式 | 说明 |
|---|---|
| OR | 币种或类别任一匹配即推送(默认) |
| AND | 币种和类别必须同时匹配才推送 |
🏗️ 项目结构
crypto-news-bot/
├── Cargo.toml # 项目配置和依赖
├── .env.example # 环境变量示例
├── README.md # 项目说明文档
└── src/
├── main.rs # 主程序入口
├── lib.rs # 库模块导出
├── traits.rs # 核心 Trait 定义
├── config.rs # 配置管理
├── providers/ # 数据提供者
│ ├── mod.rs
│ ├── yahoo.rs # Yahoo Finance 新闻源
│ └── ai/
│ ├── mod.rs
│ └── cloudflare.rs # Cloudflare AI 分析
├── channels/ # 通知渠道
│ ├── mod.rs
│ └── telegram_channel.rs # Telegram 推送
├── storage/ # 存储层
│ ├── mod.rs
│ └── sqlite.rs # SQLite 存储
├── services/ # 业务服务层
│ ├── mod.rs
│ ├── news_service.rs
│ └── user_service.rs
├── ai.rs # [旧] AI 模块
├── db.rs # [旧] 数据库模块
├── news.rs # [旧] 新闻模块
└── telegram.rs # [旧] Telegram 模块
🔌 可扩展架构
项目采用 Trait-based 架构设计,便于扩展:
核心 Traits
| Trait | 说明 | 当前实现 |
|---|---|---|
NewsSource |
新闻数据源 | Yahoo Finance |
AiProvider |
AI 分析提供者 | Cloudflare Workers AI |
NotificationChannel |
通知推送渠道 | Telegram |
Storage |
数据存储 | SQLite |
扩展示例
// 添加新的新闻源
impl NewsSource for CoinDeskSource { ... }
// 添加新的 AI 提供者
impl AiProvider for OpenAiProvider { ... }
// 添加新的通知渠道
impl NotificationChannel for DiscordChannel { ... }
impl NotificationChannel for WebPushChannel { ... }
// 添加新的存储后端
impl Storage for PostgresStorage { ... }
impl Storage for MySqlStorage { ... }
📦 依赖说明
| 依赖 | 用途 |
|---|---|
tokio |
异步运行时 |
reqwest |
HTTP 客户端 |
serde / serde_json |
JSON 序列化 |
rusqlite |
SQLite 数据库 |
dotenvy |
环境变量加载 |
tracing |
日志系统 |
chrono |
时间处理 |
anyhow / thiserror |
错误处理 |
scraper |
HTML 解析 |
🔧 高级配置
自定义日志级别
# 设置详细日志
RUST_LOG=crypto_news_bot=debug cargo run
# 设置追踪日志(最详细)
RUST_LOG=crypto_news_bot=trace cargo run
调整新闻获取间隔
在 .env 中修改 FETCH_INTERVAL_SECS:
# 每 10 分钟获取一次
FETCH_INTERVAL_SECS=600
# 每 1 分钟获取一次(用于测试)
FETCH_INTERVAL_SECS=60
使用其他 AI 模型
修改 CLOUDFLARE_ENDPOINT 以使用 Cloudflare 支持的其他模型:
# 使用 Llama 模型
CLOUDFLARE_ENDPOINT=https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/ai/run/@cf/meta/llama-3-8b-instruct
# 使用 Mistral 模型
CLOUDFLARE_ENDPOINT=https://api.cloudflare.com/client/v4/accounts/YOUR_ACCOUNT_ID/ai/run/@cf/mistral/mistral-7b-instruct-v0.1
🐛 故障排除
常见问题
Q: 启动时提示 "环境变量 TELEGRAM_TOKEN 未设置"
A: 确保已创建 .env 文件并填入正确的 Token。
Q: 无法获取新闻
A: 检查网络连接,Yahoo Finance API 可能有地区限制。可以尝试使用代理。
Q: AI 分析失败
A: 检查 Cloudflare API Token 权限和 Account ID 是否正确。机器人会自动使用备用方案(简单情感分析)。
Q: Telegram 发送消息失败
A: 确认 Bot Token 正确,并且用户已经先向机器人发送过消息(用户必须主动开始对话)。
日志调试
# 查看详细日志
RUST_LOG=debug cargo run
# 只看错误
RUST_LOG=error cargo run
📝 数据库配置
SQLite(默认)
无需额外配置,开箱即用:
DATABASE_TYPE=sqlite
DATABASE_PATH=news_bot.db
PostgreSQL
方式1: 使用 DATABASE_URL(推荐)
DATABASE_TYPE=postgresql
DATABASE_URL=postgres://user:password@localhost:5432/newsbot
方式2: 分开配置
DATABASE_TYPE=postgresql
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=newsbot
POSTGRES_PASSWORD=your_password
POSTGRES_DB=newsbot
PostgreSQL 快速部署(Docker)
docker run -d \
--name newsbot-postgres \
-e POSTGRES_USER=newsbot \
-e POSTGRES_PASSWORD=your_password \
-e POSTGRES_DB=newsbot \
-p 5432:5432 \
postgres:16-alpine
数据库架构说明
本项目采用完全独立的数据库后端设计:
- SQLite: 适用于本地开发、单机部署
- PostgreSQL: 适用于生产环境、云部署
两种数据库完全独立,通过 DATABASE_TYPE 环境变量选择使用哪一种。应用层通过 DatabaseBackend 枚举统一调用,无需关心底层实现。
// 统一的数据库接口
enum DatabaseBackend {
Sqlite(SqliteDb),
Postgres(PostgresDb),
}
📝 数据库结构
news 表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键 |
| title | TEXT | 新闻标题 |
| link | TEXT | 新闻链接(唯一) |
| content | TEXT | 新闻内容 |
| source | TEXT | 新闻来源(默认 yahoo) |
| publish_date | TEXT | 发布日期 |
| summary | TEXT | AI 生成摘要 |
| btc_impact | TEXT | BTC 影响分析(兼容旧版) |
| eth_impact | TEXT | ETH 影响分析(兼容旧版) |
| crypto_impacts | TEXT | 所有币种影响(JSON 格式) |
| image_url | TEXT | 图片 URL |
| timestamp | DATETIME | 入库时间 |
users 表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键 |
| user_id | TEXT | 用户 ID(唯一,Telegram 为 chat_id) |
| channel | TEXT | 渠道类型(telegram/web/...) |
| username | TEXT | 用户名 |
| watched_cryptos | TEXT | 关注的币种(逗号分隔,默认 BTC,ETH) |
| language | TEXT | 推送语言(zh/en,默认 zh) |
| categories | TEXT | 关注的新闻类别(逗号分隔) |
| filter_mode | TEXT | 筛选模式(or/and,默认 or) |
| is_active | INTEGER | 是否活跃(1=是,0=否) |
| created_at | DATETIME | 创建时间 |
| updated_at | DATETIME | 更新时间 |
🔒 安全注意事项
- 不要 将
.env文件提交到版本控制 - 不要 在代码中硬编码 API 密钥
- 定期轮换 API Token
- 考虑为 Cloudflare Token 设置最小权限
📄 许可证
MIT License
🤝 贡献
欢迎提交 Issue 和 Pull Request!
📮 联系方式
如有问题,请提交 GitHub Issue。