Binance cryptoexchange API "/account" 401 响应
Binance cryptoexchange API "/account" 401 response
我在使用 Google Sheet 中的脚本调用 Binance cryptoexchange API 时遇到问题。
我已经使用示例中的数据检查了我的签名处理
https://www.binance.com/restapipub.html#user-content-signed-endpoint-security
而且我有相同的签名。
我已经用另一个集线器 (coinigy.com) 检查了我的 API 密钥和机密,密钥工作正常。
但是我自己执行脚本还是报401错误...
Binance 支持没有回答。
有人可以帮忙吗?
function BinanceTest(key,secret) {
/*var randnumber=Math.random()*500;
Utilities.sleep(randnumber);*/
var baseURL = "https://api.binance.com";
var completeURL = baseURL + "/api/v3/account";
var timestamp=new Date().getTime();
var payload = "timestamp="+timestamp;
var signature = Utilities.computeHmacSha256Signature(payload, secret);
signature = signature.map(function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('');
completeURL=completeURL+"?"+payload+"&signature="+signature;
var params = {
'method': 'get',
'headers': {'X-MBX-APIKEY': key},
'contentType': 'application/x-www-form-urlencoded',
'muteHttpExceptions': true
};
var response = fetchJSON(completeURL,params);
var servertime=fetchJSON("https://api.binance.com/api/v1/time").serverTime;
return [servertime,timestamp,payload,signature,JSON.stringify(params),completeURL,response];
};
function fetchJSON (url) {
var randnumber=Math.random()*3000;
Utilities.sleep(randnumber);
try {
var json = UrlFetchApp.fetch(url,{muteHttpExceptions: true })
} catch (exception) {
Logger.log(url+": "+exception)
return 'exception'
}
if ('undefined' == typeof(json))
return 'Error retrieving JSON data'
if (json.getResponseCode() != 200)
return json.getResponseCode()
json = json.getContentText()
if (json.length<=0)
return 'JSON data was invalid'
try {
json = JSON.parse(json)
} catch (exception) {
Logger.log(url+" "+exception)
return "err2"
}
if ('undefined' == typeof(json) || json == null)
// return 'err'
return 'Quote data was malformed JSON data'
return json
}
我认为你的脚本几乎是正确的。但是错误的原因是fetchJSON()
。 fetchJSON()
仅收到 url
。但是 var response = fetchJSON(completeURL,params);
发送 completeURL
和 params
。这样,fetchJSON()
没有收到 params
并且发生了错误。那么这个修改怎么样呢?
发件人:
var response = fetchJSON(completeURL,params);
收件人:
var response = UrlFetchApp.fetch(completeURL, params);
注:
- 如果此修改无效,请从
params
中删除 'contentType': 'application/x-www-form-urlencoded',
,然后重试。
我无法确认这些修改是否有效。所以如果这不起作用,你能告诉我错误信息吗?我要修改。
编辑:
请尝试以下示例脚本,并告诉我响应。如果返回 "current account information" 的响应,则表示脚本有效。
- 将以下脚本复制并粘贴到您的脚本编辑器中。
- 请在示例脚本中输入您的密钥和密码。
- 在脚本编辑器上,运行 -> 运行 函数 -> 示例
- 脚本完成后,通过查看 -> 日志检索响应
样本:
function sample() {
var key = "### your key ###";
var secret = "### your secret ###";
var baseURL = "https://api.binance.com";
var completeURL = baseURL + "/api/v3/account";
var timestamp=new Date().getTime();
var payload = "timestamp="+timestamp;
var signature = Utilities.computeHmacSha256Signature(payload, secret);
signature = signature.map(function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('');
completeURL=completeURL+"?"+payload+"&signature="+signature;
var params = {
'method': 'get',
'headers': {'X-MBX-APIKEY': key},
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(completeURL, params);
Logger.log(response.getContentText())
}
我在使用 Google Sheet 中的脚本调用 Binance cryptoexchange API 时遇到问题。
我已经使用示例中的数据检查了我的签名处理 https://www.binance.com/restapipub.html#user-content-signed-endpoint-security 而且我有相同的签名。
我已经用另一个集线器 (coinigy.com) 检查了我的 API 密钥和机密,密钥工作正常。
但是我自己执行脚本还是报401错误...
Binance 支持没有回答。
有人可以帮忙吗?
function BinanceTest(key,secret) {
/*var randnumber=Math.random()*500;
Utilities.sleep(randnumber);*/
var baseURL = "https://api.binance.com";
var completeURL = baseURL + "/api/v3/account";
var timestamp=new Date().getTime();
var payload = "timestamp="+timestamp;
var signature = Utilities.computeHmacSha256Signature(payload, secret);
signature = signature.map(function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('');
completeURL=completeURL+"?"+payload+"&signature="+signature;
var params = {
'method': 'get',
'headers': {'X-MBX-APIKEY': key},
'contentType': 'application/x-www-form-urlencoded',
'muteHttpExceptions': true
};
var response = fetchJSON(completeURL,params);
var servertime=fetchJSON("https://api.binance.com/api/v1/time").serverTime;
return [servertime,timestamp,payload,signature,JSON.stringify(params),completeURL,response];
};
function fetchJSON (url) {
var randnumber=Math.random()*3000;
Utilities.sleep(randnumber);
try {
var json = UrlFetchApp.fetch(url,{muteHttpExceptions: true })
} catch (exception) {
Logger.log(url+": "+exception)
return 'exception'
}
if ('undefined' == typeof(json))
return 'Error retrieving JSON data'
if (json.getResponseCode() != 200)
return json.getResponseCode()
json = json.getContentText()
if (json.length<=0)
return 'JSON data was invalid'
try {
json = JSON.parse(json)
} catch (exception) {
Logger.log(url+" "+exception)
return "err2"
}
if ('undefined' == typeof(json) || json == null)
// return 'err'
return 'Quote data was malformed JSON data'
return json
}
我认为你的脚本几乎是正确的。但是错误的原因是fetchJSON()
。 fetchJSON()
仅收到 url
。但是 var response = fetchJSON(completeURL,params);
发送 completeURL
和 params
。这样,fetchJSON()
没有收到 params
并且发生了错误。那么这个修改怎么样呢?
发件人:
var response = fetchJSON(completeURL,params);
收件人:
var response = UrlFetchApp.fetch(completeURL, params);
注:
- 如果此修改无效,请从
params
中删除'contentType': 'application/x-www-form-urlencoded',
,然后重试。
我无法确认这些修改是否有效。所以如果这不起作用,你能告诉我错误信息吗?我要修改。
编辑:
请尝试以下示例脚本,并告诉我响应。如果返回 "current account information" 的响应,则表示脚本有效。
- 将以下脚本复制并粘贴到您的脚本编辑器中。
- 请在示例脚本中输入您的密钥和密码。
- 在脚本编辑器上,运行 -> 运行 函数 -> 示例
- 脚本完成后,通过查看 -> 日志检索响应
样本:
function sample() {
var key = "### your key ###";
var secret = "### your secret ###";
var baseURL = "https://api.binance.com";
var completeURL = baseURL + "/api/v3/account";
var timestamp=new Date().getTime();
var payload = "timestamp="+timestamp;
var signature = Utilities.computeHmacSha256Signature(payload, secret);
signature = signature.map(function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join('');
completeURL=completeURL+"?"+payload+"&signature="+signature;
var params = {
'method': 'get',
'headers': {'X-MBX-APIKEY': key},
'muteHttpExceptions': true
};
var response = UrlFetchApp.fetch(completeURL, params);
Logger.log(response.getContentText())
}