업비트 API 자동거래 테스트1

nodejs / web

Posted by ETHAN KIM on March 10, 2022 · 14 mins read
Node.js

1. API 카테고리 체크 및 클래스파일 생성

제공되는 각 레퍼런스 API를 확인하여 웹 요청시 사용할 Class파일 생성.


./upbitClass.js

const request = require('request');
const {v4:uuidv4} = require("uuid");
const crypto = require('crypto');
const sign = require('jsonwebtoken').sign;
const queryEncode = require("querystring").encode;
const jwt = require("jsonwebtoken");
const fetch = require("node-fetch");
const decodeKey = require('./decodeKey');

class upbitClass {
    constructor(ac, se) {
        this.access_key = ac ? decodeKey(ac) : '';
        this.secret_key = se ? decodeKey(se) : '';
        this.server_url = 'https://api.upbit.com';
    }

    //ACCOUNT
    accounts() { 
        const payload = {
            access_key : this.access_key,
            nonce : uuidv4(),
        };
        const jwtToken = jwt.sign(payload, this.secret_key);
        const options= {
            method: "GET",
            url: `${this.server_url}/v1/accounts`,
            headers: {Authorization: `Bearer ${jwtToken}`},
        };
        return new Promise((resolve, reject) => {
            request(options, (error, response, body) => {
                if (error) reject(error);
                resolve(body);
            });            
        });
    }

    //MARKET CODE
    market_code() {
        const options = {method: 'GET', headers: {Accept: 'application/json'}};
        return fetch(`${this.server_url}/v1/market/all?isDetails=false`, options)
            .then(response => response.json());
    }

    //MARKET PRICE
    market_price() {
        const options = {method: 'GET', headers: {Accept: 'application/json'}};
        return fetch(`${this.server_url}/v1/orderbook?markets=KRW-BTC`, options);
    }

    //ORDERABLE
    orderable(obj) {
        const body = obj;
        const query = queryEncode(body);
        const hash = crypto.createHash('sha512');
        const queryHash = hash.update(query, 'utf-8').digest('hex');
        
        const payload = {
            access_key: this.access_key,
            nonce: uuidv4(),
            query_hash: queryHash,
            query_hash_alg: 'SHA512',
        };
        
        const token = sign(payload, this.secret_key);
        
        const options = {
            method: "GET",
            url: `${this.server_url}/v1/orders/chance?${query}`,
            headers: {Authorization: `Bearer ${token}`},
            json: body
        };

        return new Promise((resolve, reject) => {
            request(options, (error, response, body) => {
                if (error) reject(error);
                resolve(body);
            });            
        });       
    }

    //EACH ORDER
    each_order(od_id) {
        const body = {
            uuid: od_id
        };
        
        const query = queryEncode(body);
        
        const hash = crypto.createHash('sha512');
        const queryHash = hash.update(query, 'utf-8').digest('hex');
        
        const payload = {
            access_key: this.access_key,
            nonce: uuidv4(),
            query_hash: queryHash,
            query_hash_alg: 'SHA512',
        };
        
        const token = sign(payload, this.secret_key);
        
        const options = {
            method: "GET",
            url: `${this.server_url}/v1/order?` + query,
            headers: {Authorization: `Bearer ${token}`},
            json: body
        };
        
        return new Promise((resolve, reject) => {
            request(options, (error, response, body) => {
                if (error) reject(error);
                resolve(body);
            });            
        });       
    }

    //ORDER LIST
    order_list(od_arr, od_state = 'done') {
        const state = od_state;
        const uuids = od_arr;
        
        const non_array_body = {
            state: state,
        }
        const array_body = {
            uuids: uuids,
        }
        const body = {
            ...non_array_body,
            ...array_body
        }
        
        const uuid_query = uuids.map(uuid => `uuids[]=${uuid}`).join('&')
        const query = queryEncode(non_array_body) + '&' + uuid_query
        
        const hash = crypto.createHash('sha512')
        const queryHash = hash.update(query, 'utf-8').digest('hex')
        
        const payload = {
            access_key: access_key,
            nonce: uuidv4(),
            query_hash: queryHash,
            query_hash_alg: 'SHA512',
        }
        
        const token = sign(payload, secret_key)
        
        const options = {
            method: "GET",
            url: server_url + "/v1/orders?" + query,
            headers: {Authorization: `Bearer ${token}`},
            json: body
        }
        
        request(options, (error, response, body) => {
            if (error) throw new Error(error)
            console.log(body)
        })        
    }

    //ORDER EXECUTE
    order_execute(bd) {
        const body = bd;
        
        const query = queryEncode(body);
        
        const hash = crypto.createHash('sha512');
        const queryHash = hash.update(query, 'utf-8').digest('hex');
        
        const payload = {
            access_key: this.access_key,
            nonce: uuidv4(),
            query_hash: queryHash,
            query_hash_alg: 'SHA512',
        }
        
        const token = sign(payload, this.secret_key);
        
        const options = {
            method: "POST",
            url: `${this.server_url}/v1/orders`,
            headers: {Authorization: `Bearer ${token}`},
            json: body
        };
        
        return new Promise((resolve, reject) => {
            request(options, (error, response, body) => {
                if (error) reject(error);
                resolve(body);
            });            
        });       
    }

    //ORDER CANCEL
    order_cancel(od_no) {
        const body = {
            uuid: od_no
        };
        
        const query = queryEncode(body);
        
        const hash = crypto.createHash('sha512');
        const queryHash = hash.update(query, 'utf-8').digest('hex');
        
        const payload = {
            access_key: access_key,
            nonce: uuidv4(),
            query_hash: queryHash,
            query_hash_alg: 'SHA512',
        };
        
        const token = sign(payload, secret_key);
        
        const options = {
            method: "DELETE",
            url: `${this.server_url}/v1/order?${query}`,
            headers: {Authorization: `Bearer ${token}`},
            json: body
        };
        
        return new Promise((resolve, reject) => {
            request(options, (error, response, body) => {
                if (error) reject(error);
                resolve(body);
            });            
        });       
    }

    //PRICE_TICKER
    price_ticker(obj){
        const options = {method: 'GET', headers: {Accept: 'application/json'}};
        return fetch(`${this.server_url}/v1/ticker?markets=${obj.text}`, options)
          .then(response => response.json());        
    }

    //check candle
    min_check_candle(obj){
        const options = {method: 'GET', headers: {Accept: 'application/json'}};
        return fetch(`https://api.upbit.com/v1/candles/minutes/${obj.unit}?market=${obj.market}&count=${obj.count}`, options)
          .then(response => response.json());
    }

    day_check_candle(obj){
        const options = {method: 'GET', headers: {Accept: 'application/json'}};
        return fetch(`https://api.upbit.com/v1/candles/days?market=${obj.market}&count=${obj.count}`, options)
          .then(response => response.json());
    }    
}

module.exports = upbitClass;



2. API 테스트 (ndoe-fetch / request 패키지)

1) 주문가능 확인 API 체크



2) 일캔들 확인 API 체크