🔥 热搜王 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. 迁移与部署参考

配置文件模块重点参数作用
feishuwebhooks填入多个 Webhook 地址以支持多群推送
apisradar_api_url容器映射地址,通常为 http://127.0.0.1:5000/api/trends

部署步骤:

  1. 数据层启动:在项目根目录执行 docker-compose up -d
  2. 验证接口:确认 curl http://localhost:5000/api/trends 有效返回。
  3. 脚本挂载:安装 requests 依赖后,通过 nohupsystemd 守护运行推送脚本。
nohup python3 trendingking.py &

飞书卡片效果