a telegram bot posting news and predictions
Find a file
Derrity 4431745a3f feat: 添加新闻搜索功能 /sn 命令,支持分页浏览
- 新增 /sn <关键词> [日期] 命令搜索历史新闻
- 支持按日期筛选 (YYYY-MM-DD 格式)
- 分页显示搜索结果,每页5条
- 内联键盘按钮翻页
- 更新 /help 和 README 文档
2026-01-24 23:55:13 +08:00
src feat: 添加新闻搜索功能 /sn 命令,支持分页浏览 2026-01-24 23:55:13 +08:00
.dockerignore feat: 切换到 Binance API 并添加 Docker 支持 2026-01-17 18:42:21 +08:00
.env.example feat: 添加 PostgreSQL 存储支持 2026-01-17 14:58:29 +08:00
.gitignore 重构: Trait-based 可扩展架构 2026-01-17 13:55:19 +08:00
Cargo.lock feat: 添加 PostgreSQL 存储支持 2026-01-17 14:58:29 +08:00
Cargo.toml feat: 添加 PostgreSQL 存储支持 2026-01-17 14:58:29 +08:00
docker-compose.yml feat: 切换到 Binance API 并添加 Docker 支持 2026-01-17 18:42:21 +08:00
Dockerfile feat: 切换到 Binance API 并添加 Docker 支持 2026-01-17 18:42:21 +08:00
README.md feat: 添加新闻搜索功能 /sn 命令,支持分页浏览 2026-01-24 23:55:13 +08:00

🤖 加密货币新闻广播机器人

一个基于 Rust 开发的生产级 Telegram 机器人,自动获取、分析并推送加密货币相关新闻。

功能特性

核心功能

  • 📰 自动新闻获取: 每 5 分钟从 Yahoo Finance 获取加密货币相关新闻
  • 🤖 AI 智能分析: 使用 Cloudflare Workers AI (qwen3-30b-a3b-fp8) 生成摘要和市场影响分析
  • 📊 市场影响预测: 对每条新闻分析其对用户关注币种的潜在影响(看涨/看跌/中性)
  • 📱 Telegram 推送: 自动将新闻推送给所有订阅用户
  • 🖼️ 图片支持: 如果新闻包含图片,会以图文形式发送
  • 🗑️ 垃圾过滤: 自动过滤无实质内容的新闻和废话摘要
  • 💰 实时价格查询: Binance USDT 交易对实时价格、24h涨跌幅、高低价、交易量
  • 📈 趋势分析: 基于24小时新闻情绪分析币种涨跌趋势
  • 🔔 价格提醒: 自动通知 BTC/ETH 价格波动BTC 每 1000 USDTETH 每 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

  1. 在 Telegram 中搜索 @BotFather
  2. 发送 /newbot 命令
  3. 按提示设置机器人名称和用户名
  4. 获取 Bot Token格式类似123456789:ABCdefGHIjklMNOpqrsTUVwxyz

Cloudflare API Token

  1. 登录 Cloudflare Dashboard
  2. 进入 My ProfileAPI Tokens
  3. 点击 Create Token
  4. 选择 Workers AI 权限模板或自定义权限
  5. 复制生成的 Token

Cloudflare Account ID

  1. 在 Cloudflare Dashboard 首页
  2. 右侧边栏可以看到 Account ID
  3. 将其填入 CLOUDFLARE_ENDPOINTYOUR_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。