mcpField
B
bingx-swap-ws-account

bingx-swap-ws-account

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

关于 bingx-swap-ws-account

用于接收 BingX USDT-M 永续合约账户实时事件的 skill,需要通过 Listen Key 身份验证。涵盖余额、持仓、订单和账户配置事件,以及密钥管理说明。

主要功能

  1. 01身份验证后的账户事件流
  2. 02余额与持仓更新
  3. 03订单和成交状态事件
  4. 04杠杆与保证金配置事件
  5. 05Listen Key 生命周期说明

适用场景

  1. 01监控账户余额变化
  2. 02跟踪持仓更新
  3. 03查看订单创建与成交
  4. 04观察杠杆或保证金模式变更

安装

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

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

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

附带文件api-reference.md

详细介绍

BingX Swap WebSocket 账户数据

通过 WebSocket 实时接收 BingX USDT-M 永续期货账户数据流。需要使用 Listen Key 进行身份验证。

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

使用有效的 listenKey 连接后,系统会自动推送所有事件类型,无需订阅频道。

快速参考

WebSocket 事件(自动推送)
事件类型描述推送频率
listenKeyExpiredListen Key 已过期过期时
ACCOUNT_UPDATE账户余额和持仓变更变更时
TRADE_UPDATE订单创建、成交和状态变更变更时
ACCOUNT_CONFIG_UPDATE杠杆/保证金模式变更连接时(完整信息)+ 每 5s
Listen Key REST API
端点方法描述身份验证
/openApi/user/auth/userDataStreamPOST生成 Listen Key(有效期 1 小时)是
/openApi/user/auth/userDataStreamPUT延长 Listen Key 有效期(至 60 min)是
/openApi/user/auth/userDataStreamDELETE删除 Listen Key是

Listen Key 管理

WebSocket 账户数据流需要使用 Listen Key 进行身份验证。有关 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 辅助函数:

限制:生成代码时,必须原样复制下方的 connectSwapWsAccount 函数。 请勿重写 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 connectSwapWsAccount(
  listenKey: string,
  onEvent: (event: any) => void
): WebSocket {
  const ws = new WebSocket(
    `wss://open-api-swap.bingx.com/swap-market?listenKey=${listenKey}`
  );
  ws.binaryType = "arraybuffer";

  ws.onmessage = (event) => {
    const text = decompress(event.data as ArrayBuffer);
    if (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;
}
代码使用规则
  • 必须原样复制 connectSwapWsAccount、generateListenKey 和 decompress
  • 必须处理 Ping/Pong 心跳机制
  • 必须每 30 分钟延长一次 Listen Key 有效期,以防过期
  • 不得删除 GZIP 解压缩逻辑

常见调用

连接账户数据流:

const listenKey = await generateListenKey(API_KEY, SECRET_KEY);
connectSwapWsAccount(listenKey, (event) => {
  if (event.e === "ACCOUNT_UPDATE") {
    // event.a.B: balance updates, event.a.P: position updates
  } else if (event.e === "TRADE_UPDATE") {
    // event.o: order details (symbol, side, type, status, price, qty, etc.)
    // o.li is present only for a TP/SL order with a related parent order.
    if (typeof event.o?.li === "string") {
      console.log("Parent order ID:", event.o.li); // Preserve the string ID.
    }
  } else if (event.e === "ACCOUNT_CONFIG_UPDATE") {
    // event.ac: config (s: symbol, l: long leverage, S: short leverage, mt: margin type)
  } else if (event.e === "listenKeyExpired") {
    // Reconnect with new listen key
  }
});

其他资源

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


Agent 交互规则

重要规则(适用于所有响应):

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

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

操作识别

当用户的请求含糊不清时(例如“监控我的 Swap 账户”),请询问他们需要哪些数据:

请选择账户数据流类型:

  • 账户余额和持仓更新 — ACCOUNT_UPDATE
  • 订单状态更新 — TRADE_UPDATE
  • 杠杆和保证金配置变更 — ACCOUNT_CONFIG_UPDATE
  • Listen Key 管理(生成/延长有效期/删除)
  • 所有事件(使用 listenKey 连接后自动接收全部事件)
账户数据流中的交易对上下文

账户数据流会自动推送所有交易对的数据,建立连接时无需提供交易对参数。每个推送事件都会在其数据载荷中包含相关交易对(例如,订单更新中的 o.s,以及持仓更新中的 a.P[].s)。如果用户询问特定交易对,请根据推送数据中的交易对字段筛选事件。

评论

支持 Markdown