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 神奇豆子
188 每月下载量
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