Google Script - REST API Private Endpoints

Τελευταία ενημέρωση: 1 Απριλίου 2025

Τα πιστοποιημένα τελικά σημεία του REST API μας είναι προσβάσιμα μέσω μιας απλής αίτησης HTTP (όπως ακριβώς ζητείται μια ιστοσελίδα μέσω ενός προγράμματος περιήγησης ιστού), οπότε ένας API client για την εισαγωγή δεδομένων αγοράς σε ένα Google Sheet μπορεί να υλοποιηθεί με λίγες μόνο γραμμές κώδικα Google Script.

Εγκατάσταση

  1. 1

    Δημιουργήστε ένα νέο Google Sheet ή ανοίξτε ένα υπάρχον φύλλο.

  2. 2

    Ανοίξτε το πρόγραμμα επεξεργασίας σεναρίων μέσω του μενού Extensions -> Apps Script.

  3. 3

    Διαγράψτε τον προεπιλεγμένο κώδικα που εμφανίζεται (π.χ. Επιλογή όλων και μετά Διαγραφή/Backspace).

  4. 4

    Αντιγράψτε/Επικολλήστε τον κώδικα Google Script API (που εμφανίζεται παρακάτω) στο πρόγραμμα επεξεργασίας σεναρίων.

  5. 5

    Ενημερώστε το παράδειγμα API key για να χρησιμοποιήσετε ένα API key από τον λογαριασμό σας στην Kraken.

  6. 6

    Προαιρετικό - Προσθέστε τυχόν πρόσθετες προσαρμοσμένες συναρτήσεις που χρειάζεστε (π.χ. για να καλέσετε διαφορετικά τελικά σημεία ή να επιστρέψετε διαφορετικά πεδία JSON).

  7. 7

    Αποθηκεύστε τον κώδικα Google Script μέσω του

    εικονιδίου (Αποθήκευση έργου).

    Save Icon

SaveImageIcon

Χρήση

Η συνάρτηση KAPI_Private() είναι υπεύθυνη για τη δημιουργία της κατάλληλης URL, τον υπολογισμό της υπογραφής ελέγχου ταυτότητας και την πραγματοποίηση της αίτησης HTTP στο API. Η συνάρτηση KAPI_Private() μπορεί να κληθεί απευθείας εισάγοντας τα ακόλουθα (ή παρόμοια ανάλογα με το αναγνωριστικό λογαριασμού, το τελικό σημείο και τις παραμέτρους) σε ένα κελί του Google Sheet:

bash

Bash

=KAPI_Private("TEST", "Balance", "")

=KAPI_Private("TEST", "TradeBalance", "asset=xdg")

=KAPI_Private("TEST", "OpenOrders", "userref=886794735")

Η συνάρτηση KAPI_Private() επιστρέφει την αρχική απόκριση JSON από το API, όπως την ακόλουθη για το παραπάνω παράδειγμα τελικού σημείου Balance:

bash

Bash

{"error":[],"result":{"ZUSD":"16.4272","ZEUR":"0.3880","ZJPY":"0.45","KFEE":"10368.39","XXBT":"0.0000000072","XXRP":"0.00000000","XLTC":"0.0000000100","XXDG":"13997.00000000","XXLM":"100.00000000"}}

Για να τοποθετήσετε τα μεμονωμένα πεδία/τιμές σε ξεχωριστά κελιά εντός του Google Sheet, μπορούν να κληθούν πρόσθετες προσαρμοσμένες συναρτήσεις για την ανάλυση της απόκρισης JSON, όπως οι συναρτήσεις παραδείγματος KAPI_Balance() και KAPI_OpenOrders():

  • =KAPI_Balance("TEST")

  • =KAPI_OpenOrders("TEST")

bash

Bash

=KAPI_Balance("TEST")

=KAPI_OpenOrders("TEST")

Αυτό θα εμφάνιζε αποτελέσματα παρόμοια με τα ακόλουθα, όπου τα δεδομένα θα ήταν προσβάσιμα σε οποιαδήποτε από τις τυπικές συναρτήσεις του Google Sheets (SUM, AVERAGE, COUNT, κ.λπ.):

API_GoogleSheetOutputEndpoints_10062020.png

Κώδικας Google Script για Private Endpoints:

Authentication Algorithm:

bash

Bash

API_Public_Key = { 
  'TEST': 'INSERT YOUR API PUBLIC KEY' 
}

