(1) 메시지 템플릿 이해

 카카오톡 메시지를 파이썬으로 보내기 위해서는 템플릿에 대해 이해해야 한다. 템플릿은 말그대로 하나의 틀이다. 그 틀 안에는 이미지, 텍스트, 커머스 등의 내용이 들어 간다.

출처 : kakao developers : 메시지 템플릿 | Kakao Developers 문서

각 템플릿에 대한 자세한 구성 내용은 위 웹사이트 들어가서 확인해 보면 된다. 나는 간단한 리스트형을 보낼 거기 때문에 리스트형에 대해서만 구성할 것이다.

 

(2) Json 형태로 구성한다. 

 Json 형식은 구글 검색해 보면 공부할 수 있는 자료가 많으니 찾아서 공부해 보기 바란다. 나는 내 블로그에 있는 매일 크롤링 되는 url 만 보내면 되기 때문에 아래와 같이 단순히 텍스트와 url 링크 형식의 템플릿으로 아주 아주 간단하게 구성했다. 일단 네이버로 잘 접속이 되는지 한번 해봤다. 잘된다. 


KAKAO_TOKEN_FILENAME = "res\kakao_messages\kakao_token.json"


def send_message(filename, template):
    tokens = load_tokens(filename)

    headers = {
        "Authorization" : "Bearer " + tokens['access_token']
    }
    # JSON 형식 ->문자열 변환
    payload = {
        "template_object" : json.dumps(template)
    }

    # 카카오톡 보내기
    url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
    res = requests.post(url, data = payload, headers=headers)

    print(res.status_code)

    return res


