Образец аутентификации Kraken API, преобразованный из python в скрипт Google apps, не возвращает тот же вывод

#authentication #google-apps-script #kraken.com

Вопрос:

Я пытаюсь преобразовать аутентификацию API python kraken в скрипт Google, чтобы использовать его в электронной таблице Google, но безрезультатно.

 # python sample    
def get_kraken_signature(urlpath, data, secret):

    postdata = urllib.parse.urlencode(data)
    encoded = (str(data['nonce'])   postdata).encode()
    message = urlpath.encode()   hashlib.sha256(encoded).digest()

    mac = hmac.new(base64.b64decode(secret), message, hashlib.sha512)
    sigdigest = base64.b64encode(mac.digest())
    return sigdigest.decode()

api_sec = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg=="

data = {
    "nonce": "1616492376594", 
    "ordertype": "limit", 
    "pair": "XBTUSD",
    "price": 37500, 
    "type": "buy",
    "volume": 1.25
}

signature = get_kraken_signature("/0/private/AddOrder", data, api_sec)
print("API-Sign: {}".format(signature))
# prints API-Sign: 4/dpxb3iT4tp/ZCVEwSnEsLxx0bqyhLpdfOpc6fn7OR8 UClSV5n9E6aSS8MPtnRfp32bAb0nmbRn6H8ndwLUQ==
 

Я закончил с этим, но это не возвращает тот же результат.

 # google script sample from my sheet
function get_kraken_sinature(url, data, nonce, secret) {
  var message = url   Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, Utilities.base64Encode(nonce   data));
  var base64Secret = Utilities.base64Decode(secret);
  var mac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secret);
  return Utilities.base64Encode(mac);
}

signature = get_kraken_signature("/0/private/AddOrder", data, api_sec)
print("API-Sign: {}".format(signature))
# prints API-Sign: Jn6Zk8v41uvMWOY/RTBTrb7zhGxyAOTclFFe7lySodBnEnXErfJgIcQb90opFwccuKDd0Nt1l71HT3V9 P8pUQ==
 

Оба примера кода должны делать одно и то же и должны выводить идентичный ключ API-подписи. Они не находятся на этой стадии, и мне интересно, почему это так.

Комментарии:

1. Когда ваш скрипт python работает и вы хотите преобразовать свой скрипт python в скрипт Google Apps, можете ли вы предоставить примеры входных и выходных значений для вашего скрипта python? И, похоже, в вашем скрипте Google Apps запрос не виден. В этом случае ваш скрипт для запроса к API работает нормально, когда функция get_kraken_sinature может возвращать правильное значение. Правильно ли я понимаю?

2. Спасибо за ответ, я добавил значения параметров и выходные данные. И да, вы правы !

3. Спасибо, что ответили. Судя по вашему ответу, я хотел бы ответить на него. Но на данном этапе, к сожалению, я не могу ответить на ваш вопрос, потому что ваш вопрос закрыт. Теперь я проголосовал за повторное рассмотрение вашего вопроса. Но для этого необходимо также проголосовать от других пользователей. Так что не могли бы вы подождать с повторным ответом на свой вопрос? Когда ваш вопрос будет вновь открыт, я хотел бы ответить на него.

4. Пожалуйста, избегайте неспецифических терминов, таких как «не работает». Всегда будьте конкретны в том, что не работает. Я отредактировал этот термин.

5. @Tanaike Не стесняйтесь делать запрос на повторное открытие в чате или socvr, если он не открыт.

Ответ №1:

Я считаю, что ваша цель заключается в следующем.

  • Вы хотите преобразовать свой скрипт на python в скрипт Google приложений.
  • В своем скрипте Google Apps вы уже подтвердили, что скрипт для запроса работает нормально. Вы хотите преобразовать get_kraken_signature свой скрипт python в скрипт Google Apps.

В этом случае, как насчет следующего измененного сценария?

Измененный сценарий:

 function get_kraken_sinature(url, data, nonce, secret) {
  var str = Object.entries(data).map(([k, v]) => `${k}=${v}`).join("amp;");
  var message = Utilities.newBlob(url).getBytes().concat(Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, nonce   str));
  var mac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, Utilities.base64Decode(secret));
  return Utilities.base64Encode(mac);
}

// Please run this function.
function main() {
  const data = {
    "nonce": "1616492376594",
    "ordertype": "limit",
    "pair": "XBTUSD",
    "price": 37500,
    "type": "buy",
    "volume": 1.25
  };
  var url = "/0/private/AddOrder";
  var nonce = "1616492376594";
  var secret = "kQH5HW/8p1uGOVjbgWA7FunAmGO8lsSUXNsu3eow76sz84Q18fWxnyRzBHCd3pd5nE9qa99HAZtuZuj6F1huXg==";
  var res = get_kraken_sinature(url, data, nonce, secret);
  console.log(res)
}
 

Рекомендации:

Комментарии:

1. Чувак, ты мой спаситель. Я знал, что неправильно использую методы. Эти махинации с кодированием не укладываются у меня в голове, поэтому я очень ценю ваш ответ. Я собираюсь взглянуть на ваше решение, чтобы оно пришло мне в голову. Еще раз спасибо 🙂