상세 컨텐츠

본문 제목

파이썬 디스코드 주식 가격 조회하기 # 1

Economic discord bot 만들기

by grizzly 2025. 1. 28. 16:09

본문

 

Discord를 이용해서 주식의 코드를 입력한 경우 주식의 정보를 전달해주는 간단한 기능을 만들어보자.

 

몇가지 단계가 필요하다.

 

1. KIS develop 가입 및 계좌 연동 TOKEN을 받아야 한다.

2. Discord 봇에 해당하는 TOKEN을 받아야 한다.

3. 이것을 파이썬을 통해 연결하여야 한다.

 

TOKEN은 일종의 로그인을 해주는 무언가라고 생각하면 될 것 같다.

 

1번의 경우는 이미 진행되었다고 가정하고 진행하겠다.

 

일단 시작은 디스코드 개발자 포털에 들어간다.

https://discord.com/developers/applications

 

Discord Developer Portal — API Docs for Bots and Developers

Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.

discord.com

이런 화면이 뜰 것임.

여기서 New Application을 누른다.

이런 창이 뜰 것이고, 여기서 원하는 봇의 이름을 정하고 Create 하면 된다.

 

나는 경제 관련한 기능을 계속하여 개발하고 싶기 때문에 Economic.Bot으로 이름을 지었다.

여기서 Token을 얻어야 하기 때문에, 일단 만든 봇을 클릭한 후 좌측 위를 클릭한다.

그렇게 하면,

이런 창이 파트가 보이게 된다. 여기서 Reset Token을 누른 후, 다음 창에서 Yes, do it! 을 누르게 되면 token을 얻을 수 있게 된다.

 

이후는 단순하게 생각하면 된다. 내가 생성한 봇도 결국은 하나의 기계 참여자가 되는 형식이다. 따라서 OAuth2 - URL Generator에서 bot을 체크하면 url이 생성되게 한다.

 

해당 url을 주소창에 넣게 되면, 디코 어느 서버에 초대할 지 선택하게 한다. 이 후 자신이 원하는 서버에 봇을 초대하게 되면, 자신의 서버에서 봇이 활동할 수 있는 발판이 완성된다.

피터 린치를 좋아하기 때문에 얼굴 사진을 피터 린치 사진으로 하였다.

 

이제 다음 단계를 진행하겠다.

 

지금 원하는 기능은 내가 주식을 식별할 수 있는 정보를 넣게 되면, 식별된 주식이 출력되게 하는 기능을 넣는 것이다.

또한 여기에 준비된 것은 Discord 봇과 처음에 단계를 넘긴 KIS 개발자 token 정보이다.

 

그렇다면 내가 구현할 방식은 KIS를 통하여 API를 사용하고, 그것을 Discord bot을 통해서 보여주게 되는 것이다.

내가 사용하게 될 코드는 https://github.com/Soju06/python-kis 이분이 작성하신 깃허브 코드이다. 

pip install python-kis

또는

pip3 install git+https://github.com/Soju06/python-kis.git

둘 중 하나를 이용해서 다운 받았다.

이후 처음으로 KIS에 대한 token 연결은 먼저 진행하였다.

 

처음으로 token 데이터를 config.json, secret.json이라는 이름으로 저장하였다.

{
    "token": "token_data"
}

 

{
    "id": "본인의 id", 
    "appkey": "본인의 appkey => KIS develop 사이트에서 확인 가능",
    "secretkey": "본인의 secretkey => KIS develop 사이트에서 확인 가능", 
    "account": "본인의 account(계좌) => KIS develop 사이트에서 확인 가능", 
    "virtual": false # 이것은 해당 계좌가 모의 투자 계좌인지 확인하는 부분 False = 실제라는 뜻
}

위의 token_data 에 자신의 디스코드 봇 token을 입력하고 secret.json에다가는 KIS 관련 key의 값을 넣으면 된다.

 

여기서 나오는 데이터들은 절대로 다른 사람이 봐서는 안되는 데이터이다. 따라서 추가적으로 .gitignore 이라는 파일을 만든다.

디렉토리 위치는 따로 디렉토리 구분을 하지 않았기 때문에 root디렉토리 위치에다가 만들면 된다.

 

해당 파일안에

config.json
secret.json

이렇게 적게되면 깃허브에 올릴 때 해당 파일들은 올라가지 않게 된다. (만약 실수로 올리더라도 깃허브에서는 메일로 본인의 민감한 정보가 올라갔음을 알려준다. 친절하다)

 

