미니 프로젝트/N Split 시스템
API 테스트 프로그램
시샐
2025. 6. 3. 18:22
사용하는 서비스는 LS 증권의 Open API이다. API를 사용하기 위해서는 LS 증권의 계좌가 필요하다.
상세한 내용은 해당 홈페이지에서 확인할 수 있다. Open API 사용 신청을 하고 개인 고유 토큰(APP Key, Secret Key)를 먼저 발급 받아야 한다.
실제 이용은 다시 API를 이용해서 APP Key, Secret Key로 Access Token을 발급받은 이후, 그 토큰을 이용해서 서비스를 이용할 수 있다.
일단 API의 사용법에 익숙해지기 위해서 간단한 테스트 프로그램을 만들어 보기로 했다.
import requests
from pathlib import Path
# App Key, Secret
APP_KEY = "YOUR_APP_KEY"
APP_SECRET = "YOUR_APP_SECRET"
url = "https://openapi.ls-sec.co.kr:8080/oauth2/token"
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
data = {
"grant_type": "client_credentials",
"appkey": APP_KEY,
"appsecretkey": APP_SECRET,
"scope": "oob"
}
token_path = Path(__file__).resolve().parent.parent / "db" / "access_token.txt"
response = requests.post(url, headers=headers, data=data)
if response.status_code == 200:
result = response.json()
access_token = result.get("access_token")
if access_token:
with open(token_path, "w") as f:
f.write(access_token)
print("Access token 저장 완료.")
else:
print("access_token 필드가 응답에 없습니다.")
else:
print(f"요청 실패: {response.status_code}")
print(response.text)
access_token은 유효기간(익일 오전 7시)이 있으므로 따라서 매일 한 번 자동으로 갱신해서 저장할 필요가 있다.
일단 테스트 단계이므로 여기서 얻을 것을 복사해서 사용해야 할 것 같다.
이제 이 코드로 실행해서 정상 응답이 오면 access_token.txt에 저장된 값을 읽어서 가격 조회 테스트 코드에 넣으면 된다.
import requests
import json
import time
from datetime import datetime
# 사전 발급 받은 토큰
ACCESS_TOKEN = "_ACCESS_TOKEN"
# 종목코드 예: 삼성전자 005930
SHCODE = "005930"
BASE_URL = "https://openapi.ls-sec.co.kr:8080"
PATH = "stock/market-data"
URL = f"{BASE_URL}/{PATH}"
headers = {
"content-type": "application/json; charset=utf-8",
"authorization": f"Bearer {ACCESS_TOKEN}",
"tr_cd": "t1101", # 현재가 API
"tr_cont": "N",
"tr_cont_key": "",
}
body = {
"t1101InBlock": {
"shcode": SHCODE
}
}
def get_price():
response = requests.post(URL, headers=headers, data=json.dumps(body))
try:
data = response.json()
price = data["t1101OutBlock"]["price"]
name = data["t1101OutBlock"]["hname"]
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{now}] {name}({SHCODE}): {price}원")
except Exception as e:
print("조회 실패:", e)
if __name__ == "__main__":
while True:
get_price()
time.sleep(60) # 1분 대기
반응형