본문 바로가기
Python/Selenium & 크롤링

[python] 실시간 주식 종목, 현재가, 차트 카카오톡 메세지로 나에게 보내기

by 여비코기 2021. 6. 19.

이번 게시글에서는 내가 보고자 하는 종목을 "네이버 금융"페이지로부터 종목이름, 현재가, 차트를 불러와 카카오톡 메세지로 나에게 일정 시간마다 전송해주는 코드를 짜보려고 한다.

 

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

우선 해당 기능을 구현하기 위해서는 카카오 개발자 페이지의 가입이 필수적이다.

가입 후 상단의 "내 애플리케이션"에 들어가 첫 애플리케이션을 만들어준다.

나는 "가격 알리미"라고 이름을 지정해주었고, 차트모양의 이미지를 아이콘으로 설정해주었다.

 

애플리케이션이 생성되면 들어간 후 "카카오 로그인" -> "동의 항목"의 접근권한에서 "카카오톡 메세지 전송"을 활성화 해준다. 그럼 다음과 같이 불이 들어오며 "사용 안함" -> "선택 동의"로 활성화 될 것이다.

애플리케이션 생성이 완료되었으면 다시 위 메뉴의 "도구" -> "REST API"로 들어간다. 이때 주의할점은 애플리케이션을 "developer-sample"이 아닌 내 애플리케이션으로 바꾸어 주어야한다.

어플리케이션 변경이 완료 되었으면 왼쪽 메뉴에서 "메세지" -> "나에게 기본 템플릿으로 메세지 보내기"를 들어간다.

요청 란의 엑세스 토큰에서 토근 발급을 받아 발행된 토큰을 잘 복사해놓도록 하자.

 

카카오톡의 준비는 되었으니, 네이버에서 종목코드로 검색한 후 종목명, 차트, 현재가를 불러와보자.

↓네이버 증권에서 "카카오"를 검색했을때 URL주소로 가장 뒤를 보면 "code=종목번호"로 이루어진 것을 볼 수 있다.

 

https://finance.naver.com/item/main.nhn?code=035720 

 

카카오 - 네이버 금융 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

해당 페에지에서 "카카오"라는 종목이름, "155,000"원의 현재가, 그리고 1일 차트 이미지를 불러와 표출해줄 것이므로

종목이름과 현재가는 text요소를, 차트이미지는 img_url을 불러올 필요가 있다.

 

해당 코드에서는 requests와 Beautifulsoup을 이용해서 요소들을 불러오고 다룰 것이다.

import requests, json, time
from bs4 import BeautifulSoup
from datetime import datetime

def get_code(company_code):
    url = "https://finance.naver.com/item/main.nhn?code=" + company_code
    result = requests.get(url)
    bs_obj = BeautifulSoup(result.content, "html.parser")
    return bs_obj, url

def get_name(company_code):
    bs_obj, url = get_code(company_code)
    name = bs_obj.select_one('#middle > div.h_company > div.wrap_company > h2 > a').text
    return name, url

def get_price(company_code):
    bs_obj, url = get_code(company_code)
    no_today = bs_obj.find("p", {"class": "no_today"})
    blind = no_today.find("span", {"class": "blind"})
    now_price = blind.text
    return now_price, url

def get_chart(company_code):
    url = "https://finance.naver.com/item/main.nhn?code=" + company_code
    result = requests.get(url)
    bs_obj = BeautifulSoup(result.content, "html.parser")
    images = bs_obj.findAll('img', {"alt" : "이미지 차트"})
    image_url = images[0]["src"]    
    return image_url
          
def get_mobile_url(company_code):
    url = "https://m.stock.naver.com/item/main.nhn#/stocks/"+company_code+"/total"
    return url

company_codes = ["035420", "035720", "005930"]

get_code 함수에서는 입력받은 종목번호로부터 해당 종목의 페이지로 들어가 각 요소들을 불러들여오는 기능을 한다.

