[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (5)
프로젝트/[ed]_슬랙봇_증시알림

[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (5)

728x90
반응형

만들고 보니 문제가 있어 수정을 좀 하려 합니다.

 

1. 문제점?

확인한 문제점은 아래 그림과 같습니다. 해당 날짜별로 그 날마다 업로드 되는 차트가 달라야 하는데 같죠..

당일 차트를 확인하는데는 문제가 없지만 이전 데이터를 확인하는데 문제가 있습니다.

 

10/1 과 10/8 의 차트 그래프. 달라야 하는데 같다.

 

원래 코드의 attachment 에 url 주소를 그대로 가져와서 생기는 문제 같습니다.

날짜별로 같은 주소이지만 같은 이름으로 계속 그날그날 이미지가 바뀌는 듯 합니다.

 

이제 순서를 아래와 같이 수정할 필요가 있습니다. 

url 이미지 로컬 PC 저장 → 저장한 파일 슬랙에 업로드

 

2. url 이미지 로컬 PC 저장 (이미지 저장)

구글 검색을 하면 파이썬에서 url 이미지를 저장하는 법은 몇가지 나옵니다. 전 이중에서도 

urllib.request.urlretrieve(이미지url, 이미지경로) 기능을 활용하겠습니다.

 

코드는 아래와 같습니다. (아래는 예시 입니다. image_url 의 경우, 해당 사이트에서 가져오는게 더 확실합니다.)

전 경로를 C 드라이브 → Projects 폴더 → Slack_notice 폴더 → images 폴더로 지정하였습니다.

 

import urllib.request # urllib.request 를 불러온다.
from datetime import datetime

# 이미지 가져올 url. 해당 사이트에서 웹스크래핑으로 가져오는게 제일 정확하다.
image_url = 'https://ssl.pstatic.net/imgstock/chart3/day/KOSPI.png?sidcode=1633991057519'

# 오늘 날짜를 YYYY-MM-DD 형식으로 가져온다. 예시, 2021-10-12
today_date = datetime.today().strftime('%Y-%m-%d')

# 파일 경로, 이름 지정 : 2021-10-12_KOSPI.png
image_name = 'C:/Projects/Slack_notice/images/' + today_date + '_KOSPI.png' 

# 해당 경로에 이미지 저장
urllib.request.urlretrieve(image, image_name)

 

이미지 저장 경로

 

저장된 파일이 본래 의도한바와 맞는지 확인해보고 맞으면 다음 단계로 넘어갑니다.

 

3. 파일 업로드 (슬랙 봇 활용)

저장을 했다면, 슬랙 봇을 이용해 업로드를 해야합니다.

호출 API 주소와 사용하는 인자들 (arguments) 가 메시지를 보내는 것과 일부 다르니 주의하세요. 

기존의 메시지 함수와 다른 파일 업로드 함수를 추가하였습니다. 

 

( ** 슬랙 봇이 뭔지, 기존 메시지 함수는 어떻게 되어있는지는 이전 문서를 참조하세요 )

2021.09.22 - [프로젝트] - [Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (1)

2021.09.22 - [프로젝트] - [Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (2)

 

파일 업로드 함수에 필요한 건, 슬랙봇 토큰 (token), 업로드 채널명 (channels), 파일 정보 (files) 입니다.

전 여기에 파일이름 (filename) 까지 인자로 전달하였습니다.

관련 코드는 아래와 같습니다.

 

# 이미지 형식 지정. 경로, 바이트 타입으로 파일 열기, 파일 타입
upload_image = (image_name, open(image_name, 'rb'), 'png')

# upload_file 함수에 인자 전달. 슬랙봇 토큰, 업로드 채널명, 업로드 파일 형식, 파일 이름
upload_file(Token, "#stock_notice", upload_image, today_date + '_KOSPI.png')

def upload_file(token, channel, files, filename):
    '''
    Slack API 직접호출 파일 업로드 함수. 함수 안 argument 순서 : \n
    token : Slack Bot의 토큰
    channels : 메시지를 보낼 채널 #stock_notice
    files : 첨부파일. 로컬 컴퓨터에서 이미지, pdf 문서등을 업로드 할 수 있다.
    filename : 슬랙에 올라갈 파일의 이름 (확장자 포함)
    '''
	
    # API 호출 주소에 유의하자.
    response2 = requests.post("https://slack.com/api/files.upload",
        headers={"Authorization": "Bearer "+token},
        data={"channels": channel, "filename": filename},
        files={"file": files})

 

전체 코드 (본 프로젝트의 부분 입니다.) 는 아래와 같습니다. 

내용의 살이 점점 붙다보니. 이전에 했던 부분을 포함하면 본 포스팅과 무관한 부분이 늘어나서 해당 부분만 올립니다.

 

import urllib.request # urllib.request 를 불러온다.
from datetime import datetime

# 자신의 Token 입력
Token = 'xoxb-' 

# 이미지 가져올 url. 해당 사이트에서 웹스크래핑으로 가져오는게 제일 정확하다.
image_url = 'https://ssl.pstatic.net/imgstock/chart3/day/KOSPI.png?sidcode=1633991057519'

# 오늘 날짜를 YYYY-MM-DD 형식으로 가져온다. 예시, 2021-10-12
today_date = datetime.today().strftime('%Y-%m-%d')

# 파일 경로, 이름 지정 : 2021-10-12_KOSPI.png
image_name = 'C:/Projects/Slack_notice/images/' + today_date + '_KOSPI.png' 

# 해당 경로에 이미지 저장
urllib.request.urlretrieve(image, image_name)

# 이미지 형식 지정. 경로, 바이트 타입으로 파일 열기, 파일 타입
upload_image = (image_name, open(image_name, 'rb'), 'png')

# upload_file 함수에 인자 전달. 슬랙봇 토큰, 업로드 채널명, 업로드 파일 형식, 파일 이름
upload_file(Token, "#stock_notice", upload_image, today_date + '_KOSPI.png')

def upload_file(token, channel, files, filename):
    '''
    Slack API 직접호출 파일 업로드 함수. 함수 안 argument 순서 : \n
    token : Slack Bot의 토큰
    channel : 메시지를 보낼 채널 #stock_notice
    files : 첨부파일. 로컬 컴퓨터에서 이미지, pdf 문서등을 업로드 할 수 있다.
    '''

    response2 = requests.post("https://slack.com/api/files.upload",
        headers={"Authorization": "Bearer "+token},
        data={"channels": channel, "filename": filename},
        files={"file": files})

 

현 프로젝트에서 위 코드를 적용하고 나면, 슬랙봇이 매일 18시에 아래와 같이 KOSPI 알림과 함께 그래프 이미지파일도 같이 업로드 하는 걸 확인하실 수 있습니다. 이제 이전 증시 데이터 그래프가 금일 증시데이터 그래프와 같아지는 현상은 없겠죠...? (공교롭게도 캡쳐한 날마다 내려가네요 ㅠㅠ)

 

변경 전/후. 이미지 url 링크를 거는 방식에서 직접 이미지 저장 및 업로드 하는 방식으로 변경했다.

 

이제 이 프로젝트도 마무리가 되는 것 같습니다. 전체 프로젝트에 관한 정리 및 마무리를 다음 포스팅에 올려보도록 하겠습니다.

 

궁금하신 사항 있으시다면 댓글 부탁드립니다.

 

4. References

슬랙 api 공식 문서를 활용하시면 더 많은 정보를 얻으실 수 있습니다.

 

https://api.slack.com/methods/files.upload

 

files.upload API method

Uploads or creates a file.

api.slack.com

 

 

파일 업로드 코드와 관련해 많은 도움을 받았던 stack_overflow 글 입니다. 

 

https://stackoverflow.com/questions/43464873/how-to-upload-files-to-slack-using-file-upload-and-requests

 

How to upload files to slack using file.upload and requests

I've been searching a lot and I haven't found an answer to what I'm looking for. I'm trying to upload a file from /tmp to slack using python requests but I keep getting {"ok":false,"error":"no_fil...

stackoverflow.com

 

728x90
반응형