#data-stream #connector #binance #request #spot #market #user

binance_spot_connector_rust

这是一个轻量级库,用作Binance公共API的连接器

4个稳定版本

1.1.0 2023年12月21日
1.0.2 2023年9月28日
1.0.1 2023年6月29日
1.0.0 2022年12月6日

#391 in 神奇豆子

Download history 60/week @ 2024-03-12 57/week @ 2024-03-19 41/week @ 2024-03-26 43/week @ 2024-04-02 24/week @ 2024-04-09 24/week @ 2024-04-16 52/week @ 2024-04-23 9/week @ 2024-04-30 4/week @ 2024-05-07 34/week @ 2024-05-14 65/week @ 2024-05-21 49/week @ 2024-05-28 44/week @ 2024-06-04 61/week @ 2024-06-11 31/week @ 2024-06-18 45/week @ 2024-06-25

188 每月下载量

MIT 协议

450KB
12K SLoC

Binance公共API连接器Rust

这是一个轻量级库,用作Binance公共API的连接器

  • 支持的API
    • /api/*
    • /sapi/*
    • 现货WebSocket市场流
    • 现货用户数据流
  • 测试案例和示例
  • 可自定义基本URL和请求超时
  • 阻塞和非阻塞客户端
  • 响应元数据
  • 支持HMAC和ED25519身份验证,但不支持RSA身份验证。

RESTful API

Binance Rust连接器公开了两层抽象,以与Binance RESTful API集成;一个高级抽象,由维护函数组成,与Binance API端点一对一映射,以及一个低级通用抽象,以获得对请求的更多控制。

高级使用示例

use env_logger::Builder;
use binance_spot_connector_rust::{
    http::Credentials,
    hyper::{BinanceHttpClient, Error},
    market::{self, klines::KlineInterval},
    trade
};

#[tokio::main]
async fn main() -> Result<(), Error> {
    Builder::from_default_env()
        .filter(None, log::LevelFilter::Info)
        .init();

    let credentials = Credentials::from_hmac("api-key".to_owned(), "api-secret".to_owned());
    let client = BinanceHttpClient::default().credentials(credentials);

    // Get candlesticks for BTCUSDT with a 1 minute interval
    let data = client.send(market::klines("BTCUSDT", KlineInterval::Minutes1)).await
        .expect("Request failed")
        .into_body_str().await
        .expect("Failed to read response body");
    log::info!("{}", data);

    // Get the last 10 candlesticks for BTCUSDT with a 1 hour interval
    let data = client.send(market::klines("BTCUSDT", KlineInterval::Hours1).limit(10)).await
        .expect("Request failed")
        .into_body_str().await
        .expect("Failed to read response body");
    log::info!("{}", data);

    // Get account information
    let data = client.send(trade::account()).await
        .expect("Request failed")
        .into_body_str().await
        .expect("Failed to read response body");
    log::info!("{}", data);

    Ok(())
}

其他端点的示例可以在examples文件夹中找到。

低级使用示例

use binance_spot_connector_rust::{
    http::{request::RequestBuilder, Method},
    hyper::{BinanceHttpClient, Error},
};
use env_logger::Builder;

#[tokio::main]
async fn main() -> Result<(), Error> {
    Builder::from_default_env()
        .filter(None, log::LevelFilter::Info)
        .init();

    let client = BinanceHttpClient::default();

    let builder = RequestBuilder::new(Method::Get, "/api/v3/klines")
        .params(vec![("symbol", "BTCUSDT"), ("interval", "1m")]);

    // Get candlesticks for BTCUSDT with a 1 minute interval
    let data = client
        .send(builder)
        .await
        .expect("Request failed")
        .into_body_str()
        .await
        .expect("Failed to read response body");
    log::info!("{}", data);

    Ok(())
}

WebSocket

use binance_spot_connector_rust::{
    market::klines::KlineInterval, market_stream::kline::KlineStream,
    tokio_tungstenite::BinanceWebSocketClient,
};
use env_logger::Builder;
use futures_util::StreamExt;

#[tokio::main]
async fn main() {
    Builder::from_default_env()
        .filter(None, log::LevelFilter::Info)
        .init();
    // Establish connection
    let (mut conn, _) = BinanceWebSocketClient::connect_async_default()
        .await
        .expect("Failed to connect");
    // Subscribe to streams
    conn.subscribe(vec![
        &KlineStream::new("BTCUSDT", KlineInterval::Minutes1).into()
    ])
    .await;
    // Read messages
    while let Some(message) = conn.as_mut().next().await {
        match message {
            Ok(message) => {
                let binary_data = message.into_data();
                let data = std::str::from_utf8(&binary_data).expect("Failed to parse message");
                log::info!("{:?}", data);
            }
            Err(_) => break,
        }
    }
    // Disconnect
    conn.close().await.expect("Failed to disconnect");
}

其他WebSocket流的其他示例可以在examples文件夹中找到。

心跳

一旦连接,WebSocket服务器每3分钟发送一个ping帧,并要求在10分钟内返回一个响应pong帧。此包自动处理pong响应。

测试网

/api/* 端点可以在现货测试网中进行测试。 /sapi/* 端点不受支持。

let client = BinanceHttpClient::with_url("https://testnet.binance.vision");

基本URL

建议传递 baseUrl 参数,即使在生产环境中,因为币安在性能问题的情况下提供了替代 URL。

  • https://api1.binance.com
  • https://api2.binance.com
  • https://api3.binance.com

超时

默认超时时间为 100,000 毫秒(100 秒)。

日志记录

此库实现了标准的 Rust 日志框架,它可与各种内置和第三方日志提供者一起工作。

有关如何在 Rust 中配置日志的更多信息,请访问 Rust Log

使用示例

use binance_spot_connector_rust::{
    http::Credentials,
    hyper::{BinanceHttpClient, Error},
    wallet,
};
use env_logger::Builder;

#[tokio::main]
async fn main() -> Result<(), Error> {
    Builder::from_default_env()
        .filter(None, log::LevelFilter::Debug)
        .init();

    let credentials = Credentials::from_hmac("api-key".to_owned(), "api-secret".to_owned());
    let client = BinanceHttpClient::default().credentials(credentials);

    // Get candlesticks for BTCUSDT with a 1 minute interval
    let data = client
        .send(wallet::system_status())
        .await
        .expect("Request failed")
        .into_body_str()
        .await
        .expect("Failed to read response body");

    Ok(())
}

示例输出

[2022-02-22T00:00:00Z DEBUG binance_spot_connector_rust::hyper::client] https://api.binance.com/sapi/v1/system/status
[2022-02-22T00:00:00Z DEBUG binance_spot_connector_rust::hyper::client] 200 OK
[2022-02-22T00:00:00Z INFO  binance_spot_connector_rust::hyper::client] {"status":0,"msg":"normal"}

测试用例

cargo test

示例

所有现货端点和流式的代码片段都可以在 examples 文件夹中找到。示例名称是示例目录名称和示例文件名称的组合,中间用下划线分隔。

cd examples && cargo run --example market_exchange_info

限制

不支持期货和普通期权 API

  • /fapi/*
  • /dapi/*
  • /vapi/*
  • 相关的 Websocket 市场和用户数据流

贡献

欢迎贡献。

如果您在此项目中发现了一个错误,请创建一个 issue 来讨论您想要进行的更改。

如果是一个 API 的问题,请在 币安开发者社区 上创建一个主题。

依赖关系

~6–19MB
~303K SLoC