get_name 함수에서는 종목 이름의 Selector코드를 따온 후 text로 추출하여 종목이름을 name에 할당한다.

get_price 함수는 마찬가리로 종목의 현재가를 text로 추출하여 now_price에 할당한다.

get_chart는 alt = "이미지 차트"인 img 요소를 불러온 후 "src"에 할당되어있는 img_url을 불러와 image_url에 할당한다.

 

(get_mobile_url은 "자세히 보기" 버튼을 만들어 누르게되면 네이버 증권 페이지로 이동하게 구현하려 했으니 buttons기능이 잘 활성화 되지 않아 우선은 버튼을 만들지 않았다.)

 

종목번호는 "네이버", "카카오", "삼성전자" 세가지의 종목번호를 company_codes 리스트에 넣어주었다.

while True:
    now = datetime.now()
    
    for item in company_codes:
        now_price, url = get_price(item)
        name, url = get_name(item)
        image_url = get_chart(item)
        mobile_url = get_mobile_url(item)


        k_url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
        
        headers = {
            "Authorization": "Bearer " + '{발급받은 내 토큰 입력}' 
        			}
        data = {"template_object" : json.dumps({"object_type" : "feed",
                                                "content" : {
                                                                "title" : name +' 현재가',
                                                                "description" : now_price + '원',
                                                                "image_url" : image_url,
                                                                "image_width" : 700,
                                                                "image_height" : 289,
                                                                "link" : {"web_url" : url,
                                                                          "mobile_web_url" : mobile_url                         
                                                                        }
                                                            }           
                                                })
                }
        
        response = requests.post(k_url, headers=headers, data=data)
        
        print(str(now)[:-7])
        if response.json().get('result_code') == 0:
            print(name + ' : transmission Success')
        else:
            print('Error. code : ' + str(response.json()))
        
        print("-------------------------------")
    
    time.sleep(10)

company_codes리스트로부터 종목번호를 하나씩 불러와 카카오톡 메세지로 차트이미지, 종목이름, 번호를 보내도록 설정한 코드이다. time.sleep(10)을 적용하여 10초마다 한번씩 보내게 되어있다.

 

위 변수 중 k_url의 뒷부분은 "나에게 기본 템플릿으로 메세지 보내기"기능의 주소를 가져온 것이다.

그후 전송할 데이터들을 설정해주어야 하는데 

title은 전송할 제목으로 나는 "종목명 + 현재가"로 출력되게 하였다.

description에는 제목 밑 설명란에 채울 내용을 적어야하는데 나는 종목의 현재가가 출력되도록 하였다.

image_url에는 출력할 이미지의 url을 넣어야하는데 위의 get_chart함수로부터 image_url을 불러온 것을 넣어주었다. 

크롬 F12 개발자 모드의 이미지 정보를 보니 차트가 700 x 289의 사이즈를 가지고있어 그대로 넣어주었다

(link에는 네이버 증권의 데스크탑 페이지, 모바일 페이지를 넣어주었는데 해당 기능 역시 자세히 보기 버튼을 만들어 누르면 들어가도록 구현하려했으나 buttons를 추가해도 아무것도 뜨지 않아 일단 남겨두었다.)

 

따라서 해당 py파일을 실행시키면 콘솔창에는 다음과 같이 종목 정보 전송이 잘 되었다는 메세지가 표출되도록 하였다.

최종적으로 카카오톡 채팅방 나와의 대화에 들어가보면 다음과 같이 위에는 차트, 아래는 종목명과, 현재가가 표현되는 것을 확인 할 수 있다.

추후 사용자 정의 템플릿을 사용하여 더 다양한 정보를 보기 편하게 나타낼 수 있을 것이다.

또한 어느정도 기능이 상당부분 구현되면 친구들과의 단톡방이나, 친구에게도 자동으로 일정시간마다 전송되는 기능도 구현 할 수 있을 것이다.

댓글