if __name__ == '__main__':
	template = {
        "object_type" : "text",
        "text" : "시장 요약",
        "link" : {
            "web_url" : "www.naver.com"

        },
        
    }
    res = send_message(KAKAO_TOKEN_FILENAME, template)
    if res.status_code != 200:
        print("res.json())
    else:
        print('Success ')

 

드디어 다왔다. 이젠 시장요약 크롤링과 엮으면 될 듯 싶다. 최근 주식 투자가 재미있어서 시작했는데 솔직히 여기까지 왔어야만 했나 싶다. 마지막 링크 엮은건 조금 쉰다음에 하자. 요즘 회사 일이 너무 바빠서 .. 집에 오면 솔직히 쉬고 싶다. 

https://elecsog.tistory.com/55

 

카카오 메시지를 보내기 위한 토큰 발급 받기

(1) 카카오 개발자 사이트에 들어가서 애플리케이션 설정을 진행한다. 카카오 개발자 사이트 : https://developers.kakao.com/  <내 애플리케이션 >  <애플리케이션 추가하기> < 접근 권한 설정 > Redirect U..

elecsog.tistory.com

 

위 링크 과정을 진행을 하면 아래와 같이 토큰을 얻을 수 있다. 이 토큰은 만료 시간이 정해져 있다. 그래서 어제까지 실행이 잘 됐던 코드가 갑자기 막혀 버리는 사태가 발생할 수 있다. 

그래서 토큰을 수시로 Refresh 하고 다시 저장하는 루틴을 만들어 놓을 필요가 있다. 

import json
import os
import datetime
import requests

#아래 함수에서 filename은 토큰이 저장될 파일 경로 입력해 주면 된다. 

def save_tokens(filename, tokens):
    with open(filename, "w") as fp:
        json.dump(tokens, fp)


def load_tokens(filename):
    with open(filename) as fp:
        tokens = json.load(fp)

    return tokens

# 아래 App_key는 이전 링크 참조하면 App_Key 받는 방법은 알 수 있다.
# 그냥 카카오 개발자 사이트 들어가서 API KEy APP Key Client ID 같은건
# 한파일에 저장해 놓고 수시로 가져다 쓸수 있게 하든지
# 코드 주석으로 남겨 놓고 쓰면 좋을 듯.`~~~~
def update_tokens(app_key, filename):
    tokens = load_tokens(filename)

    url = "https://kauth.kakao.com/oauth/token"

    data = {
        "grant_type" : "refresh_token",
        "client_id" : app_key,
        "refresh_token" : tokens['refresh_token']
    }
    
    response = requests.post(url, data=data)

    # 요청에 실패했다면
    if response.status_code != 200:
        print( response.json())
        tokens = None
    else:   # 성공했다면
        print(response.json())
        #기존 파일 백업해 두자 용량 몇KB 이다
        # 날짜를 파일 이름에 추가하여 백업 파일인지 확인.
        now = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        backup_filename = filename+"."+now
        os.rename(filename, backup_filename)
        # 갱신된 토큰 저장
        tokens['access_token'] = response.json()['access_token']
        save_tokens(filename, tokens)

    return tokens

다음 포스트에서는 진짜 메시지 보내는거 해야지.. 뭐이리 준비할게 많은지...하지만..

주식신문 송부까지 ..진짜 얼마 안남은 듯 하다. 

 

퇴근하고 일단 재밌어서 시작은 했는데 점점 귀찮다..

그래도 첫번째 사적 프로젝트이니 시간이 얼마가 걸리든 가보긴 가보련다. 

(1) 카카오 개발자 사이트에 들어가서 애플리케이션 설정을 진행한다.

카카오 개발자 사이트 : https://developers.kakao.com/

 <내 애플리케이션 >

 <애플리케이션 추가하기>

< 접근 권한 설정 >

Redirect URI는 인증코드 발급 요청시 전달될 위치임. 내 컴퓨터를 서버처럼 사용하므로 Redirect URIhttp://localhost.com 으로 설정한다.

나는 주식신문 자동화가 목적이고 내 티스토리 블로그에 있는 것을 가져올 거기 때문에 플랫폼 도메인은 www.tistory.com , elecsot.tistory.com 이렇게 도메인을 등록을 해 놓는다.

(2) 카카오톡 메시지 API 사용 권한 받기

 ** 자세한 내용은 아래 URL 들어가면 자세히 나와 있다.

 * 인증 코드 발급 및 사용자 토큰 발급

 https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

조금 전 만든 App에 들어가서 “REST API 확인

크롬을 아래와 같이 시크릿 창으로 하나 열어서 아래와 같이 입력한다.

https://kauth.kakao.com/oauth/authorize?client_id=<REST_API_KEY>&response_type=code&redirect_uri=https://localhost.com

동의 화면 나오고 동의하면 시간이 좀 걸린다.

 

 

위와 같이 URL 입력하는 부분에 코드값이 하나 나온다 이 코드값은 꼭 텍스트 파일에 잘 저장해 놓자. 토큰 받을 때 필요하다.

https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api

위 사이트에 들어가면 토큰 발급을 위해서는 아래와 같이 4개 파라미터가 필요하다.

 

위 정보를 주고 받은 정보는 아래와 같이 설명이 나와 있다.

일단 토큰 받는 것을 코드로 넣으면 아래와 같다,

아래 <REST_API_앱키> 는 내 애플리케이션 정보에 . 그리고, 아래 발급받은 코드는 위에서 텍스트로 저장해 놓은 값을 넣어주면 된다. 

def tempToken():
    url = "https://kauth.kakao.com/oauth/token"
    data = {
        "grant_type" : "authorization_code",
        "client_id" : "<REST_API_앱키>",
        "redirect_uri" : "https://localhost.com",
        "code" : "<발급받은 코드"
    }
    response = requests.post(url, data=data)
    if response.status_code != 200:
        print(response.json())
    else:
        tokens = response.json()
        print(tokens)

 

이거 생각보다 길어져서 메시지 보내기 위한 토큰 업데이트 코드는 다음 포스트에 이어서 진행한다. 

아...힘들다..

재밌네...ㅋㅋㅋ

망고보드 파워풀하다. 

 Google Drive 업로드 API 를 왜 쓰냐? 

 여러 파일을 한꺼번에 올릴 수 있다는 것이고, 나같은 경우는 웹호스팅 서비스를 아주 간단하게 시험해 볼때 이미지 저장소로 사용하면서 이미지 로딩에 사용할 사진들을 올려놓고 테스트에 활용할 수 있다. 물론 호스팅 업체 서버를 이용해서 정식으로 할때는 필요없지만 . 

 아래 구글에서 제공하는 Quick Start 사이트를 이용하면 현재 계정에 올라가 있는 파일 리스트 10개와 폴더 ID를 가지고 올 수 있다. 사실 이것만 되면 나머지는 메뉴얼 보면서 하면 금방 할 수 있다. 

 

Python Quickstart  |  Drive API  |  Google Developers

 

Python Quickstart  |  Drive API  |  Google Developers

Send feedback Python Quickstart Complete the steps described in the rest of this page to create a simple Python command-line application that makes requests to the Drive API. Prerequisites To run this quickstart, you need the following prerequisites: Pytho

developers.google.com

from __future__ import print_function

import os.path

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly']


def main():
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        service = build('drive', 'v3', credentials=creds)

        # Call the Drive v3 API
        results = service.files().list(
            pageSize=10, fields="nextPageToken, files(id, name)").execute()
        items = results.get('files', [])

        if not items:
            print('No files found.')
            return
        print('Files:')
        for item in items:
            print(u'{0} ({1})'.format(item['name'], item['id']))
    except HttpError as error:
        # TODO(developer) - Handle errors from drive API.
        print(f'An error occurred: {error}')


if __name__ == '__main__':
    main()

위 코드 블록을 보면 "storage.json" 파일은 이전 포스팅에서 json 다운로드 하면 얻을 수 있다. 아마 storage.json으로 저장이 안되면 이름을 storage.json으로 변경해 준다. 아래 참조

'코딩해보기/Google Drive API' 카테고리의 글 목록 :: 별일 없이 산다 (tistory.com)

 

'코딩해보기/Google Drive API' 카테고리의 글 목록

 

elecsog.tistory.com

 

일단 위 코드를 실행을 하면 구글 계정 선택하라고 하면 위 링크에서 설정한 아이디 설정하면 "token.json" 파일이 생기면서 다음부터는 계정 설정 안해도 된다. 

 

여기서 얻어 낸 폴더 ID는 잘 가지고 있길 바란다. 파일 업로드까지 해보려고 했는데 너무 졸리다. 다음 포스팅에서 쓰련다. 

'코딩해보기 > Google Drive API' 카테고리의 다른 글

1_Google_Clouds_Console_Setting  (0) 2022.08.15

** Visual Studio Code 에서 파이썬 사용하기 환경 구성 **

1. Anaconda 다운로드 - Anaconda | Anaconda Distribution

이 블로그에 있는 키움 증권 API 사용을 위해서는 Anaconda 32bit을 다운로드 해야 한다.

텍스트이(가) 표시된 사진  자동 생성된 설명

2. Anaconda Install 파일로 Anaconda 인스톨 한 후 Anaconda 실행

텍스트이(가) 표시된 사진  자동 생성된 설명

3. 가상환경 활성화

“conda activate ‘가상환경 이름’ : 가상환경을 만들 때 ‘example’ 로 했음.

텍스트이(가) 표시된 사진  자동 생성된 설명

4. Visual Studio Code 설치 후 실행 및 프로젝트 폴더 설정

https://code.visualstudio.com/

5. 파이썬 파일 만들기

텍스트, 스크린샷, 모니터, 검은색이(가) 표시된 사진  자동 생성된 설명텍스트이(가) 표시된 사진  자동 생성된 설명

*.py 파일을 만들어 주면 Visual Studio Code가 알아서 python extention을 인스톨할지 물어본다. 이때 꼭 Install 해준다.

6. 파이썬 인터프리터 설정

Ctrl + shift + p 를 누른후 인터프리터를 이전에 만들어 준 아나콘다 가상 환경을 설정해 준다.

텍스트, 스크린샷, 모니터, 실내이(가) 표시된 사진  자동 생성된 설명

7. 파이썬 파일을 실행할 터미널 실행

텍스트이(가) 표시된 사진  자동 생성된 설명

8. 파이썬 실행해 보기

텍스트이(가) 표시된 사진  자동 생성된 설명

 

기본적인 설정 방법은 이렇게 되고, 모듈 설치부터 디버깅 방법은 시간 나는대로 포스팅 하면서 정리좀 해야겠다. 한번 세팅해 놓으면 컴퓨터 바꿀때까지 거의 그대로 쓰기 때문에 기억이 가물가물 하다. 역시 문서화를 좀 하는게 좋을 거 같다.

***** 오늘의 테마 주도주 크롤링 ******

마켓 크롤링 리포트가 오늘의 시장의 이슈를 반영을 못하는 듯 한 느낌이 일주일만에 들어서 오늘의 테마를 가져오는 크롤링 코드를 하나 만들었다.

1. 네이버 증권에서 테마 화면으로 진입하여 html 소스를 검토한다.

테마별 시세 : 네이버 금융 (naver.com)

페이지의 구조를 살펴보면 아래와 같다.

텍스트이(가) 표시된 사진  자동 생성된 설명

2. 크롤링 구조 계획

(1)금일의 테마를 순서대로 가져오기

Table tag의 class가 “type1 theme” 를 찾고 하위 태그 중 td의 class가 “col_type1”을 모두 찾아서 리스트에 저장하면 오늘의 테마 순위대로 리스트에 쌓인다.

(2) 첫번째 주도주 가져오기

Table tag의 class가 “type1 theme” 를 찾고 하위 태그 중 td의 class가 “ls col_type5”을 모두 찾아서 리스트에 저장하면 오늘의 각 테마에서 첫번째 주도주가 리스트에 쌓인다. 이때 a tag의 href attribute 값까지 가져오면 해당 종목 링크까지 리스트에 쌓게 할 수 있다.

(3) 두번째 주도주 가져오기

Table tag의 class가 “type1 theme” 를 찾고 하위 태그 중 td의 class가 “ls col_type6”을 모두 찾아서 리스트에 저장하면 오늘의 각 테마에서 첫번째 주도주가 리스트에 쌓인다. 이때 a tag의 href attribute 값까지 가져오면 해당 종목 링크까지 리스트에 쌓게 할 수 있다.

3. 코드

def get_soup_obj(url):
    headers = {'User-Agent': 'Mozilla/5.0 \
            (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 \
             KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36'}
    res = requests.get(url, headers=headers)
    soup = BeautifulSoup(res.text, 'lxml')
    return soup

def getThemeList( themeNameList:List, itemList1:List, itemLinkList1:List, itemList2:List, itemLinkList2:List):
    url = 'https://finance.naver.com/sise/theme.naver'
    soup = get_soup_obj(url)
    themeName = soup.find('table', class_='type_1 theme').find_all('td', class_= 'col_type1')


    for a in themeName:
        themeNameList.append(a.a.text)


    tem1 = soup.find('table', class_='type_1 theme').find_all('td', class_= 'ls col_type5')


    for a in item1:
        itemList1.append(a.a.text)
        itemLinkList1.append("https://finance.naver.com/"+ a.a.attrs.get('href'))




    item2 = soup.find('table', class_='type_1 theme').find_all('td', class_= 'ls col_type6')
    for a in item2:
        itemList2.append(a.a.text)
        itemLinkList2.append("https://finance.naver.com/"+ a.a.attrs.get('href'))
 
   

크롤링은 News 정보를 긁어 오기는 편하지만 실제적인 가격의 움직임이라든지 아니면 수급 같은 Data들을 모으기가 어렵다. 그래서 이리 저리 알아보다가 증권사마다 Open API를 활용하면 가격 / 수급 Data를 쉽게 수집할 수 있는 걸 알았다. 사실 난 소프트웨어 전공자는 아닌데 파이썬을 업무에서 한번 써보고 공부하다 보니 여기까지 왔다. 처음에는 수집된 Data로 도깨비 방망이처럼 수익기계를 만들 수 있을 줄 알았는데 그건 불가능하다. 이에 대한 의견은 한번 수필처럼 쓰고 싶지만 좀 바빠서…귀찮기도 하고, 쓰면 뭐하나 싶기도 하고,…쓸데 없는 말 여기까지 하고. 이제 본격적인 파이썬으로 증권사 Data 가져오기 한번 해보자

1. 키움증권 API 사용신청

(1) 키움 계좌 개설

: 이 부분은 앱이 제일 편하다. 키움계좌개설 앱이 있어서 다운 받아서 일단 계좌부터 트자.

(2) Open API+ 사용 신청

키움 Open API+ | Open API | 다운로드 | 고객서비스 | 키움증권 (kiwoom.com)

텍스트이(가) 표시된 사진  자동 생성된 설명

들어가셔서 서비스 등록부터 모의투자 신청까지 쭈욱 해주시면 됩니다.

중간에 아래그림처럼 KOA Guide가 있는데 이건 그냥 일단 Download만 받아 놓으세요. 이거 나중에 꼭 필요합니다.

텍스트이(가) 표시된 사진  자동 생성된 설명

2. 로그인부터 해보자

다운로드 받은 KOAStudioSA 를 실행시켜서 로그인부터 해놓자

모의투자 꼭 체크하시고 로그인 해주세요. 로그인 누르면 뭔가 많이 다운로드 되면서 시간은 좀 걸린다.

오른쪽 아래 상태바에서 KSA 상태바를 우클릭 한 후 계좌 비밀번호 저장을 누른다.

텍스트이(가) 표시된 사진  자동 생성된 설명

제대로 되는지 한번 확인해 보자

“pip install pykiwoom”

Pykiwoom 모듈을 일단 인스톨 하자. 전체적인 코딩 환경 구성방법이 필요하시면 댓글 담겨 주세요. 저도 해본지 꽤 오래 되서 이거 다시 구성하는거 문서로 만들려면 여기저기 찾아보면서 해야 해서 좀 시간이 걸릴거 같아요.

from pykiwoom.kiwoom import *
kiwoom = Kiwoom()
kiwoom.CommConnect(block=True)
id = kiwoom.GetLoginInfo("USER_ID")
name = kiwoom.GetLoginInfo("USER_NAME")
print(id)
print(name)

위와 같이 코딩해봐서 내 id하고 이름이 잘 출력되면 일단 증권사 정보 가져오기 기본 와꾸는 다 된 것이다. 여기까지 못하시겠으면 댓글을 남겨주시던지….메일주세요.

+ Recent posts