- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我目前正在为 Java
实现 Kraken API
。我正在使用我在 http://pastebin.com/nHJDAbH8 上找到的示例代码.
Kraken
( https://www.kraken.com/help/api ) 描述的一般用法是:
API-Key
= API key
API-Sign
= Message signature using HMAC-SHA512 of
( URI path + SHA256( nonce + POST data ) )
andbase64
decoded secret API key
和
nonce
= always increasing unsigned 64 bit integer
otp
= two-factor password ( if two-factor enabled, otherwise not required )
但是我面临以下回应:
{"error":["EAPI:Invalid key"]}
我已经尝试了几种方法(获取新的 API,尝试更改 sha256
方法,因为我认为它的散列方式有问题)
所以这是代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class KrakenClient {
protected static String key = "myAPIKey"; // API key
protected static String secret = "MySecret===="; // API secret
protected static String url = "api.kraken.com"; // API base URL
protected static String version = "0"; // API version
public static void main(String[] args) throws Exception {
queryPrivateMethod("Balance");
}
public static void queryPrivateMethod(String method) throws NoSuchAlgorithmException, IOException{
long nonce = System.currentTimeMillis();
String path = "/" + version + "/private/" + method; // The path like "/0/private/Balance"
String urlComp = "https://"+url+path; // The complete url like "https://api.kraken.com/0/private/Balance"
String postdata = "nonce="+nonce;
String sign = createSignature(nonce, path, postdata);
postConnection(urlComp, sign, postdata);
}
/**
* @param nonce
* @param path
* @param postdata
* @return
* @throws NoSuchAlgorithmException
* @throws IOException
*/
private static String createSignature(long nonce, String path,
String postdata) throws NoSuchAlgorithmException, IOException {
return hmac(path+sha256(nonce + postdata), new String(Base64.decodeBase64(secret)));
}
public static String sha256Hex(String text) throws NoSuchAlgorithmException, IOException{
return org.apache.commons.codec.digest.DigestUtils.sha256Hex(text);
}
public static byte[] sha256(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException{
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(text.getBytes());
byte[] digest = md.digest();
return digest;
}
public static void postConnection(String url1, String sign, String postData) throws IOException{
URL url = new URL( url1 );
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.addRequestProperty("API-Key", key);
connection.addRequestProperty("API-Sign", Base64.encodeBase64String(sign.getBytes()));
// connection.addRequestProperty("API-Sign", sign);
connection.addRequestProperty("User-Agent", "Mozilla/4.0");
connection.setRequestMethod( "POST" );
connection.setDoInput( true );
connection.setDoOutput( true );
connection.setUseCaches( false );
// connection.setRequestProperty( "Content-Type",
// "application/x-www-form-urlencoded" );
connection.setRequestProperty( "Content-Length", String.valueOf(postData.length()) );
OutputStreamWriter writer = new OutputStreamWriter( connection.getOutputStream() );
writer.write( postData );
writer.flush();
BufferedReader reader = new BufferedReader(
new InputStreamReader(connection.getInputStream()) );
for ( String line; (line = reader.readLine()) != null; )
{
System.out.println( line );
}
writer.close();
reader.close();
}
public static String hmac(String text, String secret){
Mac mac =null;
SecretKeySpec key = null;
// Create a new secret key
try {
key = new SecretKeySpec( secret.getBytes( "UTF-8"), "HmacSHA512" );
} catch( UnsupportedEncodingException uee) {
System.err.println( "Unsupported encoding exception: " + uee.toString());
return null;
}
// Create a new mac
try {
mac = Mac.getInstance( "HmacSHA512" );
} catch( NoSuchAlgorithmException nsae) {
System.err.println( "No such algorithm exception: " + nsae.toString());
return null;
}
// Init mac with key.
try {
mac.init( key);
} catch( InvalidKeyException ike) {
System.err.println( "Invalid key exception: " + ike.toString());
return null;
}
// Encode the text with the secret
try {
return new String( mac.doFinal(text.getBytes( "UTF-8")));
} catch( UnsupportedEncodingException uee) {
System.err.println( "Unsupported encoding exception: " + uee.toString());
return null;
}
}
}
最佳答案
这是一个工作示例:
static String key = "---myKey---";
static String secret = "---mySecret---";
String nonce, signature, data, path;
static String domain = "https://api.kraken.com";
void account_balance() {
nonce = String.valueOf(System.currentTimeMillis());
data = "nonce=" + nonce;
path = "/0/private/Balance";
calculateSignature();
String answer = post(domain + path, data);
// on empty accounts, returns {"error":[],"result":{}}
// this is a known Kraken bug
...
}
String post(String address, String output) {
String answer = "";
HttpsURLConnection c = null;
try {
URL u = new URL(address);
c = (HttpsURLConnection)u.openConnection();
c.setRequestMethod("POST");
c.setRequestProperty("API-Key", key);
c.setRequestProperty("API-Sign", signature);
c.setDoOutput(true);
DataOutputStream os = new DataOutputStream(c.getOutputStream());
os.writeBytes(output);
os.flush();
os.close();
BufferedReader br = null;
if(c.getResponseCode() >= 400) {
System.exit(1);
}
br = new BufferedReader(new InputStreamReader((c.getInputStream())));
String line;
while ((line = br.readLine()) != null)
answer += line;
} catch (Exception x) {
System.exit(1);
} finally {
c.disconnect();
}
return answer;
}
void calculateSignature() {
signature = "";
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update((nonce + data).getBytes());
Mac mac = Mac.getInstance("HmacSHA512");
mac.init(new SecretKeySpec(Base64.decodeBase64(secret.getBytes()), "HmacSHA512"));
mac.update(path.getBytes());
signature = new String(Base64.encodeBase64(mac.doFinal(md.digest())));
} catch(Exception e) {}
return;
}
关于java - Kraken API在Java中的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38189100/
我正在尝试使用 REST API 从 Kraken 检索 3 个月的 30 分钟蜡烛历史记录: https://www.kraken.com/help/api 按照文档,我向 URL 发出了这个 PO
所以我目前正在为 Java 实现 Kraken API。我正在使用我在 http://pastebin.com/nHJDAbH8 上找到的示例代码. Kraken ( https://www.krak
我使用 gitkraken 已经有一段时间了,但我注意到在 v2.5 之后菜单栏(或工具栏)丢失了。结果我无法最小化 gitkraken。所以如果我想在 gitkraken 和另一个之间切换窗口我必须
我正在使用Kraken API,但无法对响应中的信息找到很好的解释。 实际上,对于给定的一对,我有以下信息: altname = alternate pair name acl
使用 kraken.js (express.js 框架)我正在构建一个本地化网站。标题中有 3 个更改语言的链接 FR | EN | DE 如果语言环境设置为 FR(根据 cookie),我希望 FR
如何在配置文件 ( config.js |development.js ) 中访问我的自定义配置? config.js |开发.js: { "database": { "use
简单查询后 k.query_public('Ticker', {'pair' : 'GNOETH'})['result']['GNOETH']['b'][0]) 如果我遇到超时或其他异常(如 504)
我正在尝试将一个工作示例从 C sharp 更改为 Java,但我正在努力并且不知道问题出在哪里。我联系了 Kraken,他们告诉我我的签名有误……回复是: {"error":["EAPI:Inval
我想尝试将 Kraken API 与 Java 结合使用。我知道如何获取公共(public)信息,但是如何通过输入参数获取私有(private)信息? 小例子: aclass = asset clas
我正在尝试找到一种方法来生成使用 jade 而不是 dust 模板的 Kraken.js 项目。根据their documentation您应该能够将模板引擎作为参数传递,所以 yo kraken -
我正在尝试使用 KrakenJS,尝试构建一个基本的 API 来理解事物。 我不确定的一件事是中间件,特别是 404/500 错误处理。 "fileNotFound": { "enable
我正在使用 git kraken 客户端 gui,我需要对存储库执行强制推送。如果有人能指导我在 git kraken 上执行强制推送的步骤,我将不胜感激。 最佳答案 正如@Viktor Seč 评论
所以我有一个从 develop 创建的名为 feature/123 的分支 我已经完成了一些工作,但与此同时进行了开发,现在我的分支落后了。我需要 rebase 但不确定如何在 git kraken
我希望能够制作一个像这样的常量 var BASE_URL = 'http://example.com'; 并使其可以在我的所有 kraken JS Controller 中访问。我应该在哪里定义这个?
我想准确反射(reflect) cryptowatch.de 上的 RSI 值(在我的例子中是 LTC-EUR),我使用了网站 stockcharts.com ,解释了如何计算 RSI,用 Javas
我有一个变量来保存我的 Sequelize 连接,如下所示: var sequelize = new Sequelize('database', 'username'); 对于 Kraken.js,如
我有一个关于 krakenjs 的问题,我是一个 node/express 新手。 krakenjs 设置为默认 csrf 保护(我知道如何禁用,但我不想),但我不知道如何处理 csrf 和避免 40
是否可以在 kraken.js 应用程序中针对 404 和 500 错误使用不同的模板?下面是如何启用中间件并告诉它使用什么模板。对于我的应用程序,我需要根据用户所在网站的哪个部分使用不同的模板。 "
我正在尝试托管在 heroku 上设置准系统 kraken-js 应用程序时出现的默认应用程序,但出现以下错误: $ heroku ps:scale web=1 Scaling web dynos..
我已按照 kraken.js 示例为我的网站获取 i18n。因此,现在,每种设置语言都会呈现 1 个模板文件。 例如:index.dust 可以用法语、英语和荷兰语呈现。我现在想要实现的是,如果用户转
我是一名优秀的程序员,十分优秀!