2017-09-17 4 views
0

Récemment, en tant que projet personnel de curiosité, j'ai écrit un bot incroyablement simple à utiliser sur Poloniex (un échange de crypto-monnaie). J'ai réussi à faire fonctionner correctement l'API publique, mais lorsque j'ai commencé à tester l'API de trading, les choses ont commencé à s'effondrer. Quand je cours ceci (et le 30 quelque chose d'autres variations dans une tentative de faire fonctionner les choses) tout ce que je reçois est {"error":"Invalid command."}. Je suis nouveau à l'utilisation de toutes les bibliothèques que j'utilise, donc il y a une énorme marge d'erreur que je ne peux pas réduire.Pourquoi mon robot de prêt Poloniex ne retourne-t-il pas les Balances?

documentation API Poloniex est ici: 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; 
    } 
} 

De plus, alors que je googler des choses à trouver une réponse, je trouve que pas une seule personne utilise les bibliothèques java.net (que je suis). Ai-je complètement manqué de base sur ce que je devrais faire? Je préférerais utiliser ces bibliothèques si possible afin que je puisse vraiment apprendre ce qui se passe dans les coulisses autant que je le peux. Désolé s'il y a une réponse évidente ici ou ailleurs sur ce site Web. Cela fait des heures que je suis dans cette situation sans progrès, donc je suis obligé de faire des erreurs.

P.S. Je suis conscient que ma gestion des erreurs d'exécution est probablement de qualité médiocre, mais je n'ai eu aucun problème avec cela, donc l'amélioration est une faible priorité.

Répondre

0

Comme décrit dans la documentation fournie, l'ensemble TradingAPI nécessite des requêtes POST.

Ainsi, au lieu de huc.setRequestMethod("GET"); vous aurez besoin huc.setRequestMethod("POST");

Vous devez probablement activer les entrées et sorties après:

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

Et ne pas oublier de mettre votre Content-Type et Content-Length:

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

et au lieu d'ajouter les paramètres à la fin de votre URL, vous devez les écrire à la sortie (à droite après soi Il indique également que vous n'avez pas besoin d'envoyer le nonce en tant que propriété de requête.

J'espère que cela aide!

+0

Cela a fonctionné parfaitement, mais je ne comprends pas vraiment pourquoi. Je vois mon erreur avec le réglage est comme une demande GET et ne pas définir le type de contenu et la taille. Quel est l'intérêt de crypter le signe quand j'envoie la commande et le nonce directement de toute façon? –

+0

le signe est une signature qui est là pour s'assurer que vous envoyez effectivement cette commande, et personne d'autre. (Empêche les attaques Man-in-the-Middle et similaires). Et vous ne cryptez rien, c'est géré par votre http-cient, car vous vous connectez à https donc vous utilisez déjà un cryptage SSL. – Cyphrags