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. 나는 런타임 오류 처리가 아마도 매우 낮은 품질이라는 것을 알고 있지만 개선에 아무런 문제가 없으므로 개선이 최우선 과제입니다.

답변

0

제공된 설명서에 설명 된대로 전체 TradingAPI에는 POST 요청이 필요합니다. 당신의 Content-Type을 설정

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

을 그리고 잊지 마세요 :

그래서 그 대신 huc.setRequestMethod("GET"); 당신은 또한 아마 그 이후 인 - 출력을 사용하도록 설정해야합니다 huc.setRequestMethod("POST");

해야합니다 및 콘텐츠 길이 :

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

URL 끝 부분에 매개 변수를 추가하는 대신 매개 변수를 출력에 추가해야합니다 (se 요청 속성을 보내면) :

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

또한 nonce를 요청 속성으로 보낼 필요가없는 것처럼 솔기가 있습니다.

도움이 되었기를 바랍니다.

+0

완벽하게 작동했지만 실제로 이유를 이해하지 못합니다. 내가 설정하는 실수는 GET 요청이며 콘텐츠 유형 및 크기를 설정하지 않는 것입니다. 명령과 넌스를 직접 보낼 때 Sign를 암호화하는 것은 무엇입니까? –

+0

기호는 실제로 그 명령을 보내고 다른 사람은 보내지 않도록하기위한 서명입니다. (Man-in-the-middle 공격 및 유사한 방지). https에 연결하면 이미 SSL 암호화를 사용하므로 아무 것도 암호화하지 않습니다. 이는 HTTP 클라이언트가 처리합니다. – Cyphrags