🔥 热搜王 2.0:基于 TrendRadar 容器化改造的全网热点推送方案
在“热搜王 1.0”版本中,系统通过第三方接口获取单一平台的微博数据。
2.0 版本实现了架构重构。新方案基于开源项目 TrendRadar 进行了容器化二次封装,将原本分散的媒体热点进行聚合,并转化为标准微服务接口,支持多路飞书 Webhook 同步推送。
https://github.com/joyce677/TrendRadar
1. 技术架构演进
新版本放弃了单一 API 依赖,转向自建数据聚合层。
隐藏能力的激活:Flask 服务化
TrendRadar 原生具备 Web Server 潜力,但默认配置仅作为静态脚本运行。通过修改部署参数,将其改造为提供标准 JSON 数据的后端。
- 容器模式切换:通过
RUN_MODE=server环境变量,使容器在执行定时抓取任务的同时,开启后台 Flask 进程。 - 端口映射逻辑:将容器内 5001 端口映射至宿主机 5000 端口,实现了数据抓取与推送逻辑的物理隔离。
- 任务调度控制:利用
supercronic代替原生 crontab,解决了容器环境下定时任务日志难追踪的问题。
docker-compose.yml 核心段落:
services:
trend-radar:
build:
context: .
dockerfile: docker/Dockerfile
ports:
- "5000:5001"
environment:
- RUN_MODE=server # 启用服务模式
- CRON_SCHEDULE=*/30 * * * * # 聚合频率
command: python main.py --serve-api # 显式启动 API 服务
2. 工程优化点:解耦与容错
100% 配置外部化
为了提升迁移效率,2.0 版本实现了逻辑与数据的完全解耦。所有的 API 地址、推送目标(支持 Webhook 数组)、以及视觉阈值均由外部 config.json 驱动。
- 多群同步:支持同时向多个飞书群组分发,脚本自动遍历 Webhook 列表并处理发送状态。
- 重试机制:针对网络波动,增加了带时间间隔的指数补偿重试逻辑,确保推送的稳定性。
视觉分级与权重
引入了 exposure_settings 逻辑。脚本直接读取 JSON 报文中的 appearance_count(曝光频次),并根据预设阈值匹配对应的色标(红/橙/绿),使卡片在视觉上具备热度辨识度。
3. 数据提取与推送逻辑实现
接口数据获取
脚本会定期向 Docker 暴露的本地接口发起请求,并在超时或数据异常时触发重试。
def fetch_radar_trends_with_retry(cfg):
max_retries = cfg["runtime"]["max_retry_times"]
for retry_num in range(1, max_retries + 1):
try:
resp = requests.get(cfg["apis"]["radar_api_url"], timeout=20)
if resp.status_code == 200:
return resp.json()
except Exception as e:
log(f"Fetch failed, retry {retry_num}/{max_retries}: {e}")
time.sleep(cfg["runtime"]["retry_interval_seconds"])
return None
推送目标遍历
通过简单的循环逻辑,确保多路 Webhook 的发送互不干扰。
def send_to_all_webhooks(webhooks, card):
urls = [webhooks] if isinstance(webhooks, str) else webhooks
for url in urls:
try:
requests.post(url, json=card, timeout=10)
except Exception:
continue
4. 迁移与部署参考
| 配置文件模块 | 重点参数 | 作用 |
| feishu | webhooks | 填入多个 Webhook 地址以支持多群推送 |
| apis | radar_api_url | 容器映射地址,通常为 http://127.0.0.1:5000/api/trends |
部署步骤:
- 数据层启动:在项目根目录执行
docker-compose up -d。 - 验证接口:确认
curl http://localhost:5000/api/trends有效返回。 - 脚本挂载:安装
requests依赖后,通过nohup或systemd守护运行推送脚本。
nohup python3 trendingking.py &
飞书卡片效果
