이번에는 Hashkey의 생성에 대해 다룬다.
Hashkey는 요청 전송시 body값의 암호화에 사용되는 값으로, 매매와 같은 중요한 정보를 송신할때 적용된다. 은행어플 로그인에 비교하자면, APP key와 Secret key는 공인인증서, Hashkey는 OTP정도 느낌인 것 같다. (**절차상 그렇다는 것이고 역할은 당연히 다르다.)
이전에 작성하던 코드에 이어서 작성해 보도록 하자. 추가로 import해야하는 모듈은 없다.
PATH = "uapi/hashkey"
URL = f"{self.URL_BASE}/{PATH}"
hashkey를 받아올 URL을 작성한다. PATH는 uapi/hashkey이며, URL_BASE는 이미 지난번에 __init__에 변수로 작성해 두었으므로, 그걸 활용하도록 하자.
(참고로 추후의 편의를 위해 활용할 기본 함수들은 class에 담을 예정이다. 함수를 따로 떼어 활용하고 싶은 분들은 class 선언을 지우고, 변수마다 있는 self.을 떼고 활용하시면 된다.)
headers = {
'content-Type': 'application/json',
'appKey': self.APP_KEY,
'appSecret': self.APP_SECRET,
}
이번에 필요한 headers (양식)은 다음과 같다. 여기서도 마찬가지로 'appkey'와 'appsecret'은 이전에 작성해 놓은 변수를 활용하도록하자.
res = requests.post(URL, headers= headers, data=json.dumps(data))
hashkey = res.json()["HASH"]
access token때와 마찬가지로 작성된 양식을 URL에 제출하고, 필요한 부분을 발췌하면 완료! 어라......?? 저기 저 data는 뭐지?
앞서 설명한대로 hashkey는 주요 거래시 증권사와 주고받는 중요 정보를 암호화하는 역할이다. 따라서, 해당 함수는 단독으로 사용하지 않고, 매매, 잔고확인 등의 함수에 포함되어 암호화안된 data를 암호화하는 역할을 한다.
def hashkey(self, data):
PATH = "uapi/hashkey"
URL = f"{self.URL_BASE}/{PATH}"
headers = {
'content-Type': 'application/json',
'appKey': self.APP_KEY,
'appSecret': self.APP_SECRET,
}
res = requests.post(URL, headers= headers, data=json.dumps(data))
hashkey = res.json()["HASH"]
return hashkey
다른 함수 내에서 data를 받을 수 있도록 입력에 data를 추가해주고, hashkey를 리턴하도록 함수화해주면 작성 완료.
지금까지 작성한 코드를 종합하면 아래와 같다.
import requests
import json
class ki():
def __init__(self):
self.APP_KEY = ""
self.APP_SECRET = ""
self.URL_BASE = "https://openapi.koreainvestment.com:9443"
self.headers = {"content-type": "application/json"}
self.body = {"grant_type": "client_credentials",
"appkey": self.APP_KEY,
"appsecret": self.APP_SECRET}
self.PATH = "oauth2/tokenP"
self.URL = f"{self.URL_BASE}/{self.PATH}"
self.res = requests.post(self.URL, headers=self.headers, data=json.dumps(self.body))
self.ACCESS_TOKEN = self.res.json()["access_token"]
def hashkey(self, data):
PATH = "uapi/hashkey"
URL = f"{self.URL_BASE}/{PATH}"
headers = {
'content-Type': 'application/json',
'appKey': self.APP_KEY,
'appSecret': self.APP_SECRET,
}
res = requests.post(URL, headers= headers, data=json.dumps(data))
hashkey = res.json()["HASH"]
return hashkey
참조한 사이트
한국투자증권 API 문서
파이썬을 이용한 미국주식 자동매매
파이썬으로 배우는 오픈API 트레이딩 초급 예제