#BotPykis.py
from pykis import PyKis, KisAuth, KisBalance, KisQuote

class get_set_connect_pykis:
    def __init__(self):
        self.kis = None
        self.stock = None

    def set_real_pykis(self, token_path):
        self.kis = PyKis(token_path, keep_token = True)
        self.kis = PyKis(KisAuth.load(token_path), keep_token = True)

    def get_pykis(self):
        return self.kis
    
    def search_stock_name(self, stock_name):
        self.stock = self.kis.stock(stock_name)
        quote: KisQuote = self.stock.quote()
        quote: KisQuote = self.stock.quote(extended = True)
        return quote

BotPykis.py 라는 파일을 만들었다. 여기서는 기본적인 pykis로 구현할 수 있는 기능 및 pykis 계정 연결을 나타낸다.

set_real_pykis(self, token_path) 를 통하여 PyKis 객체를 생성하였다.

get_pykis는 만들어진 PyKis 객체를 가져오기 위하여 만들어진 메소드이며, search_stock_name은 stock_name을 통하여 해당 주식을 조회하기 위함의 목적으로 만들어진 메소드이다.

 

기능과 권한에 따라 분리하면 더 아름다운 코드가 되겠지만, 지금은 일단 기능 구현이 우선이라고 판단하여 코드 자체의 작동에 의의를 두겠다.

#bot.py
import discord
import json
from BotPykis import *
# config.json 파일에서 토큰 읽기
def connect_discord(path):
    with open(path) as f:
        config = json.load(f)
        TOKEN = config['token']
    return TOKEN

class set_discord:
    def __init__(self):
        self.intents = None
        self.client = None
        self.pykis = None

    def set_discord_bot(self, connect_pykis):
        self.pykis = connect_pykis
        self.intents = discord.Intents.all()
        self.client = discord.Client(intents = self.intents)

        @self.client.event
        @self.client.event
        async def on_message(message):
            if message.author == self.client.user:
                return        
            # message.content로 메시지 내용만 전달
            stock_data = self.pykis.search_stock_name(message.content)
            await message.channel.send(f"Stock data: {stock_data}")
    
    def start_client(self, TOKEN):
        self.client.run(TOKEN)

해당 bot.py는 discord.bot과 관련한 처리를 하는 코드이다.

권한 분리가 구현되지 않은 것이 아쉽다. 코드를 보면 알겠지만 pykis 데이터도 여기서 연결되며, token에 대한 접근도 일어나고 있고, 실제 보여지는 event도 해당 부분에서 일어나고 있다.

 

코드 자체만 설명하게 되면, connect_discord를 통해서 token 데이터를 불러오게 된다. 그 후 set_discord_bot을 통하여 pykis 객체를 입력받고 pykis 객체를 사용할 준비를 해뒀다. 아래의 self.client.event 애노테이션을 통해서 이벤트가 일어나는 경우 async def (비동기성 메서드)가 사용되게 된다. 해당 메소드를 통해 메세지의 내용이 stock_data 의 이름으로 전달되게 되며, message.channel.send를 통해서 stock_data 를 출력하게 된다.

#main.py
from BotPykis import *
from bot import *
import discord, json
from option_function.black_shores_option import *

def kis():
    connect_pykis = get_set_connect_pykis()
    connect_pykis.set_real_pykis("secret.json")

    token = connect_discord("config.json")
    discord_bot = set_discord()
    discord_bot.set_discord_bot(connect_pykis)
    discord_bot.start_client(token)

main.py에서 secret.json, config.json의 토큰 주입이 일어나게 되고, discord_bot의 run도 작동되게 된다.

실제로 실행하게 되면

역시 주식은 NVIDIA지

이렇게 피터린치라는 화려한 초상화에 맞는 멋진 주식 데이터와 허름한 코드가 완성되게 된다.

이제 앞으로 진행될 것은 저 정제되지 않은 json 데이터 형식에 포함된 여러 데이터에 대한 조작과 새로운 출력, 또한 옵션 시장 데이터를 위한 함수 구현 및 코딩 스킬 연습 (권한 분리(객체지향), cache데이터(redis), 개인 포트폴리오 관리(구현), 동시 여러명에 대한 backend(flask), ChatGptApi 등) 등의 확장을 만들 것이다.

 

관련글 더보기