슬랙봇 만들기 2 - image 보내기

2023. 4. 21. 23:33프로젝트/슬랙 봇 비서 만들기

이전 글에서는 슬랙에 파이썬으로 텍스트를 전송하기를 완료했다!

 

텍스트 만으로도 나중에 데이터 셋을 만들 때 도움이 되겠지만, 이미지도 보낼 수 있으면 좋겠다 생각이 들었다.

 

 

먼저 이미지를 Base64로 인코딩한 후, JSON 객체로 만들어 전송하는 코드를 작성해 보았다.

import requests
import json
import base64

def image_send():
    with open("image/image001.png", "rb") as image_file:
        # 이미지 파일을 Base64로 인코딩
        encoded_string = base64.b64encode(image_file.read()).decode('utf-8')

    # JSON 객체 생성
    image_data = {
        "image001": encoded_string
    }

    # JSON 객체를 문자열로 변환
    json_image_data = json.dumps(image_data)

    return json_image_data

def send_slack_message_image():
    bot_url = '봇 url 주소'
    payload = {
        "text" : image_send()
    }

    # get, post => CRUD
    response = requests.post(
        bot_url,
        data=json.dumps(payload),
        headers={"Content-Type":"application/json"}
    )

    print(response)

send_slack_message_image()

저번에 작성했던 코드에 이미지를 Base64로 인코딩해 그냥 json 형태로 보내면 될 것 같았다.

 

크아아아악

 

왜 이런 오류가 발생했는지 -> [더보기 : 나중에 추가]

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

https://dragon1-honey1-wayfarer.tistory.com/entry/Python-슬랙Slack-알림봇-설정하여-매일-증시-알림-받기-5

해결을 위해 참고한 링크

 

chat:write 를 넣어주자

 

import requests

def send_slack_image(api_token, channel, image_path, message=None):
    url = "https://slack.com/api/files.upload"
    headers = {
        "Authorization": f"Bearer {api_token}"
    }
    payload = {
        "channels": channel,
    }
    if message:
        payload["initial_comment"] = message

    with open(image_path, "rb") as image_file:
        files = {
            "file": image_file
        }
        response = requests.post(url, headers=headers, params=payload, files=files)

    print(response.json())
    

api_token = "실제 토큰 값"  # 실제 토큰으로 변경하세요
channel = "#금융"  # 전송할 채널 이름
image_path = "image/image01.png"  # 전송할 이미지의 경로
message = "이미지와 함께 보내는 메시지"  # 이미지와 함께 보낼 메시지 (if로 선택사항을 주었다.)

send_slack_image(api_token, channel, image_path, message)

위 코드를 실행하면

 

잘 작동이 된다!

이미지를 파이썬으로 슬랙에 전송할 수 있게 되었다!

728x90