본문 바로가기
IT

파이썬) 디스코드에 주가 알려주는 봇 만들기

by laoching 2023. 11. 3.
728x90
반응형

디스코드에 파이썬으로 네이버 증권에 접근해서 원하는 종목의 주가를 주기적으로 알려주는 봇을 만들어 본다.
 

단계

1. 디스코드 채널 만들기
2. 웹후크 연결하기
3. 크롤링하는 코드 짜기
4. 주기적으로 코드 실행하기
 


디스코드 채널 만들기

 
디스코드 가입하시고 디스코드 채널 만드시면 됩니다.
 

웹후크 연결하기

 
우선 채널을 만들고 톱니바퀴를 클릭합시다.

 
연동 클릭

 
웹후크 클릭

 
웹후크는 초강력 인터넷 파워를 사용한다고 하네요..
새 웹후크 만들기를 해줍시다.

 
그럼 밑에 자연스럽게 생기는데 한번 들어가봅시다.

 
웹후크에 대한 설정을 할 수 있고, 아래 웹후크 URL 복사가 보입니다.
이 웹후크 URL을 통해 크롤링한 정보를 디스코드로 보낼 수 있습니다.

 

코드짜기

 
저는 네이버 증권에서 크롤링 했습니다.
 
증권 페이지 소스에 변화가 생기면 크롤링이 되지 않을 수 있습니다. (2023.11.03 기준 잘 됩니다.)

# 네이버 증권 기준
# 종목 추가 시 ecobro 함수에 종목번호를 파라미터로 전달
# ex) 삼성전자 추가 시 code=005930

import requests
from bs4 import BeautifulSoup

hook_exchange = "여기가 웹후크 URL 자리"

def ecobro(page):

    site = "https://finance.naver.com/item/main.naver?code="

    r = requests.session()
    response = r.get(site + page)
    bs = BeautifulSoup(response.content, "html.parser")

    # 종목 이름
    name = bs.find_all('div', attrs={'class':'wrap_company'})
    subject = name[0].find('h2').text

    # 사업 분야
    work = bs.find_all('div', attrs={'class':'section trade_compare'})
    detail = work[0].find('a').text

    # 차트 이미지 url
    chart = bs.find_all('img', attrs={'id':'img_chart_area'})
    img_url = chart[0]['src']

    # 시간 정보
    now = bs.find_all('span', attrs={'id':'time'})
    ref_time = now[0].text

    results = bs.find_all('div', attrs={'class':'today'})

    plusminus = '0'

    # 전일 대비 상승 or 하락 +, - 기호 붙이기
    ex_day = bs.find_all('div', attrs={'class':'rate_info'})
    for j in ex_day:
        try:
            minus = j.find_all('span', attrs={'class':'ico minus'})
            plusminus = minus[0].text
        except:
            plus = j.find_all('span', attrs={'class':'ico plus'})
            plusminus = plus[0].text
        # +, - 가 아니면 None으로 나오는데, 그걸 그냥 +로 넣음
        if plusminus == None:
            plusminus = '+'

    for i in results:
        result = i.find_all('span', attrs={'class':'blind'})
        #print(f'현재가 : {result[0].text}')
        #print(f'전일 대비 상승가 : {result[1].text}')
        #print(f'전일 대비 상승률 : {result[2].text}')
        msg = ">" + " " + ref_time + " " + "(" + detail + ")" + "종목 :" + " " + subject + " " + "/" + " " +  "현재가 : " + result[0].text + "원" + " " + "/" + " " +"전일 대비 가격변동 :" + " " + plusminus + result[1].text + "원" + " " + "/" + " " + "전일 대비 변동률 :" + " " + plusminus + result[2].text + "%" + " " + img_url
        data = {"username": '에코형제 알리미', "content": msg, "embed":"false"}
        requests.post(hook_exchange, json=data)

ecobro("247540")
ecobro("086520")
ecobro("047050")
ecobro("352820")
ecobro("005930")

 
웹후크에는 post방식으로 request 해야하기 때문에 
requests.post(hook_exchange, json=data) << 이 코드를 써줬다.
 
 
코드 실행 모습

 
코드가 단발적으로 실행되는데,, 이걸 주기적으로 실행시키기 위한 방법이 2가지가 있다.
 
1. 윈도우 스케줄러 이용
2. 리눅스 서버에 코드를 올리고 crontab 이용
 
필자는 2번을 사용해 평일 09시 ~ 15시 30분 사이, 5분 간격으로 알림이 오도록 설정했다.
 

주기적으로 코드 실행하기

 
이마저도 서버가 꺼지면 동작을 하지 않는다. aws를 쓰면 될지도..?

 

728x90
반응형

댓글