API_Private_Key = { 
  'TEST': 'INSERT YOUR API PRIVATE KEY' 
}

function KAPI_Private(acc_id, endpoint, parameters) {
  Utilities.sleep(Math.random() * 100)

  api_key = API_Public_Key[acc_id]
  api_secret = Utilities.base64Decode(API_Private_Key[acc_id])
  api_path = Utilities.newBlob('/0/private/' + endpoint).getBytes()
  api_nonce = Date.now().toString()
  api_post = 'nonce=' + api_nonce + '&' + parameters

  api_sha256 = Utilities.computeDigest(
    Utilities.DigestAlgorithm.SHA_256, 
    api_nonce + api_post
  )
  api_hmac = Utilities.computeHmacSignature(
    Utilities.MacAlgorithm.HMAC_SHA_512, 
    api_path.concat(api_sha256), 
    api_secret
  )
  api_signature = Utilities.base64Encode(api_hmac)

  http_options = {
    'method': 'post', 
    'payload': api_post, 
    'headers': {
      'API-Key': api_key, 
      'API-Sign': api_signature
    }
  }
  http_response = UrlFetchApp.fetch(
    'https://api.kraken.com/0/private/' + endpoint, 
    http_options
  )
  api_data = http_response.getContentText()
  return api_data
}

Για να χρησιμοποιήσετε τα ακόλουθα σενάρια με τον παραπάνω Authentication Algorithm, απλώς προσθέστε τη συνάρτηση στο παραπάνω σενάριο.

*Παρακαλούμε σημειώστε ότι όλα τα Private Endpoints απαιτούν την υλοποίηση του Authentication Algorithm.*

Balance:

bash

Bash

// Formula to use in Excel cell: '=KAPI_Balance("TEST")
function KAPI_Balance(acc_id) {
  acc_balances_json = JSON.parse(
    KAPI_Private(acc_id, 'Balance', '')
  )
  acc_balances = new Array()
  for (name in acc_balances_json['result']) {
    acc_balances.push([
      name, 
      parseFloat(acc_balances_json['result'][name])
    ])
  }
  return acc_balances
}

Extended Balance:

bash

Bash

// Formula to use in Excel cell: '=KAPI_BalanceEx("TEST")

function KAPI_BalanceEx(acc_id) {
  acc_balances_json = JSON.parse(KAPI_Private(acc_id, 'BalanceEx', ''))
  acc_balances = new Array
  for (name in acc_balances_json['result']) {
    acc_balances.push([
      name,
      parseFloat(acc_balances_json['result'][name]['balance']),
      parseFloat(acc_balances_json['result'][name]['hold_trade']),
      parseFloat(acc_balances_json['result'][name]['credit'] ? acc_balances_json['result'][name]['credit'] : '') || 0,
      parseFloat(acc_balances_json['result'][name]['credit_used'] ? acc_balances_json['result'][name]['credit_used'] : '') || 0
    ]);
  }
  return acc_balances
}

Trade Balance:

bash

Bash

// Formula to use in Excel cell: '=KAPI_TradeBalance("TEST", "ASSET")'

function KAPI_TradeBalance(acc_id, currency) {
  acc_balances_json = JSON.parse(
    KAPI_Private(acc_id, 'TradeBalance', 'asset=' + currency)
  )
  acc_balances = new Array()
  for (name in acc_balances_json['result']) {
    acc_balances.push([
      name, 
      parseFloat(acc_balances_json['result'][name])
    ])
  }
  return acc_balances
}

Open Orders:

bash

Bash

// Formula to use in Excel cell: '=KAPI_Private("TEST","OpenOrders","")'

function KAPI_OpenOrders(acc_id) {
  acc_orders_json = JSON.parse(
    KAPI_Private(acc_id, 'OpenOrders', '')
  )
  acc_orders = new Array()
  for (name in acc_orders_json['result']['open']) {
    acc_orders.push([
      name, 
      acc_orders_json['result']['open'][name]['descr']['pair'], 
      acc_orders_json['result']['open'][name]['descr']['type'], 
      parseFloat(acc_orders_json['result']['open'][name]['descr']['price']), 
      parseFloat(acc_orders_json['result']['open'][name]['vol']), 
      parseFloat(acc_orders_json['result']['open'][name]['vol_exec']), 
      parseFloat(acc_orders_json['result']['open'][name]['opentm'])
    ])
  }
  return acc_orders
}

Closed Orders:

bash

Bash

