본문 바로가기
Node.js

[Node.js] 가상화폐 매매 API 만들기 - 1. 세팅하기

by yonikim 2021. 7. 26.
728x90

 

가상화폐 붐이 크게 일었다가 잠잠해진 지금...나의 마이너스 통장은 잠시 가슴 속에 묻어두고 업비트 API 를 이용하여 가상화폐 매매 프로그램을 만들어 보려고 한다. 

인터넷에 검색해보니 Python 으로 만든 샘플이 많던데, 나는 Node.js 를 사용하여 만들어볼 것이다. 

 

 


가상화폐 매매 API 만들기 - 1. 세팅하기


 

1. Open API Key 발급받기

업비트에 로그인한 후 [마이페이지] > [Open API 관리] 를 클릭하여 Key 를 발급받는다. access_key 와 secret_key 는 잘 메모해 놓자.

 

2. 프로젝트 생성

1) swagger 를 이용하여 프로젝트를 생성한다.

$ swagger project create cryptocurrency

 

2) .env 파일을 만들어서 발급받은 key 정보와 업비트 서버 API 주소를 기재한다. 

# .env
UPBIT_OPEN_API_ACCESS_KEY=${UPBIT_OPEN_API_ACCESS_KEY}
UPBIT_OPEN_API_SECRET_KEY=${UPBIT_OPEN_API_SECRET_KEY}
UPBIT_OPEN_API_SERVER_URL=https://api.upbit.com

 

3) .gitignore 파일을 만든다.

node_modules
logs

.env

 

 

3. 샘플 코드 작성하기

업비트 Open API 개발자 센터(https://docs.upbit.com/) 에 들어가면 코드 예시들이 잘 나와있다.

 

1) 전체 계좌 조회 코드 작성

▷ app.js

'use strict'
const SwaggerExpress = require('swagger-express-mw')
const SwaggerTools = require('swagger-tools')
const express = require('express')

const app = express()

const options = {
  controllers: './api/controllers'
}

var config = {
  appRoot: __dirname, // required config
}

SwaggerExpress.create(config, function (err, swaggerExpress) {
  if (err) {
    throw err
  }

  // install middleware
  swaggerExpress.register(app)

  let swaggerObjectLoaded = swaggerExpress.runner.swagger
  SwaggerTools.initializeMiddleware(swaggerObjectLoaded, function (middleware, err) {
    if (err) {
      logger.error(err)
      throw err
    }
    app.disable('etag')
    app.use(middleware.swaggerMetadata())
    app.use(middleware.swaggerValidator())
    app.use(middleware.swaggerRouter(options))

    app.use(middleware.swaggerUi())
    app.get('/', async (req, res) => {
      try {
        res.status(200).redirect('/docs/#/')
      } catch (e) {
        logger.error(e)
        res.status(500).send()
      }
    })

    app.use((req, res, next) => {
      console.error(`Error 404 on ${req.url}.`)
      res.status(404).send({ status: 404, error: 'Not found' })
    })
  })

  var port = process.env.PORT || 10010
  app.listen(port)
})
module.exports = app

 

▷ lib/config.js

require('dotenv').config()

config = { ...process.env }
module.exports = config

 

▷ api/swagger/swagger.yaml

swagger: "2.0"
info:
  version: "0.0.1"
  title: 가상화폐 매매 프로그램
# during dev, should point to your local machine
# host: localhost:10010
securityDefinitions:
  key:
    type: apiKey
    in: header
    name: API-KEY
# basePath prefixes all resource paths 
basePath: /
tags:
 - name: 업비트
# 
schemes:
  # tip: remove http to make production-grade
  - http
  - https
# format of bodies a client can send (Content-Type)
consumes:
  - application/json
# format of the responses to the client (Accepts)
produces:
  - application/json
paths:
  /upbit:
    x-swagger-router-controller: upbit
    get:
      tags:
       - 업비트
      description: 전체 계좌 조회
      operationId: getAccounts
      responses:
        "200":
          description: Success
          schema:
            # a pointer to a definition
            $ref: "#/definitions/UpbitResponse"
        default:
          description: Error
          schema:
            $ref: "#/definitions/ErrorResponse"
  /swagger:
    x-swagger-pipe: swagger_raw
    
# complex objects have schema definitions
definitions:
  UpbitResponse:
    properties:
      status:
        type: integer
      message:
        type: string
  HelloWorldResponse:
    required:
      - message
    properties:
      message:
        type: string
  ErrorResponse:
    required:
      - message
    properties:
      message:
        type: string

 

▷ api/controllers/upbit.js

const upbitService = require('../services/upbit')

module.exports.getAccounts = async (req, res) => {
  try {
    const result = upbitService.getAccounts()
    res.status(result.status || 200).json(result.data)
  } catch (err) {
    return res.status(err.status).json(err.message)
  }
}

 

▷ api/services/upbit.js

const request = require('request')
const axios = require('axios')
const { v4: uuidv4 } = require('uuid')
const { sign } = require('jsonwebtoken')

const config = require('../../lib/config')

module.exports.getAccounts = async (req, res) => {
  try {
    const access_key = config.UPBIT_OPEN_API_ACCESS_KEY
    const secret_key = config.UPBIT_OPEN_API_SECRET_KEY
    const server_url = config.UPBIT_OPEN_API_SERVER_URL

    const payload = {
      access_key: access_key,
      nonce: uuidv4(),
    }
    const token = sign(payload, secret_key)

    const options = {
      method: 'GET',
      url: server_url + '/v1/accounts',
      headers: { Authorization: `Bearer ${token}` },
    }
    const result = await axios(options)

    return {
      status: 200,
      data: result,
    }
  } catch (err) {
    return res.status(err.status).json(err.message)
  }
}

 

2) 실행

$ swagger project start

 

 


아래와 같은 에러가 날경우  "swagger-express-mw" 의 버전을 수정해 주면 된다.

Error: Cannot resolve the configured swagger-router handler: upbit_getAccounts

 

▷ package.json

{
  "name": "cryptocurrency",
  "version": "0.0.1",
  "private": true,
  "description": "가상화폐 매매 프로그램",
  "keywords": [],
  "author": "yonikim",
  "license": "",
  "main": "app.js",
  "dependencies": {
    ...
    "swagger-express-mw": "^0.7.0",
    ...
  },
  "devDependencies": {
  },
  "scripts": {
    "start": "node app.js",
    "test": "swagger project test"
  }
}
728x90