403 エラーが発生しているので、おそらく認証に関係していることはわかっていますが、それを理解できないようです。私はウェブサイトhttps://bitbucket.org/nitrous/mtgox-api/overviewの指示にほぼ従ってきましたが、役に立ちませんでした。私の知る限り、プロトコルは次のとおりです。
- リクエストのパス (または何かのように見える必要があります
BTCUSE/money/info
) の後に null 文字\0
が続き、その後に投稿パラメーターが続き、それらを文字列に結合します。 - base 64 から秘密鍵をデコードする
- hmac sha512、メッセージとして上記の文字列、秘密鍵として秘密鍵を使用して、hmac アルゴリズムを実行して署名を作成します。
- この全体を base64 にエンコードします
この段階で、私は
params: "nonce=1375719059438000"
message: "BTCUSD/money/info nonce=1375719059438000"
したがって、ナンス以外のパラメーターを必要としない情報呼び出しを作成しようとしています。ドキュメントにあるように、リクエスト プロパティの「rest-key」を apikey に設定し、「rest-sign」を署名に設定してから、投稿を完了します。しかし、私は403の応答を得ています。このウェブサイトからいくつかの質問があり、フォーラムで見たが答えられなかったのは次のとおりです。
- 投稿パラメータで urlencode を使用するとどうなりますか? 私はそれをする必要がありますか?彼はそれを行い、私が見たすべての例でそうしていますが、これをしなければならないと言っているものは見たことがありません。
- 私のヌル文字は正しいですか?私は指示に従いましたが、先ほど示したページの例では、彼のメッセージ文字列にはまだ が含ま
\0
れています。何か案は?コードをスタック オーバーフローに投稿した方がよいと思われる場合はお知らせください。\
\\0
\0
リクエストを行うための私のコードは次のとおりです。
public String queryMtGox(String method, HashMap<String, String> args) throws
IllegalStateException{
String path = "BTCUSD/money/" + method;
try {
String nonce = String.valueOf(System.currentTimeMillis())+"000";
String post_data = this.buildMtGoxQueryString(args);
if (post_data.contentEquals("")){
post_data+="nonce="+nonce;
}else post_data+="&nonce="+nonce;
String message = path +"\0"+post_data;
// args signature
Mac mac = Mac.getInstance("HmacSHA512");
SecretKeySpec secret_spec = new
SecretKeySpec(Base64.decodeBase64(this.goxsecret), "HmacSHA512");
mac.init(secret_spec);
String signature = Base64.encodeBase64String(mac.doFinal(message.getBytes()));
// build URL
URL queryUrl = new URL("https://data.mtgox.com/api/2/" + path);
// create connection
HttpsURLConnection connection = (HttpsURLConnection)queryUrl.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Rest-Key", this.goxkey);
connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible;
MtGoxTradeCLI)");
connection.setRequestProperty("Content-Type","application/x-www-form-
urlencoded");
connection.setRequestProperty("Rest-Sign", signature.replaceAll("\n", ""));
// write post
DataOutputStream outdata = new DataOutputStream(connection.getOutputStream());
outdata.write(post_data.getBytes());
outdata.close();
connection.disconnect();
int len;
// read inf
byte buffer[] = new byte[16384];
len = connection.getInputStream().read(buffer, 0, 16384);
System.out.print(new String(buffer, 0, len, "UTF-8"));
} catch (Exception ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
return "foo";
}
getInputStream()
コースでエラーが発生しています。