efriend
Version:
EFriend Node Library
390 lines (293 loc) • 12.6 kB
Markdown
# EFriend
EFriend는 증권 거래를 위한 Node.js 라이브러리 입니다.
지원하는 증권의 Open API는 다음과 같습니다.
- [한국투자증권의 KIS Developers API](https://apiportal.koreainvestment.com/apiservice/): 지원
- [이베스트투자증권 Open API](https://openapi.ebestsec.co.kr/apiservice): 미지원
## 주의
EFriend 라이브러리는 사용의 편의를 위해 Open Source로 제공되는 library 입니다. <span style="color: red;">라이브러리 사용에 따른 책임은 사용자에게 있습니다.</span>
EFriend 라이브러리에 반영된 API와 Code를 수집한 날자와 동작 여부를 확인한 날자는 [TESTED](./TESTED.md) 페이지에 명시되어 있습니다. 증권사에서 제공하는 라이브러리가 아니므로 최종 버전이 실시간으로 반영되지 않습니다.
<span style="color: red;">EFriend 라이브러리 사용으로 인한 이익과 책임은 사용자에게 있으므로, 사용전에 충분히 테스트와 검증을 하신 후에 사용하시기 바랍니다. 배포 후 3개월이상 지난 후에 사용할 것을 권장 합니다.</span>
만일 문제점 (오류, 버전 업그레이드 요청 등)이 발견되면, [Issue](https://github.com/pnuskgh/EFriendExpert/issues)에 신고해 주세요.
## 설치
```bash
npm install efriend --save
```
## 인증 정보
라이브러리를 사용하기 위해서는 인증 정보가 필요 합니다.
인증 정보는 범용적으로 사용하기 위해서 다음 정보를 추가로 관리 합니다.
- isActive: true인 경우에만 사용 가능한 인증 정보 입니다.
- isActual: 실전 투자용 인증 정보인 경우 true 입니다.
- isOrder: 주문 거래용으로 사용할 인증 정보인 경우 true 입니다.
- isQuery: 조회용으로 사용할 인증 정보인 경우 true 입니다.
- isPublic: 조회용으로 다른 사람이 사용하도록 허용된 인증 정보인 경우 true 입니다.
- 확장성을 위해 추가한 항목으로 개인이 사용하는 경우 false로 설정하면 됩니다.
```javascript
import { Secret, EFriend } from 'efriend';
const secret: Secret = {
isActive: true, //--- true. 인증정보를 사용
isActual: true, //--- true. 실전 투자, false. 모의 투자
isOrder: true, //--- true. 주문시 사용
isQuery: true, //--- true. 조회시 사용
isPublic: false, //--- true. 다른 사람이 사용하도록 허용
userid: '', //--- 한국투자증권 HTS ID
account: '', //--- 계좌번호 체계(8-2)의 앞 8자리
accountSub: '', //--- 계좌번호 체계(8-2)의 뒤 2자리
periodFrom: '', //--- appkey의 유효기간 (시작), YYYY-MM-DD
periodTo: '', //--- appkey의 유효기간 (종료), YYYY-MM-DD
appkey: '', //--- 한국투자증권에서 발급받은 appkey
appsecret: '', //--- 한국투자증권에서 발급받은 appsecret
custtype: 'P', //--- P. 개인, B. 법인
};
let secrets: Array<Secret> = [ secret ];
const efriend: EFriend = new EFriend({ });
//--- 인증 정보 등록과 갱신
//--- 실시간 (웹소켓) 접속키 발급
//--- 접근토큰 발급(P)
secrets = await efriend.setSecrets(secrets);
//--- 조회용 인증 정보 가져오기
const secretQuery: Secret = await efriend.getQuerySecret();
//--- 주문용 인증 정보 가져오기
const account: string = '68629034'; //--- 계좌번호 체계(8-2)의 앞 8자리
const secretOrder: Secret = await efriend.getOrderSecret(account);
```
## 라이브러리 사용
라이브러리는 기본적으로 tr_id (거래 ID)를 기준으로 사용 합니다.
- 인증 정보에 포함되어 있는 정보는 요청 header에서 생략 가능 합니다.
### REST API 호출
```typescript
import {
EFriendRest,
FHKST01010100_REQUEST_HEADER,
FHKST01010100_REQUEST_BODY } from 'efriend';
const efriendRest: EFriendRest = new EFriendRest({ });
//--- FHKST01010100 (주식현재가 시세)의 tr_id
// 요청 header
const requestHeader: FHKST01010100_REQUEST_HEADER = {
"content-type": 'application/json; charset=utf-8',
};
// 요청 body
const requestBody: FHKST01010100_REQUEST_BODY = {
FID_COND_MRKT_DIV_CODE: 'J',
FID_INPUT_ISCD: '015760'
};
// FHKST01010100 tr_id에 해당하는 요청 처리
const response = await efriendRest.FHKST01010100(
secretQuery,
requestHeader,
requestBody
);
// response
// code : 오류 코드. 0이면 정상 처리됨
// message: 오류 메시지. 정상 처리된 경우 'ok'
// header: 응답 header
// body: 응답 body
```
### Web Socke 호출
```typescript
import { EFriendWs, TR_TYPE } from 'efriend';
const efriendWs: EFriendWs = new EFriendWs({ secret: secretOrder });
await efriendWs.initialize();
//--- trid: Web Socket API의 trid (예: H0STCNT0 - 실시간 주식 체결가)
//--- header: Web Socket 내부적으로 사용하는 header
//--- body: trid에 해당하는 응답 body
const defaultHandler = (trid: string, header: any | null, body: any) => {
console.log('trid', trid);
console.log('header', header);
if (Array.isArray(body)) {
body.forEach((item) => {
console.log('body item', item);
});
} else {
console.log('body', body);
}
console.log('');
}
//--- Web Socket 데이터를 받아 처리할 handler 등록
efriendWs.addHandler(defaultHandler.bind(efriendWs));
//--- H0STCNT0 (국내주식 실시간체결가) 등록
await efriendWs.webSocket('H0STCNT0', TR_TYPE.registration, '015760');
//--- H0STCNT0 (국내주식 실시간체결가) 해제
await efriendWs.webSocket('H0STCNT0', TR_TYPE.registration, '015760');
```
### TypeScript 사용 예
```typescript
import { EFriend, EFriendRest, EFriendWs } from 'efriend';
import { Secret, TR_TYPE } from 'efriend';
import {
FHKST01010100_REQUEST_HEADER,
FHKST01010100_REQUEST_BODY,
FHKST01010100_RESPONSE } from 'efriend';
//--- Web Socket 요청 처리를 위한 sample handler
const onMessageDefault: Function =
(trid: string, header: any | null, body: any): void => {
console.log('trid', trid);
console.log('header', header);
if (Array.isArray(body)) {
body.forEach((item) => {
console.log('body item', item);
});
} else {
console.log('body', body);
}
console.log('');
}
(async () => {
try {
const efriend: EFriend = new EFriend({});
let secrets: Array<Secret> = [ secret ];
//--- 인증 정보 등록과 갱신
secrets = await efriend.setSecrets(secrets);
//--- 등록된 인증 정보 중 조회용 인증 정보 반환
const secretQuery: Secret | null =
await efriend.getQuerySecret();
if (secretQuery != null) {
const efriendRest: EFriendRest = new EFriendRest({});
const requestHeader: FHKST01010100_REQUEST_HEADER = {
"content-type": 'application/json; charset=utf-8',
};
const requestBody: FHKST01010100_REQUEST_BODY = {
FID_COND_MRKT_DIV_CODE: 'J',
FID_INPUT_ISCD: '015760'
};
const response: FHKST01010100_RESPONSE =
await efriendRest.FHKST01010100(
secretQuery, requestHeader, requestBody);
console.log(response);
}
//--- 한국투자증권 HTS ID
const account: string = '11111111';
//--- 등록된 인증 정보 중 주문용 인증정보 반환
const secretOrder: Secret | null
= await efriend.getOrderSecret(account);
if (secretOrder != null) {
const efriendWs: EFriendWs =
new EFriendWs({ secret: secretOrder });
await efriendWs.initialize();
efriendWs.addHandler(onMessageDefault.bind(efriendWs));
setTimeout(async function() {
await efriendWs.webSocket(
'H0STCNT0', TR_TYPE.registration, '015760');
}, 1000);
}
} catch(ex) {
console.error(ex);
}
})();
```
### ESM 모듈 사용 예
> ECMAScript Modules
```javascript
import { EFriendRest, TR_TYPE } from 'efriend';
import { EFriend, EFriendWs } from 'efriend';
//--- Web Socket 요청 처리를 위한 sample handler
const onMessageDefault = (trid, header, body) => {
console.log('trid', trid);
console.log('header', header);
if (Array.isArray(body)) {
body.forEach((item) => {
console.log('body item', item);
});
} else {
console.log('body', body);
}
console.log('');
}
(async () => {
try {
const efriend = new EFriend({});
let secrets = [ secret ];
//--- 인증 정보 등록과 갱신
secrets = await efriend.setSecrets(secrets);
//--- 등록된 인증 정보 중 조회용 인증 정보 반환
const secretQuery = await efriend.getQuerySecret();
if (secretQuery != null) {
const efriendRest = new EFriendRest({});
const requestHeader = {
"content-type": 'application/json; charset=utf-8',
};
const requestBody = {
FID_COND_MRKT_DIV_CODE: 'J',
FID_INPUT_ISCD: '015760'
};
const response = await efriendRest.FHKST01010100(
secretQuery, requestHeader, requestBody);
console.log(response);
}
//--- 한국투자증권 HTS ID
const account = '11111111';
//--- 등록된 인증 정보 중 주문용 인증정보 반환
const secretOrder = await efriend.getOrderSecret(account);
if (secretOrder != null) {
const efriendWs = new EFriendWs({ secret: secretOrder });
await efriendWs.initialize();
efriendWs.addHandler(onMessageDefault.bind(efriendWs));
setTimeout(async function() {
await efriendWs.webSocket(
'H0STCNT0', TR_TYPE.registration, '015760');
}, 1000);
}
} catch(ex) {
console.error(ex);
}
})();
```
### CommonJS 모듈 사용 예
```javascript
const efriend = require('efriend');
//--- Web Socket 요청 처리를 위한 sample handler
const onMessageDefault = (trid, header, body) => {
console.log('trid', trid);
console.log('header', header);
if (Array.isArray(body)) {
body.forEach((item) => {
console.log('body item', item);
});
} else {
console.log('body', body);
}
console.log('');
}
(async () => {
try {
const efriendMain = new efriend.EFriend({});
let secrets = [ secret ];
//--- 인증 정보 등록과 갱신
secrets = await efriendMain.setSecrets(secrets);
//--- 등록된 인증 정보 중 조회용 인증 정보 반환
const secretQuery = await efriendMain.getQuerySecret();
if (secretQuery != null) {
const efriendRest = new efriend.EFriendRest({});
const requestHeader = {
"content-type": 'application/json; charset=utf-8',
};
const requestBody = {
FID_COND_MRKT_DIV_CODE: 'J',
FID_INPUT_ISCD: '015760'
};
const response = await efriendRest.FHKST01010100(
secretQuery, requestHeader, requestBody);
console.log(response);
}
//--- 한국투자증권 HTS ID
const account = '68629034';
//--- 등록된 인증 정보 중 주문용 인증정보 반환
const secretOrder = await efriendMain.getOrderSecret(account);
if (secretOrder != null) {
const efriendWs = new efriend.EFriendWs(
{ secret: secretOrder }
);
await efriendWs.initialize();
efriendWs.addHandler(onMessageDefault.bind(efriendWs));
setTimeout(async function() {
await efriendWs.webSocket(
'H0STCNT0',
efriend.TR_TYPE.registration,
'015760'
);
}, 1000);
}
} catch(ex) {
console.error(ex);
}
})();
```