【问题标题】:Why is my Poloniex lending bot failing to returnBalances?为什么我的 Poloniex 借贷机器人无法返回余额?
【发布时间】:2018-02-25 21:10:50
【问题描述】:

最近,作为一个个人好奇心项目,我一直在编写一个非常简单的机器人,用于 Poloniex(一种加密货币交易所)。我已经能够让公共 API 正常工作,但是当我开始测试交易 API 时,事情开始分崩离析。当我运行这个(以及 30 个其他变体以试图让事情正常工作)时,我得到的只是 {"error":"Invalid command."}。我基本上是使用我正在使用的每一个库的新手,所以我无法缩小错误的巨大余地。

Poloniex API 文档在这里:https://poloniex.com/support/api/

public String returnBalances() {
    try {
        long nonce = System.nanoTime();
        String params = "command=returnBalances&nonce=" + nonce;

        URL u = new URL(URL_PRIVATE + "?" + params);

        String sign = getSign(params);

        if(sign == null) return null;

        HttpURLConnection huc = (HttpURLConnection) u.openConnection();
        huc.setRequestMethod("GET");
        huc.setRequestProperty("Key", API_Key);
        huc.setRequestProperty("Sign", sign);
        huc.setRequestProperty("nonce", String.valueOf(nonce));

        return getDataFromHUC(huc);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

private String getSign(String c) {
    try {
        SecretKeySpec mac_key = new SecretKeySpec(API_secret.getBytes(), "HmacSHA512");
        Mac mac = Mac.getInstance("HmacSHA512");
        mac.init(mac_key);
        String sign = bytesToHex(mac.doFinal((c).getBytes()));
        return sign;
    }
    catch (Exception e) {
        return null;
    }
}
private String getDataFromHUC(HttpURLConnection huc) {
    try {
        huc.connect();

        BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()));
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line+"\n");
        }
        br.close();
        String data = sb.toString();

        return data;
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

此外,当我在谷歌上搜索东西以找到答案时,我发现没有一个人使用 java.net 库(我就是这样)。我是否完全错过了我应该做的事情?如果可能的话,我更愿意使用这些库,这样我就可以尽可能多地了解幕后发生的事情。

抱歉,如果这里或本网站的其他地方有明显的答案。我已经做了几个小时了,没有任何进展,所以我一定会犯错误。

附:我知道我的运行时错误处理可能质量很低,但我没有遇到任何问题,所以改进它是一种低优先级。

【问题讨论】:

    标签: java http bots poloniex


    【解决方案1】:

    如提供的文档中所述,整个 TradingAPI 需要 POST 请求。

    所以你需要huc.setRequestMethod("POST");而不是huc.setRequestMethod("GET");

    之后您可能还需要启用输入和输出:

    huc.setDoInput(true);
    huc.setDoOutput(true);
    

    别忘了设置你的 Content-Type 和 Content-Length:

    huc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    huc.setRequestProperty("Content-Length", params.length());
    

    您不需要将参数添加到 URL 的末尾,而是需要将它们写入输出(在设置请求属性之后):

    DataOutputStream os = new DataOutputStream(huc.getOutputStream());
    os.writeBytes(params);
    os.flush();
    

    看起来你不需要将 nonce 作为请求属性发送。

    我希望这会有所帮助!

    【讨论】:

    • 效果很好,但我真的不明白为什么。我发现我的设置错误是作为 GET 请求,而不是设置内容类型和大小。当我直接发送命令和随机数时,加密标志有什么意义?
    • 该标志是一个签名,用于确保您实际发送该命令,而不是其他任何人。 (防止中间人攻击和类似攻击)。当你连接到 https 时,你没有加密任何东西,这是由你的 http-cient 处理的,因此你已经在使用 SSL 加密。
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多