2017-09-17 9 views
0

最近、私は個人的な好奇心プロジェクトの一部として、Poloniex(暗号化交換)で使用する非常に簡単なボットを作成しています。私はパブリックAPIを正しく動作させることができましたが、トレーディングAPIのテストを開始したときに、物事が崩れ始めました。私がこれを実行すると(そして30の何か他のバリエーションが働くようにするために)、私が得るのは {"error":"Invalid command."}です。基本的に私が使用しているライブラリのすべてを使用することに新しいので、絞り込むことができない大きな誤差があります。Poloniex貸しボットが返済に失敗したのはなぜですか?

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.私はランタイムエラー処理がおそらくかなり低品質であることに気付いていますが、私はそれに問題はありませんでしたので、改善することはあまり優先されません。

答えて

0

提供されているドキュメントに記載されているとおり、TradingAPI全体にはPOST要求が必要です。

ので、代わりのhuc.setRequestMethod("GET");あなたはまた、おそらくその後のインとアウトプットを有効にする必要がありますhuc.setRequestMethod("POST");

が必要になります:

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(); 

ノンスをリクエストプロパティとして送信する必要はありません。

こちらがお役に立てば幸いです。

+0

それは完璧に機能しましたが、なぜ私は本当に理解できません。私は自分の間違いがGETリクエストであり、コンテンツの種類とサイズを設定していないことを確認しています。とにかくコマンドとノンスを直接送信すると、Signを暗号化するポイントは何ですか? –

+0

記号はあなたが実際にそのコマンドを送信したことを確認するための署名です。 (Man-in-the-middle攻撃などを防ぐ)。 httpsに接続してSSL暗号化を既に使用しているので、あなたは何かを暗号化しません。それはあなたのhttp-cientによって処理されます。 – Cyphrags

関連する問題