Я пытаюсь отобразить различные данные из моей учетной записи BitStamp в электронной таблице Google.Для этого используется Google Apps Script (GAS), конечно же, с Javascript.
Я получаю сообщение об ошибке API0005, которое , как вы можете видеть на справочной странице BitStamp API ,расшифровывается как неверная подпись:
API0005 Неверная подпись Опубликованная подпись не соответствует нашей
Теперь я собираю информацию от несколькихисточники, особенно здесь, в стеке, но не могу понять, где проблема.
Есть кое-что, что я заметил, хотя я хотел бы выделить, так как я думаю, что проблема может быть связана с этим:
Для простоты построения я добавляю основные этапы процесса синтеза подписи в саму электронную таблицу, чтобы лучше понять ее разработку.
Youзаметит небольшие изменения в выводе nonce даже между строкой кода и следующей, каждый раз, когда функция вызывается или вызывается;и это меня не удивляет, потому что я предполагаю, что каждый раз, когда вызывается nonce
, проходит несколько миллисекунд, а вывод должен быть разным (в конце концов, он был специально разработан по этой причине, я думаю).
Но первое, о чем я беспокоюсь: нормально ли, что оно меняется даже при вызове преобразования toUpperCase()
?(И, между прочим, это, в любом случае, не должно быть причиной проблемы)
var nonce = new (function() {
this.generate = function() {
var now = Date.now();
this.counter = (now === this.last? this.counter + 1 : 0);
this.last = now;
// add padding to nonce
var padding =
this.counter < 10 ? '000' :
this.counter < 100 ? '00' :
this.counter < 1000 ? '0' : '';
return now+padding+this.counter;
};
})();
//funzione write
function write() {
var cred = {
id:'digit2118',
key:'2RhZfUKIYJbT8CBYk6T27uRSF8Gufre',
secret:'T8CBYk6T274yyR8Z2RhZfUxbRbmZZHJ'
};
//adding some cells output to monitor each step of the "conversion"
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var cell = sheet.getRange("B14");
cell.setValue(cred.id);
// .. and so on, see screen cap..
var message = nonce.generate() + cred.id + cred.key;
var res = Utilities.computeHmacSha256Signature(cred.secret, message).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
var signature = res.toUpperCase();
// qui mettiamo i dati per fare la comunicazione vera e propria
var data = {
key: cred.key,
signature: res,
nonce: nonce.generate()
};
var options = {
'method' : 'post',
//'contentType': 'application/json',
// Convert the JavaScript object to a JSON string.
//'payload' : JSON.stringify(data)
'muteHttpExceptions' : true,
'payload' : data
};
var risposta = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/balance/', options);
var risposta2 = JSON.parse(risposta.getContentText());
Logger.log(risposta2);
//Logger.log(risposta.getContentText());
return signature;
}//end of write();
Logger.log(write());
Так что в итоге я могу 'я не вижу, где, но это должно быть что-то, чего мне не хватает.
(ps: вот откуда я получил код Nonce: Genece Nonce ,)
РЕДАКТИРОВАТЬ: Вопрос решен .
Обновлен код с проблемой и решением ниже.
Благодаря @ Tanaike