C#币安交易者排行榜程序:替换DataGridView中ID为昵称
C#币安Leaderboard昵称替换方案
核心思路
要将EncryptedUid替换为交易者昵称,需调用币安官方API通过加密ID获取对应公开昵称,再将昵称替换到DataGridView的对应列中。
步骤1:封装昵称获取方法
复用你现有币安API的HttpClient实例(已配置BaseAddress、API密钥等),实现获取昵称的异步方法:
// 缓存已获取的昵称,避免重复请求API private readonly Dictionary<string, string> _nicknameCache = new Dictionary<string, string>(); private HttpClient _binanceHttpClient; // 复用你已初始化的币安API HttpClient private async Task<string> GetTraderNickname(string encryptedUid) { // 优先从缓存取 if (_nicknameCache.TryGetValue(encryptedUid, out var cachedNickname)) return cachedNickname; try { // 构造请求参数 var queryParams = new Dictionary<string, string> { {"encryptedUid", encryptedUid}, {"recvWindow", "5000"}, {"timestamp", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()} }; // 生成币安API签名(私有接口必须) string signature = GenerateBinanceSignature(queryParams, "你的API密钥"); queryParams.Add("signature", signature); // 构造请求URL var queryString = string.Join("&", queryParams.Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}")); var requestUri = $"sapi/v1/leaderboard/getOtherUserInfo?{queryString}"; // 发送请求 var response = await _binanceHttpClient.GetAsync(requestUri); response.EnsureSuccessStatusCode(); // 解析响应 var userInfo = await response.Content.ReadFromJsonAsync<BinanceLeaderboardUserInfo>(); var nickname = userInfo?.NickName ?? encryptedUid; // 存入缓存 _nicknameCache[encryptedUid] = nickname; return nickname; } catch (Exception ex) { // 日志记录错误,这里简化处理 Console.WriteLine($"获取昵称失败[{encryptedUid}]: {ex.Message}"); return encryptedUid; } } // 币安API签名生成方法(复用你现有代码或直接用这个) private string GenerateBinanceSignature(Dictionary<string, string> queryParams, string apiSecret) { var sortedParams = queryParams.OrderBy(kv => kv.Key).Select(kv => $"{kv.Key}={kv.Value}"); var queryString = string.Join("&", sortedParams); using var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(apiSecret)); var hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(queryString)); return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant(); } // 响应模型(根据币安实际返回结构调整) public class BinanceLeaderboardUserInfo { [JsonPropertyName("nickName")] public string NickName { get; set; } // 其他字段可按需添加,如头像链接等 }
步骤2:修改DataGridView数据绑定逻辑
根据你当前的绑定方式,选择对应修改方案:
方案A:手动添加行的场景
如果是通过Rows.Add()逐行添加数据,修改为:
private async void btnLoadPositions_Click(object sender, EventArgs e) { btnLoadPositions.Enabled = false; dataGridView1.Rows.Clear(); try { // 获取原始持仓数据(复用你现有代码) var leaderboardPositions = await GetBinanceLeaderboardPositions(); foreach (var pos in leaderboardPositions) { // 获取昵称 string nickname = await GetTraderNickname(pos.EncryptedUid); // 添加行,将原EncryptedUid替换为nickname dataGridView1.Rows.Add( pos.Symbol, nickname, // 替换原EncryptedUid的位置 pos.PositionAmt, pos.EntryPrice, // 其他字段... ); } // 调整列标题(可选) dataGridView1.Columns[1].HeaderText = "交易者昵称"; } catch (Exception ex) { MessageBox.Show($"加载失败: {ex.Message}"); } finally { btnLoadPositions.Enabled = true; } }
方案B:绑定数据源的场景
如果是绑定List<T>等数据源,先处理数据再绑定:
// 定义视图模型,替换原模型中的EncryptedUid为Nickname public class LeaderboardPositionViewModel { public string Symbol { get; set; } public string TraderNickname { get; set; } public decimal PositionAmt { get; set; } public decimal EntryPrice { get; set; } // 其他字段... } private async void btnLoadPositions_Click(object sender, EventArgs e) { btnLoadPositions.Enabled = false; try { // 获取原始数据 var originalPositions = await GetBinanceLeaderboardPositions(); var processedData = new List<LeaderboardPositionViewModel>(); foreach (var pos in originalPositions) { string nickname = await GetTraderNickname(pos.EncryptedUid); processedData.Add(new LeaderboardPositionViewModel { Symbol = pos.Symbol, TraderNickname = nickname, PositionAmt = pos.PositionAmt, EntryPrice = pos.EntryPrice, // 映射其他字段 }); } // 绑定数据源 dataGridView1.DataSource = processedData; // 设置第二列绑定到TraderNickname dataGridView1.Columns[1].DataPropertyName = "TraderNickname"; dataGridView1.Columns[1].HeaderText = "交易者昵称"; } catch (Exception ex) { MessageBox.Show($"加载失败: {ex.Message}"); } finally { btnLoadPositions.Enabled = true; } }
注意事项
- API权限:确保你的币安API密钥已启用「读取用户信息」相关权限,且API密钥/密钥正确。
- 请求限流:币安API有请求频率限制,缓存已获取的昵称可以避免重复请求被限流。
- 异步处理:所有API调用使用异步方法,避免阻塞UI线程。
内容的提问来源于stack exchange,提问作者zollen 123
相关产品推荐
相关产品推荐

