为什么我的 Poloniex 借贷机器人无法归还余额?
Why is my Poloniex lending bot failing to returnBalances?
最近,作为一个个人好奇项目,我一直在编写一个非常简单的机器人,用于 Poloniex(一种加密货币交易所)。我已经能够让 public 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
库(我就是)。我是否完全错过了我应该做的事情?如果可能的话,我更愿意使用这些库,这样我就可以真正了解幕后发生的事情。
抱歉,如果这里或本网站的其他地方有明显的答案。我已经做了几个小时了,但没有任何进展,所以我一定会犯错误。
P.S。我知道我的 运行 时间错误处理可能质量很差,但我没有遇到任何问题,因此改进它的优先级较低。
如提供的文档中所述,整个 TradingAPI 需要 POST 个请求。
所以你需要 huc.setRequestMethod("POST");
而不是 huc.setRequestMethod("GET");
之后您可能还需要启用输入和输出:
huc.setDoInput(true);
huc.setDoOutput(true);
不要忘记设置内容类型和内容长度:
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();
它也像您不需要将随机数作为请求发送一样 属性。
希望对您有所帮助!
最近,作为一个个人好奇项目,我一直在编写一个非常简单的机器人,用于 Poloniex(一种加密货币交易所)。我已经能够让 public 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
库(我就是)。我是否完全错过了我应该做的事情?如果可能的话,我更愿意使用这些库,这样我就可以真正了解幕后发生的事情。
抱歉,如果这里或本网站的其他地方有明显的答案。我已经做了几个小时了,但没有任何进展,所以我一定会犯错误。
P.S。我知道我的 运行 时间错误处理可能质量很差,但我没有遇到任何问题,因此改进它的优先级较低。
如提供的文档中所述,整个 TradingAPI 需要 POST 个请求。
所以你需要 huc.setRequestMethod("POST");
huc.setRequestMethod("GET");
之后您可能还需要启用输入和输出:
huc.setDoInput(true);
huc.setDoOutput(true);
不要忘记设置内容类型和内容长度:
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();
它也像您不需要将随机数作为请求发送一样 属性。
希望对您有所帮助!