Notice
Recent Posts
Recent Comments
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 취미
- 드라마
- mysql
- 보드게임점수
- 웹개발
- 존경하는위인
- 휴식
- 스컬킹
- 보드게임점수계산
- 옥길동파티룸
- 서울파티룸
- 스페이스우일
- 부천파티룸
- 77845
- 광명파티룸
- 부천공간대여
- 옥길파티룸
- 구로파티룸
- 스컬킹점수
- MBTI
- 그릭요거트
- 충동억제
- 스컬킹점수계산
- 개발자
- 가장존경하는인물
- 해외여행
- 코딩
- 일
- 착한코딩
- 파티룸
Archives
- Today
- Total
SIMPLE & UNIQUE
[gpt와 함께하는 업무 자동화] 2. GPT로 만드는 주식 자동화! 키움증권 API → 구글 시트 자동 저장 본문
1. kiwoomApi.py
import requests
import json
# ============================================================
# Kiwoom REST API 예제
# - 1) OAuth 토큰 발급 (/oauth2/token)
# - 2) 국내주식 순위정보 호출 (/api/dostk/rkinfo, api-id=ka10032)
# - 3) 응답 결과를 result.json으로 저장
#
# 주의:
# - APPKEY/SECRETKEY는 "비밀번호"급 민감정보입니다.
# - 유튜브/깃허브/블로그에 절대 그대로 올리지 마세요.
# - 실사용 시 .env 또는 OS 환경변수로 빼는 것을 강력 추천합니다.
# ============================================================
# ============================
# 1. Access Token 발급 함수
# ============================
def get_access_token(appkey, secretkey):
"""
키움 REST API의 접근 토큰(access token)을 발급받는 함수
요청:
POST https://api.kiwoom.com/oauth2/token
Content-Type: application/json;charset=UTF-8
Body:
grant_type: client_credentials
appkey: 발급받은 앱키
secretkey: 발급받은 시크릿키
응답(예시):
{
"token": "...",
"expires_in": ...
}
"""
# 운영 도메인: https://api.kiwoom.com (가이드 기준) :contentReference[oaicite:2]{index=2}
url = "https://api.kiwoom.com/oauth2/token"
# API 서버에 "우리는 JSON으로 보낼거야" 라고 알려주는 헤더
headers = {
"Content-Type": "application/json;charset=UTF-8"
}
# 토큰 발급은 client_credentials 방식으로 진행
body = {
"grant_type": "client_credentials",
"appkey": appkey,
"secretkey": secretkey
}
# 실제 HTTP 요청 전송
response = requests.post(url, headers=headers, json=body)
# 응답을 JSON으로 파싱
data = response.json()
print("=== [1] 토큰 발급 응답 ===")
print(json.dumps(data, indent=2, ensure_ascii=False))
# 토큰 발급 실패 케이스 방어
# (예: appkey/secretkey 틀림, 사용신청 안 됨, 권한 문제 등)
if "token" not in data:
raise Exception("토큰 발급 실패: token 필드 없음 (응답을 확인하세요)")
return data["token"]
# ============================
# 2. 거래대금 상위 요청 (ka10032)
# ============================
def get_trading_value_rank(token):
"""
거래대금 상위(ka10032) 요청 함수
요청:
POST https://api.kiwoom.com/api/dostk/rkinfo
Headers:
Content-Type: application/json;charset=UTF-8
Authorization: Bearer {token}
api-id: ka10032 (TR명은 헤더로 전달) :contentReference[oaicite:3]{index=3}
Body: (이 예제에서는 코스피 + 관리종목 포함 + ETF/ETN 포함)
"""
url = "https://api.kiwoom.com/api/dostk/rkinfo"
# ✅ Authorization 헤더에 Bearer 토큰을 넣어야 인증된 호출이 됩니다. :contentReference[oaicite:4]{index=4}
# ✅ api-id 헤더에 TR명을 넣는 구조입니다. (여기서는 ka10032) :contentReference[oaicite:5]{index=5}
headers = {
"Content-Type": "application/json;charset=UTF-8",
"Authorization": f"Bearer {token}",
"api-id": "ka10032"
}
# 이 body는 "어떤 범위를 조회할지" 조건을 넣는 곳입니다.
# - mrkt_tp: 시장구분 (예: 001=코스피 / 101=코스닥 등)
# - mang_stk_incls: 관리종목 포함 여부
# - stex_tp: 거래소구분(통합/KRX/NXT 등)
body = {
"mrkt_tp": "001", # 코스피
"mang_stk_incls": "1", # 관리종목 포함
"stex_tp": "3" # ETF/ETN 포함 전체 조회(통합 개념)
}
# 실제 HTTP 요청 전송
response = requests.post(url, headers=headers, json=body)
data = response.json()
print("\n=== [2] 거래대금 상위 조회 결과 ===")
print(json.dumps(data, indent=2, ensure_ascii=False))
return data
# ============================
# 실행 메인
# ============================
if __name__ == "__main__":
# 🔐 발급 받은 값 (실사용 시 .env로 빼는 걸 추천)
# ⚠️ 유튜브/깃허브에 그대로 올리면 즉시 키 탈취 위험 있습니다.
APPKEY = "StPb-8xxxxxxxxxxxxxxIBpuPQ"
SECRETKEY = "wzDBLxxxxxxxxxxxxxxxxxxxkmnH-0I"
# 1) 토큰 발급
token = get_access_token(APPKEY, SECRETKEY)
# 2) 거래대금 상위 요청
result = get_trading_value_rank(token)
# 3) Top100 콘솔 출력
# 응답 JSON 구조는 상황에 따라 달라질 수 있으니,
# 아래 키(trde_prica_upper)가 없으면 result 전체를 확인하세요.
if "trde_prica_upper" in result:
print("\n=== [3] TOP 100 종목 ===")
for item in result["trde_prica_upper"][:100]:
# now_rank: 현재순위
# stk_nm: 종목명
# trde_prica: 거래대금
print(f"{item['now_rank']}위 | {item['stk_nm']} | 거래대금: {item['trde_prica']}")
else:
print("trde_prica_upper 필드 없음. API 응답(result)을 확인하세요.")
# 4) 전체 result를 result.json으로 저장
with open("result.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print("\n=== [4] result.json 저장 완료 ===")
2. googleSheet.py
import json
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from datetime import datetime
import pytz
# ============================================================
# ✅ 이 스크립트는?
# - result.json 파일에서 데이터를 읽어와서
# - Google Sheet(스프레드시트)에 "기존 데이터는 유지한 채"
# - 실행할 때마다 맨 아래에 [생성 시각 + 헤더 + Top100 데이터]를 추가합니다.
# ============================================================
# ============================================================
# 0) result.json 파일 읽기
# ============================================================
# result.json 파일은 같은 폴더(디렉토리)에 있어야 합니다.
# encoding="utf-8"은 한글이 깨지지 않게 하기 위함입니다.
with open("result.json", "r", encoding="utf-8") as f:
result = json.load(f) # JSON 파일 내용을 파이썬 딕셔너리(dict)로 변환
# result.json 안에서 "trde_prica_upper"라는 키(key)의 값(리스트)을 가져옵니다.
# 만약 키가 없으면 빈 리스트([])를 사용합니다.
items = result.get("trde_prica_upper", [])
# 상위 100개만 사용하기 위해 슬라이싱합니다.
# items가 100개보다 적어도 에러 없이 있는 만큼만 가져옵니다.
top100 = items[:100]
# ============================================================
# 1) 구글 시트 인증 (Service Account 방식)
# ============================================================
# scope(권한 범위):
# - spreadsheets: 구글 스프레드시트 읽기/쓰기 권한
# - drive: 구글 드라이브 접근 권한 (시트 열기 등에 필요할 수 있음)
scope = [
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/drive"
]
# "service-account.json" 파일은
# Google Cloud에서 만든 Service Account 키 파일입니다.
# 이 파일이 현재 파이썬 스크립트와 같은 폴더에 있어야 합니다.
creds = ServiceAccountCredentials.from_json_keyfile_name(
"service-account.json",
scope
)
# creds(자격 증명)를 사용해 gspread 클라이언트를 생성합니다.
# 이 client가 실제로 구글 시트에 접근하는 "주체"가 됩니다.
client = gspread.authorize(creds)
# ============================================================
# 2) 시트 열기
# ============================================================
# SPREADSHEET_ID는 구글 시트 URL 중간에 들어 있는 긴 문자열입니다.
# 예) https://docs.google.com/spreadsheets/d/여기ID/edit#gid=0
SPREADSHEET_ID = "1bnBeSUxxxxxxxxxxxxxx3lErCn90"
# ID로 스프레드시트를 엽니다.
spreadsheet = client.open_by_key(SPREADSHEET_ID)
# spreadsheet.sheet1 은 "첫 번째 시트(탭)"를 의미합니다.
# (구글 시트 아래쪽에 Sheet1 / Sheet2 같은 탭이 있죠)
sheet = spreadsheet.sheet1
# ============================================================
# 3) 실행할 때마다 "데이터 생성 시각" 한 줄 추가
# ============================================================
# 한국 시간(KST)으로 현재 시간을 얻기 위해 pytz를 사용합니다.
kst = pytz.timezone("Asia/Seoul")
# 현재 시간을 "YYYY-MM-DD HH:MM:SS" 형태의 문자열로 변환합니다.
now_kst = datetime.now(kst).strftime("%Y-%m-%d %H:%M:%S")
# append_row는 "맨 아래에 1줄(행)을 추가"합니다.
# [ ... ] 형태로 넣는 이유는 "한 행에 들어갈 값들을 리스트로 전달"하기 위함입니다.
# 예: ["A", "B", "C"]를 넣으면 A열 B열 C열에 들어갑니다.
sheet.append_row(
[f"데이터 생성 시각: {now_kst}"],
value_input_option="USER_ENTERED"
)
# value_input_option="USER_ENTERED":
# - 사람이 직접 입력한 것처럼 처리합니다.
# - 숫자/수식이 들어가면 구글 시트가 자동 해석할 수 있습니다.
# ============================================================
# 4) 헤더(열 제목) 추가
# ============================================================
# 데이터 표의 첫 줄에 들어갈 "컬럼명(열 제목)" 입니다.
header = [
"순위", "종목코드", "종목명", "현재가", "전일대비",
"등락률(%)", "거래량", "거래대금(백만원)"
]
# 헤더도 맨 아래에 한 줄 추가합니다.
sheet.append_row(header, value_input_option="USER_ENTERED")
# ============================================================
# 5) Top100 데이터 만들기 (여러 행을 한 번에 추가하기)
# ============================================================
# append_rows는 여러 행을 한 번에 추가할 수 있습니다.
# 성능(속도) 측면에서 append_row를 100번 호출하는 것보다 유리합니다.
rows = []
# top100 리스트에는 item(dict)이 100개 들어있다고 가정합니다.
# 각 item에서 필요한 값을 뽑아서 한 행(row) 리스트를 만든 후 rows에 모읍니다.
for item in top100:
rows.append([
item.get("now_rank", ""), # 순위
item.get("stk_cd", ""), # 종목코드
item.get("stk_nm", ""), # 종목명
item.get("cur_prc", ""), # 현재가
item.get("pred_pre", ""), # 전일대비
item.get("flu_rt", ""), # 등락률(%)
item.get("now_trde_qty", ""), # 거래량
item.get("trde_prica", ""), # 거래대금(백만원)
])
# .get("키", "") 를 쓰는 이유:
# - 해당 키가 없어도 에러가 나지 않게 하기 위해서
# - 없으면 빈 문자열("")로 들어가게 합니다.
# rows는 예를 들어 아래처럼 됩니다:
# [
# [1, "005930", "삼성전자", 70000, 1000, 1.45, 123456, 98765],
# [2, "000660", "SK하이닉스", ...],
# ...
# ]
# 여러 행을 한 번에 맨 아래로 추가합니다.
sheet.append_rows(rows, value_input_option="USER_ENTERED")
# ============================================================
# 6) 완료 메시지 출력
# ============================================================
print("구글 시트 저장 완료! (기존 데이터 유지 + 마지막에 추가)")
3. kiwoomApi.py 프롬프트
키움 REST API 호출해서 데이터를 가져오려고해.
국내주식 > 순위정보 > 거래대금상위요청(ka10032) 데이터를 파이썬으로 가져와서
응답을 그대로 JSON 파일로 저장하는 자동화 로직을 만들고 싶어.
키움 REST API 사이트에서 로그인해서 APPKEY, SECRETKEY를 발급받은 다음,
OAuth 인증으로 접근 토큰(access token) 을 먼저 발급받고,
그 토큰을 이용해 ka10032 요청을 호출하는 흐름으로 진행하고 싶어.
코딩 초보자도 따라할 수 있도록 요청 URL, 필요한 헤더/바디 값이 어떤 의미인지 설명을 주석으로 달아주고,
실행하면 단계별로 “토큰 발급 성공/실패”, “ka10032 호출 성공/실패”가 콘솔에 보이게 해줘.
마지막에는 응답 전체를 result.json 같은 파일명으로 저장하고, 저장 완료 메시지도 출력해줘.
또한 내가 API를 처음 세팅하는 사람이라서, 키 발급부터 토큰 받는 과정,
그리고 ka10032 호출까지 전체 흐름을 짧게 정리한 설명도 같이 알려줘.
참고할 페이지는 https://openapi.kiwoom.com/guide/apiguide에서
접근토큰발급과 국내주식 > 순위정보 탭이야
4. googleSheet.py 프롬프트
파이썬으로 주식 데이터를 자동화하는 작업을 하고 있어.
이미 result.json 파일에 주식 거래대금(또는 거래량) 상위 100개 종목 데이터가 저장되어 있는데,
이 데이터를 사람이 직접 복사해서 붙여넣지 않고
구글 스프레드시트에 자동으로 기록하고 싶어.
파이썬에서 구글시트에 값을 쓰는 방법을 전혀 몰라서
어떤 구글 기능이나 설정이 필요한지도 모르는 상태야.
아래 요구사항을 충족하도록 처음부터 끝까지 알려줘.
result.json을 읽어서 상위 100개 종목을
순위 / 종목명 / 거래대금 형태로 정리한 뒤
구글 스프레드시트에 자동으로 작성하는 googleSheet.py 파이썬 코드를 만들어줘
필요한 구글 서비스(예: 어떤 API를 써야 하는지)와
왜 그게 필요한지도 간단히 설명해줘
그리고 코드만 주지 말고 아래 내용도 단계별로 정리해줘.
구글에서 어떤 사이트에 들어가서
어떤 설정을 해야 하는지
구글 스프레드시트에서는 어떤 설정을 해야
파이썬 코드가 시트에 값을 쓸 수 있는지
필요한 파이썬 라이브러리 설치 방법(pip)
나는 이 분야 초보자라서
**“왜 이 단계를 해야 하는지”**도 함께 이해할 수 있게 설명해줘'착한코딩 YouTube' 카테고리의 다른 글
| [gpt와 함께하는 업무 자동화] 1. GPT가 코드 짜고, Gemini가 요약한 주식 알림 자동화 시스템 (0) | 2025.12.14 |
|---|---|
| 홈택스 공제/비공제 자동 선택 스크립트 만들기 javascript 소스 (4) | 2025.07.16 |
| etc. 파이썬 자동화 로또 구매, 당첨 확인 [예제소스] (0) | 2024.09.10 |
| SQL 쿼리_6강 SQL 데이터 중복 처리 예제 소스(REPLACE, DUPLICATE, MERGE) (0) | 2024.07.22 |
| 스컬킹 점수판_착한코딩.xlsx (0) | 2024.01.31 |
Comments