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
'Node.js' 카테고리의 다른 글
[Node.js] 특수문자 정규표현식 오류 (0) | 2021.10.22 |
---|---|
[ECMAScript] ES6 이후의 변경점 (0) | 2021.09.17 |
[Node.js] AWS SDK - S3 (0) | 2021.05.31 |
[Node.js] 원하는 길이만큼 유니크 아이디 만들기 (0) | 2021.05.27 |
[Node.js] AWS SDK - DynamoDB (0) | 2021.05.26 |