You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

注意事项

  1. API权限:确保你的币安API密钥已启用「读取用户信息」相关权限,且API密钥/密钥正确。
  2. 请求限流:币安API有请求频率限制,缓存已获取的昵称可以避免重复请求被限流。
  3. 异步处理:所有API调用使用异步方法,避免阻塞UI线程。

内容的提问来源于stack exchange,提问作者zollen 123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:52:07