// Formula to use in Excel cell: '=KAPI_ClosedOrders("TEST","0")'
// Or =KAPI_PRIVATE("TEST","ClosedOrders","0")

function KAPI_ClosedOrders(acc_id, offset) {
  acc_orders_json = JSON.parse(
    KAPI_Private(acc_id, 'ClosedOrders', 'ofs=' + offset)
  )
  acc_orders = new Array()
  for (name in acc_orders_json['result']['closed']) {
    acc_orders.push([
      name, 
      acc_orders_json['result']['closed'][name]['descr']['pair'], 
      acc_orders_json['result']['closed'][name]['descr']['type'], 
      acc_orders_json['result']['closed'][name]['descr']['ordertype'], 
      acc_orders_json['result']['closed'][name]['descr']['price'], 
      acc_orders_json['result']['closed'][name]['descr']['order'], 
      acc_orders_json['result']['closed'][name]['price'], 
      acc_orders_json['result']['closed'][name]['vol'], 
      acc_orders_json['result']['closed'][name]['vol_exec'], 
      acc_orders_json['result']['closed'][name]['cost'], 
      acc_orders_json['result']['closed'][name]['fee'], 
      acc_orders_json['result']['closed'][name]['status']
    ])
  }
  return acc_orders
}

TradesHistory:

bash

Bash

// Formula to be used in Excel cell '=KAPI_TradesHistory("TEST","0")'

function KAPI_TradesHistory(acc_id, offset) {
  acc_trades_json = JSON.parse(KAPI_Private(acc_id, 'TradesHistory', 'ofs=' + offset))
  acc_trades = new Array
for (name in acc_trades_json['result']['trades']) {
  acc_trades.push([
    name,
    acc_trades_json['result']['trades'][name]['ordertxid'],
    acc_trades_json['result']['trades'][name]['postxid'],
    acc_trades_json['result']['trades'][name]['pair'],
    acc_trades_json['result']['trades'][name]['time'],
    acc_trades_json['result']['trades'][name]['type'],
    acc_trades_json['result']['trades'][name]['ordertype'],
    acc_trades_json['result']['trades'][name]['price'],
    acc_trades_json['result']['trades'][name]['cost'],
    acc_trades_json['result']['trades'][name]['fee'],
    acc_trades_json['result']['trades'][name]['vol'],
    acc_trades_json['result']['trades'][name]['margin'],
    acc_trades_json['result']['trades'][name]['leverage'],
    acc_trades_json['result']['trades'][name]['misc'],
    acc_trades_json['result']['trades'][name]['trade_id'],
    acc_trades_json['result']['trades'][name]['maker']
    
  ])
}
return acc_trades
}

Open Positions:

bash

Bash

//Formula to use in Excel Cell '=KAPI_Private("TEST", "OpenPositions", "docalcs=true")'

function KAPI_OpenPositions(acc_id) {
  acc_positions_json = JSON.parse(
    KAPI_Private(acc_id, 'OpenPositions', 'docalcs=true')
  )
  acc_positions = new Array()
  for (name in acc_positions_json['result']) {
    acc_positions.push([
      name, 
      acc_positions_json['result'][name]['ordertxid'], 
      acc_positions_json['result'][name]['posstatus'], 
      acc_positions_json['result'][name]['pair'], 
      acc_positions_json['result'][name]['type'], 
      acc_positions_json['result'][name]['ordertype'], 
      acc_positions_json['result'][name]['cost'], 
      acc_positions_json['result'][name]['fee'], 
      acc_positions_json['result'][name]['vol'], 
      acc_positions_json['result'][name]['vol_closed'], 
      acc_positions_json['result'][name]['margin'], 
      acc_positions_json['result'][name]['value'], 
      acc_positions_json['result'][name]['net'], 
      acc_positions_json['result'][name]['time']
    ])
  }
  return acc_positions
}


Ledgers:

bash

Bash

//Formula to use in Excel Cell '=KAPI_Ledgers("TEST", "0")'


function KAPI_Ledgers(acc_id, offset) {
  acc_ledgers_json = JSON.parse(KAPI_Private(acc_id, 'Ledgers', 'ofs=' + offset))
  acc_ledgers = new Array
  for ( name in acc_ledgers_json['result']['ledger'] ) {
     acc_ledgers.push([name, acc_ledgers_json['result']['ledger'][name]['refid'], acc_ledgers_json['result']['ledger'][name]['time'], acc_ledgers_json['result']['ledger'][name]['type'], acc_ledgers_json['result']['ledger'][name]['subtype'], acc_ledgers_json['result']['ledger'][name]['asset'], acc_ledgers_json['result']['ledger'][name]['amount'], acc_ledgers_json['result']['ledger'][name]['fee'], acc_ledgers_json['result']['ledger'][name]['balance']])
  }
  return acc_ledgers
}

