만들고 보니 문제가 있어 수정을 좀 하려 합니다.
1. 문제점?
확인한 문제점은 아래 그림과 같습니다. 해당 날짜별로 그 날마다 업로드 되는 차트가 달라야 하는데 같죠..
당일 차트를 확인하는데는 문제가 없지만 이전 데이터를 확인하는데 문제가 있습니다.
원래 코드의 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 알림과 함께 그래프 이미지파일도 같이 업로드 하는 걸 확인하실 수 있습니다. 이제 이전 증시 데이터 그래프가 금일 증시데이터 그래프와 같아지는 현상은 없겠죠...? (공교롭게도 캡쳐한 날마다 내려가네요 ㅠㅠ)
이제 이 프로젝트도 마무리가 되는 것 같습니다. 전체 프로젝트에 관한 정리 및 마무리를 다음 포스팅에 올려보도록 하겠습니다.
궁금하신 사항 있으시다면 댓글 부탁드립니다.
4. References
슬랙 api 공식 문서를 활용하시면 더 많은 정보를 얻으실 수 있습니다.
https://api.slack.com/methods/files.upload
files.upload API method
Uploads or creates a file.
api.slack.com
파일 업로드 코드와 관련해 많은 도움을 받았던 stack_overflow 글 입니다.
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
'프로젝트 > [ed]_슬랙봇_증시알림' 카테고리의 다른 글
[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 - fin (0) | 2021.10.13 |
---|---|
[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (4) (0) | 2021.10.02 |
[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (3) - 2 (3) | 2021.09.25 |
[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (3) - 1 (1) | 2021.09.24 |
[Python] 슬랙(Slack) 알림봇 설정하여 매일 증시 알림 받기 (2) (0) | 2021.09.22 |