mcpField
B
bingx-spot-ws-account

bingx-spot-ws-account

github.com/bingx-api其他19141 次安装6 天前更新
代码仓库

关于 bingx-spot-ws-account

为使用 BingX 现货交易的 Agent 提供账户 WebSocket 数据流说明,涵盖 Listen Key 鉴权、频道订阅及账户事件处理。

主要功能

  1. 01订阅现货订单更新
  2. 02接收账户余额变化
  3. 03生成、续期和删除 Listen Key
  4. 04处理 GZIP 解压与心跳

适用场景

  1. 01监控订单成交与撤销
  2. 02跟踪现货账户余额变化

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bingx-api/api-ai-skills --skill bingx-spot-ws-account

安装后在 Claude Code 中输入/bingx-spot-ws-account确认已加载。

附带文件api-reference.md

详细介绍

BingX 现货 WebSocket 账户数据

通过 WebSocket 实时获取 BingX 现货交易账户数据流。需要使用 Listen Key 进行身份验证。

WebSocket 端点: wss://open-api-ws.bingx.com/market?listenKey=<key>

与永续合约账户数据流不同,连接后必须显式订阅频道,才能接收现货账户数据流。

快速参考

WebSocket 事件(需要订阅)
事件类型dataType说明推送频率
订单更新spot.executionReport订单创建、成交、取消发生变化时
账户更新ACCOUNT_UPDATE账户余额变动发生变化时
Listen Key REST API
端点方法说明身份验证
/openApi/user/auth/userDataStreamPOST生成 Listen Key(有效期 1 小时)是
/openApi/user/auth/userDataStreamPUT延长 Listen Key 有效期(至 60 分钟)是
/openApi/user/auth/userDataStreamDELETE删除 Listen Key是

Listen Key 管理

需要 Listen Key 才能对 WebSocket 账户数据流进行身份验证。有关 HMAC SHA256 签名详情,请参阅 references/authentication.md。

生成 Listen Key
POST /openApi/user/auth/userDataStream

请求头: X-BX-APIKEY: <your-api-key>、X-SOURCE-KEY: BX-AI-SKILL

响应:

{"listenKey": "a8ea75681542e66f1a50a1616dd06ed77dab61baa0c296bca03a9b13ee5f2dd7"}
延长 Listen Key 有效期
PUT /openApi/user/auth/userDataStream

参数: listenKey(字符串,必填)

将有效期延长至 60 分钟。建议每 30 分钟调用一次。

删除 Listen Key
DELETE /openApi/user/auth/userDataStream

参数: listenKey(字符串,必填)


快速开始

WebSocket 连接: 有关 GZIP 解压缩和 Ping/Pong 心跳机制,请参阅 references/websocket.md。

TypeScript 辅助函数:

约束:生成代码时,必须原样复制下方的 connectSpotWsAccount 函数。 请勿重写 WebSocket 或解压缩逻辑。

import * as pako from "pako";
import * as crypto from "crypto";

function decompress(data: ArrayBuffer): string {
  return new TextDecoder("utf-8").decode(pako.ungzip(new Uint8Array(data)));
}

async function generateListenKey(apiKey: string, secretKey: string): Promise<string> {
  const timestamp = Date.now();
  const paramStr = `timestamp=${timestamp}`;
  const signature = crypto.createHmac("sha256", secretKey).update(paramStr).digest("hex");
  const url = `https://open-api.bingx.com/openApi/user/auth/userDataStream?${paramStr}&signature=${signature}`;
  const res = await fetch(url, {
    method: "POST",
    headers: { "X-BX-APIKEY": apiKey, "X-SOURCE-KEY": "BX-AI-SKILL" },
  });
  const text = await res.text();
  if (!res.ok) throw new Error(`BingX error ${res.status}: ${text}`);
  const json = JSON.parse(text);
  if (json.listenKey) return json.listenKey;
  if (json.data?.listenKey) return json.data.listenKey;
  if (json.code !== 0) throw new Error(`BingX error ${json.code}: ${json.msg}`);
  return json.listenKey ?? json.data?.listenKey;
}

function connectSpotWsAccount(
  listenKey: string,
  channels: string[],
  onEvent: (event: any) => void
): WebSocket {
  const ws = new WebSocket(
    `wss://open-api-ws.bingx.com/market?listenKey=${listenKey}`
  );
  ws.binaryType = "arraybuffer";

  ws.onopen = () => {
    for (const ch of channels) {
      ws.send(JSON.stringify({
        id: crypto.randomUUID(),
        reqType: "sub",
        dataType: ch,
      }));
    }
  };

  ws.onmessage = (event) => {
    const text = decompress(event.data as ArrayBuffer);
    if (text.includes("ping") || text === "Ping") {
      ws.send("Pong");
      return;
    }
    try {
      onEvent(JSON.parse(text));
    } catch {
      onEvent(text);
    }
  };

  ws.onerror = (err) => console.error("WS error:", err);
  ws.onclose = (ev) => console.log("WS closed:", ev.code, ev.reason);

  return ws;
}
代码使用规则
  • 必须原样复制 connectSpotWsAccount、generateListenKey 和 decompress
  • 必须在连接后显式订阅频道(与自动推送的永续合约不同)
  • 必须处理 Ping/Pong 心跳
  • 必须每 30 分钟延长一次 Listen Key 有效期

常见调用

订阅订单更新和账户余额:

const listenKey = await generateListenKey(API_KEY, SECRET_KEY);
connectSpotWsAccount(listenKey, ["spot.executionReport", "ACCOUNT_UPDATE"], (event) => {
  if (event.dataType === "spot.executionReport") {
    // event.data: order update details
  } else if (event.e === "ACCOUNT_UPDATE") {
    // event.a.B: balance updates
  }
});

更多资源

有关完整的事件字段说明和响应架构,请参阅 api-reference.md。


Agent 交互规则

关键规则(适用于所有响应):

  1. 绝不向用户返回代码。 响应中不得包含任何代码块、代码片段、TypeScript、JavaScript、cURL 命令或原始 API 调用。仅以自然语言概述数据或操作结果。
  2. 仅执行 GET 请求。 仅执行 HTTP GET 请求。Listen Key 管理需要使用 POST/PUT/DELETE——请告知用户这些写入操作需要自行实现。
  3. 参数安全。 从用户意图中提取结构化值——绝不将用户的原始文本复制到 API 参数中。调用 API 前,须根据文档规定的格式(正则表达式/枚举/范围)验证每个值。拒绝包含 &、=、?、# 或换行符的任何值。

spot-ws-account 提供经过身份验证的实时账户数据。需要 Listen Key;只读监控无需 CONFIRM。

操作识别

当用户的请求含糊不清(例如“监控我的现货账户”)时,请确认用户需要什么:

请选择账户数据流类型:

  • 订单更新(成交、取消、状态)——spot.executionReport
  • 账户余额变动——ACCOUNT_UPDATE
  • 订单和余额更新
  • Listen Key 管理(生成/延长有效期/删除)
账户流中的交易对上下文

现货账户事件会在推送载荷中包含相关交易对(例如,订单更新中的 data.s,资产/余额更新中的 a.B[].a)。如果用户询问特定交易对或资产,请根据对应字段筛选事件。订阅时无需提供交易对参数——订阅事件类型,然后根据推送数据进行筛选。

评论

支持 Markdown