Query Order Info:

bash

Bash

// Formula to use in Excel cell '=KAPI_QueryOrders("TEST","Order ID")'

function KAPI_QueryOrders(acc_id, order_id) {
  acc_orders_json = JSON.parse(
    KAPI_Private(acc_id, 'QueryOrders', 'txid=' + order_id)
  )
  acc_orders = new Array()
  for (name in acc_orders_json['result']) {
    acc_orders.push([
      name, 
      acc_orders_json['result'][name]['descr']['pair'], 
      acc_orders_json['result'][name]['descr']['type'], 
      acc_orders_json['result'][name]['descr']['ordertype'], 
      acc_orders_json['result'][name]['descr']['price'], 
      acc_orders_json['result'][name]['descr']['order'], 
      acc_orders_json['result'][name]['price'], 
      acc_orders_json['result'][name]['vol'], 
      acc_orders_json['result'][name]['vol_exec'], 
      acc_orders_json['result'][name]['cost'], 
      acc_orders_json['result'][name]['fee'], 
      acc_orders_json['result'][name]['status']
    ])
  }
  return acc_orders
}

Παράδειγμα πλήρους συνάρτησης Google Script που καλεί το τελικό σημείο TradesHistory:

bash

Bash

const API_Public_Key = { 'TEST':'API PUBLIC KEY'}
const API_Private_Key = { 'TEST':'API PRIVATe KEY' }


function KAPI_Private(acc_id, endpoint, parameters) {
  Utilities.sleep(Math.random() * 100)
  
  api_key = API_Public_Key[acc_id]
  api_secret = Utilities.base64Decode(API_Private_Key[acc_id])
  api_path = Utilities.newBlob('/0/private/' + endpoint).getBytes()
  api_nonce = Date.now().toString()
  api_post = 'nonce=' + api_nonce + '&' + parameters
  
  api_sha256 = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, api_nonce + api_post)
  api_hmac = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, api_path.concat(api_sha256), api_secret)
  api_signature = Utilities.base64Encode(api_hmac)
  
  http_options = {'method':'post', 'payload':api_post, 'headers':{'API-Key':api_key, 'API-Sign':api_signature}}
  http_response = UrlFetchApp.fetch('https://api.kraken.com/0/private/' + endpoint, http_options)
  api_data = http_response.getContentText()
  return api_data
}



function KAPI_TradesHistory(acc_id, offset) {
  acc_trades_json = JSON.parse(KAPI_Private(acc_id, 'TradesHistory', 'ofs=' + offset))
  acc_trades = new Array
for (name in acc_trades_json['result']['trades']) {
  acc_trades.push([
    name,
    acc_trades_json['result']['trades'][name]['ordertxid'],
    acc_trades_json['result']['trades'][name]['postxid'],
    acc_trades_json['result']['trades'][name]['pair'],
    acc_trades_json['result']['trades'][name]['time'],
    acc_trades_json['result']['trades'][name]['type'],
    acc_trades_json['result']['trades'][name]['ordertype'],
    acc_trades_json['result']['trades'][name]['price'],
    acc_trades_json['result']['trades'][name]['cost'],
    acc_trades_json['result']['trades'][name]['fee'],
    acc_trades_json['result']['trades'][name]['vol'],
    acc_trades_json['result']['trades'][name]['margin'],
    acc_trades_json['result']['trades'][name]['leverage'],
    acc_trades_json['result']['trades'][name]['misc'],
    acc_trades_json['result']['trades'][name]['trade_id'],
    acc_trades_json['result']['trades'][name]['maker']
    
  ])
}
return acc_trades
}

Οι διαχωριστές δεκαδικών και χιλιάδων που εμφανίζονται σε αυτό το άρθρο ενδέχεται να διαφέρουν από τις μορφές που εμφανίζονται στις πλατφόρμες συναλλαγών μας. Ανατρέξτε στο άρθρο μας σχετικά με τον τρόπο χρήσης τελειών και κομμάτων για περισσότερες πληροφορίες.

test

Χρειάζεστε περισσότερη βοήθεια;