高级数据流
BNB Chain 发射平台上的每一笔交易、每一次发射和每一次毕业,都在一条连接上,在包含它的区块被看到的那一刻推送:Flap 和 four.meme(它的经典曲线和它的 OpenFour 引擎都算)上的每一笔买卖,带交易者、数量、曲线成交后的价格以及该价格对应的市值;每一个新代币;每一条售罄并迁移到 PancakeSwap 的曲线;以及之后在那些 PancakeSwap 池子(V2 交易对和 Infinity 池子)和 Uniswap v4 池子里的交易。
免费,无需密钥,无需账户。
wss://api.shrine.trade/bnb/api/stream/ws
试一试
选择平台并连接。最近的一条事件会立刻到达,之后的事件实时流入。
复制这段
- JavaScript
- Python
const ws = new WebSocket("wss://api.shrine.trade/bnb/api/stream/ws");
ws.onmessage = (e) => {
const t = JSON.parse(e.data);
// t.type: buy, sell, create or migrate; t.protocol: FLAP, FOURMEME, PANCAKESWAP or UNISWAP (t.engine on four.meme: classic or openfour)
if (t.type === "buy" || t.type === "sell") {
console.log(t.type, t.symbol, t.tokenAmountFormatted, "for", t.quoteAmountFormatted, t.quoteToken, "mcap", t.marketCap);
} else {
console.log(t.type, t.protocol, t.symbol, t.token);
}
};
Save it as stream.js and run node stream.js - no packages needed (Node 22+).
import json
from websockets.sync.client import connect
with connect("wss://api.shrine.trade/bnb/api/stream/ws") as ws:
for raw in ws:
t = json.loads(raw)
# t["type"]: buy, sell, create or migrate
if t["type"] in ("buy", "sell"):
print(t["type"], t["symbol"], t["tokenAmountFormatted"], "for", t["quoteAmountFormatted"], t["quoteToken"], "mcap", t.get("marketCap"))
else:
print(t["type"], t["protocol"], t["symbol"], t["token"])
Save it as stream.py, pip install websockets, then python stream.py.
你会收到什么
每条消息是一个事件,由 type 和 protocol 分类:
type | protocol | 含义 |
|---|---|---|
buy / sell | FLAP、FOURMEME | 该平台联合曲线上的一笔交易。 |
buy / sell | PANCAKESWAP | 一个已毕业代币在 PancakeSwap 池子里的交易,V2 交易对或 Infinity 池子;pool 指明是哪个,launchpad 说明代币来自哪里。 |
buy / sell | UNISWAP | 一个 Flap 或 four.meme 代币在 BNB Chain 上 Uniswap v4 池子里的交易,按池子 id,同样方式。 |
create | FLAP、FOURMEME | 一个代币在该曲线上发射,带发射数据流携带的全部字段。 |
migrate | PANCAKESWAP | 一条曲线售罄,代币迁移到它的 PancakeSwap 池子。launchpad 说明来自哪里。 |
four.meme 的事件带 engine:classic 是它原本的曲线,openfour 是通过 OpenFour(它的模块化引擎,以 BNB、稳定币或币安代币化资产计价,迁移到 V2 交易对或 Infinity 池子)发射的代币。用 ?protocols=FLAP,FOURMEME 过滤(平台名匹配它的曲线交易、发射、毕业以及它的代币在池子里的交易;PANCAKESWAP 和 UNISWAP 匹配该场所的池子交易,PANCAKESWAP 还匹配毕业),用 ?actions=buy,sell 过滤类型(buy、sell、create、migrate 任选)。两者都不加则全部接收。
一笔交易
{
"type": "buy", "protocol": "FOURMEME", "launchpad": "FOURMEME", "engine": "openfour",
"token": "0x…4444", "name": "Infinity Hook", "symbol": "INFINITY",
"blockNumber": 126580612, "txHash": "0x…", "logIndex": 14, "timestamp": 1791524090,
"quoteToken": "BNB", "quoteDecimals": 18,
"trader": "0x…",
"tokenAmount": "12500000000000000000000000", "tokenAmountFormatted": "12500000",
"quoteAmount": "100000000000000000", "quoteAmountFormatted": "0.1",
"fee": "1000000000000000", "taxBps": 0,
"price": "8037676093166", "priceFormatted": "0.000008037676093166",
"marketCap": "8037.676093166",
"totalSupply": "1000000000000000000000000000",
"tokensInCurve": "612000000000000000000000000", "quoteInCurve": "9100000000000000000"
}
tokenAmount是成交的代币数量,18 位小数;quoteAmount是买入时交易者付出、卖出时交易者收到的计价资产数量(quoteToken是BNB或该 ERC-20 的地址,quoteDecimals是它的小数位)。fee是平台在这笔交易上的协议费,taxBps是 Flap 税币在这一侧的税,基点(其他为 0);数量是曲线实际成交的,税已扣除。price是成交后每个代币的计价资产数量,按曲线报告的(18 位定点数),marketCap是该价格乘以totalSupply,以计价资产计。tokensInCurve和quoteInCurve是成交后曲线的状态:还在售的代币和已募集的计价资产。Flap 的交易不带这两项。trader是买入时收到代币的地址、卖出时卖出的地址;中间的路由合约不算交易者。- 池子交易(
protocol: "PANCAKESWAP"或"UNISWAP")带pool(V2 交易对的地址,或 Infinity / Uniswap v4 池子的 id)、池子实际成交的数量和成交后的价格;quoteToken是池子的配对资产,可能与曲线的计价资产不同。它没有trader、fee、tokensInCurve和quoteInCurve。
一次发射或一次迁移
create 和 migrate 携带与发射数据流相同的字段:计价资产、税、毕业阈值、元数据、迁移后的池子。只有 type 的名称不同(create 对应 new_launch,migrate 对应 graduated),其余一样。
代币迁移后,它的交易发生在 PancakeSwap 池子里,并以 PANCAKESWAP 的买卖继续留在这条流上;有人把 Flap 或 four.meme 代币放进 Uniswap v4 池子,也会同样以 UNISWAP 出现。Infinity 和 Uniswap v4 池子从开池那一刻起按 id 跟踪;V2 交易对从开出它的那次迁移起跟踪,服务启动时会读取最近一天的迁移,所以更早开出的交易对不会被跟踪。
说明
- 断线即重连。 长连接会断;重连后会先收到最近的一条事件。
- 每个 IP 一条连接。 第二条会被拒绝,返回
too_many_connections。一条不带过滤的连接已经包含所有事件,一条就够。 - 顺序。 事件按区块顺序到达,同一区块内按日志顺序(
logIndex)。four.meme 繁忙的一分钟有每秒数笔交易;读快一点或加过滤,落后太多的客户端会被跳过。