DEX Screener Monitor

一、项目背景

本项目用于调研 DexScreener 平台的数据。DexScreener 提供 WebSocket 接口,对外推送代币资料(Token Profiles)、广告消耗(Ads)、Boost 消耗(Boosts)等实时数据。

通过本地部署本监控服务,可以:

数据来源均为 DexScreener 官方 WebSocket,仅做采集与展示,不修改原始内容。

二、项目架构

整体为单进程:HTTP 服务 + 3 个 WebSocket 客户端 + SQLite。执行 npm run monitor 会同时启动监控面板与所有采集端。

2.1 入口与 HTTP

2.2 WebSocket 采集

三个独立模块,各连一个 DexScreener WebSocket,连接即订阅,无需发送 subscribe 消息:

名称URL实现文件
Token Profileswss://api.dexscreener.com/token-profiles/latest/v1src/ws-profiles.js
Adswss://api.dexscreener.com/ads/latest/v1src/ws-ads.js
Boostswss://api.dexscreener.com/token-boosts/latest/v1src/ws-boosts.js

断线后约 5 秒自动重连。

2.3 数据层

2.4 去重与写入

每条 WebSocket 消息会:

  1. 写入 messages 一行(channel + received_at + raw_json)。
  2. 按业务拆成多条(如一条消息含多 chain/address)后,对每条用 raw_json 的 MD5 查是否已存在(同 chain+address+md5);存在则不再写入 push 表,实现按内容去重。

因此 profile_pushes / ads_pushes / boosts_pushes 中仅保留「有变化的」推送记录。

三、统计逻辑

所有统计均以去重后的 push 表为准,时间统一为 UTC,展示格式 YYYY-MM-DD HH:mm UTC

3.1 时间范围

3.2 Dashboard 与 API 统计

3.3 状态卡片(顶部)

顶部 Profiles / Ads / Boosts 状态卡片来自 /api/ws-status,展示「最后收到」与「最近1分钟」条数;若请求带 from/to(与 dashboard 一致),则 24h 相关统计与下方 dashboard 使用同一时间区间,保证口径一致。

3.4 消耗统计(Ads / Boosts Tab)

ads_tracking / boosts_trackingchain + token_address 聚合:展示 initial、current、consumed、状态等;历史记录表内时间列格式为 YYYY-MM-DD HH:mm UTC。

3.5 搜索

/api/search?q=:Profiles 从 profile_pushes 按 address/chain LIKE 查询(去重口径);Ads/Boosts 从对应 tracking 表查询。

文档路径:public/docs.html,访问 /docs/docs.html