Приклад коду для NodeJs REST та WebSocket API

Останнє оновлення: 2 квіт. 2025 р.

Вступ

Нижче наведено приклад сценарію NodeJs, який можна використовувати як для REST, так і для WebSocket реалізації Kraken API.

Він демонструє наступні функціональні можливості:

  • Публічні кінцеві точки REST API

  • Приватні кінцеві точки REST API

  • Публічні підписки WebSocket API

  • Приватні підписки WebSocket API

Встановлення

Щоб запустити локально, ви можете скопіювати/вставити код нижче.

Зверніть увагу, що зміна оператора if з 1 == 0 на 1 == 1 призведе до виконання конкретного блоку коду.

Перед запуском сценарію вам потрібно оновити сценарій, додавши ваші публічний та приватний ключі API.

Ви можете завантажити цей файл тут.

Код NodeJs

bash

Bash

const axios = require("axios");
const crypto = require('crypto');
const WebSocket = require('ws');


const Main = async () => {

    //TODO: UPDATE WITH YOUR KEYS :)
    let apiPublicKey = "YOUR_PUBLIC_KEY"
    let apiPrivateKey = "YOUR_PRIVATE_KEY"
    
    try {

        console.log("|=========================================|");
        console.log("|      KRAKEN.COM NODEJS TEST APP         |");
        console.log("|=========================================|");
        console.log();


        /*
        * PUBLIC REST API Examples
        */

        if (1 == 0) {
            let publicResponse = "";

            let publicEndpoint = "SystemStatus";
            let publicInputParameters = "";

            /*
            *MORE PUBLIC REST EXAMPLES
 
            let publicEndpoint = "AssetPairs";
            let publicInputParameters = "pair=ethusd,xbtusd";
 
            let publicEndpoint = "Ticker";
            let publicInputParameters = "pair=ethusd";
 
            let publicEndpoint = "Trades";
            let publicInputParameters = "pair=ethusd&since=0";
            */

            publicResponse = await QueryPublicEndpoint(publicEndpoint, publicInputParameters);
            console.log(publicResponse);

        }

        /*
        * PRIVATE REST API Examples
        */

        if (1 == 0) {
            let privateResponse = "";

            let privateEndpoint = "Balance";
            let privateInputParameters = "";

            /*
            *MORE PRIVATE REST EXAMPLES
    
            let privateEndpoint = "AddOrder";
            let privateInputParameters = "pair=xbteur&type=buy&ordertype=limit&price=1.00&volume=1";
    
            let privateEndpoint = "AddOrder"
            let privateInputParameters = "pair=xdgeur&type=sell&ordertype=limit&volume=3000&price=%2b10.0%" //Positive Percentage Example (%2 represtes +, which is a reseved character in HTTP)
    
            let privateEndpoint = "AddOrder"
            let privateInputParameters = "pair=xdgeur&type=sell&ordertype=limit&volume=3000&price=-10.0%" //Negative Percentage Example
    
            let privateEndpoint = "AddOrder"
            let privateInputParameters = "pair=xdgeur&type=buy&ordertype=market&volume=3000&userref=789" //Userref Example
    
            let privateEndpoint = "Balance" //{"error":[]} IS SUCCESS, Means EMPTY BALANCE
            let privateInputParameters = "" 
    
            let privateEndpoint = "QueryOrders" 
            let privateInputParameters = "txid=OFUSL6-GXIIT-KZ2JDJ" 
    
            let privateEndpoint = "AddOrder"
            let privateInputParameters = "pair=xdgusd&type=buy&ordertype=market&volume=5000"
    
            let privateEndpoint = "DepositAddresses"
            let privateInputParameters = "asset=xbt&method=Bitcoin" 
    
            let privateEndpoint = "DepositMethods"
            let privateInputParameters = "asset=eth" 
    
            let privateEndpoint = "WalletTransfer" 
            let privateInputParameters = "asset=xbt&to=Futures Wallet&from=Spot Wallet&amount=0.0045" 
    
            let privateEndpoint = "TradesHistory"
            let privateInputParameters = "start=1577836800&end=1609459200" 
    
            let privateEndpoint = "GetWebSocketsToken" 
            let privateInputParameters = ""
            */

            privateResponse = await QueryPrivateEndpoint(privateEndpoint, 
                                                        privateInputParameters,
                                                        apiPublicKey,
                                                        apiPrivateKey);
            console.log(privateResponse);
        }

        /*
        * PUBLIC WEBSOCKET Examples
        */

        if (1 == 0) {

            let publicWebSocketURL = "wss://ws.kraken.com/";
            let publicWebSocketSubscriptionMsg = '{ "event":"subscribe", "subscription":{"name":"trade"},"pair":["XBT/USD"] }';

            /*
            *MORE PUBLIC WEBSOCKET EXAMPLES
            
            let publicWebSocketSubscriptionMsg = "{ "event": "subscribe", "subscription": { "interval": 1440, "name": "ohlc"}, "pair": [ "XBT/EUR"]}";
            let publicWebSocketSubscriptionMsg = "{ "event": "subscribe", "subscription": { "name": "spread"}, "pair": [ "XBT/EUR","ETH/USD" ]}";
            */

            await OpenAndStreamWebSocketSubscription(publicWebSocketURL, publicWebSocketSubscriptionMsg);
        }

        /*
        * PRIVATE WEBSOCKET Examples
        */

        if (1 == 0) {

            let privateWebSocketURL = "wss://ws-auth.kraken.com/";

            //GET THE WEBSOCKET TOKEN FORM THE JSON RESPONSE 
            let webSocketToken = await QueryPrivateEndpoint("GetWebSocketsToken", "", apiPublicKey, apiPrivateKey);
            webSocketToken = webSocketToken['token'];

            /*
            *MORE PRIVATE WEBSOCKET EXAMPLES

            let privateWebSocketSubscriptionMsg = `{ "event": "subscribe", "subscription": { "name": "openOrders", "token": "${webSocketToken}"}}`;
            let privateWebSocketSubscriptionMsg = `{ "event": "subscribe", "subscription": { "name": "balances", "token": "${webSocketToken}"}}`;
            let privateWebSocketSubscriptionMsg = `{"event":"addOrder","reqid":1234,"ordertype":"limit","pair":"XBT/EUR","token":"${webSocketToken}","type":"buy","volume":"1", "price":"1.00"}`;
            */

            //REPLACE PLACEHOLDER WITH TOKEN
            privateWebSocketSubscriptionMsg = `{ "event": "subscribe", "subscription": { "name": "ownTrades", "token": "${webSocketToken}"}}`;

            await OpenAndStreamWebSocketSubscription(privateWebSocketURL, privateWebSocketSubscriptionMsg);
        }


        console.log("|=======================================|");
        console.log("| END OF PROGRAM - HAVE A GOOD DAY :)   |");
        console.log("|=======================================|");
        console.log("\n");

    }
    catch (e) {
        console.log();
        console.log("AN EXCEPTION OCCURED :(");
        console.log(e);
    }


    /*
    * Public REST API Endpoints
    */

    async function QueryPublicEndpoint(endPointName, inputParameters) {
        let jsonData;
        const baseDomain = "https://api.kraken.com";
        const publicPath = "/0/public/";
        const apiEndpointFullURL = baseDomain + publicPath + endPointName + "?" + inputParameters;
        
        jsonData = await axios.get(apiEndpointFullURL);
        return jsonData.data.result;
    }


    /*
    * Private REST API Endpoints
    */

    async function QueryPrivateEndpoint(endPointName, 
                                        inputParameters, 
                                        apiPublicKey, 
                                        apiPrivateKey) {
        const baseDomain = "https://api.kraken.com";
        const privatePath = "/0/private/";
        
        const apiEndpointFullURL = baseDomain + privatePath + endPointName;
        const nonce = Date.now().toString();
        const apiPostBodyData = "nonce=" + nonce + "&" + inputParameters;
       
        const signature = CreateAuthenticationSignature(apiPrivateKey,
                                                        privatePath,
                                                        endPointName,
                                                        nonce,
                                                        apiPostBodyData);
        
        const httpOptions =
        {
            headers: { 'API-Key': apiPublicKey, 'API-Sign': signature }
        };

        let jsonData = await axios.post(apiEndpointFullURL, apiPostBodyData, httpOptions);

        return jsonData.data.result;
    }


    /*
    * Authentication Algorithm
    */

    function CreateAuthenticationSignature(apiPrivateKey, 
                                            apiPath, 
                                            endPointName, 
                                            nonce,
                                            apiPostBodyData){

        const apiPost = nonce + apiPostBodyData;
        const secret = Buffer.from(apiPrivateKey, 'base64');
        const sha256 = crypto.createHash('sha256');
        const hash256 = sha256.update(apiPost).digest('binary');
        const hmac512 = crypto.createHmac('sha512', secret);
        const signatureString = hmac512.update(apiPath + endPointName + hash256, 'binary').digest('base64');
        return signatureString;
    }


    /*
    * WebSocket API
    */

    async function OpenAndStreamWebSocketSubscription(connectionURL, webSocketSubscription) {
        try {
            const webSocketClient = new WebSocket(connectionURL);

            webSocketClient.on('open', function open() {
                webSocketClient.send(webSocketSubscription);
            });

            webSocketClient.on('message', function incoming(wsMsg) {
                var d = new Date();
                var msgTime = d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
                console.log(msgTime + ": " + wsMsg);
            });

            webSocketClient.on('close', function close() {
                console.log("|==============================================|");
                console.log("|     END OF PROGRAM - HAVE A GOOD DAY :)      |");
                console.log("|==============================================|");
                console.log("\n");
            });

        }
        catch (e) {
            console.log();
            console.log("AN EXCEPTION OCCURED :(");
            console.log(e);
        }
    }
};


Main();

Потрібна додаткова допомога?