[데이터엔지니어링] - Project (6) : 디스코드 봇 연결

nothingisme·2023년 12월 27일
0
post-thumbnail
🔥 KHUDA를 졸업하면서 마지막으로 5기에게 선물을 주고 싶어졌다.. 무작정 차기 교육부장이랑 
같이 5기 디스코드 서버에서도 이 프로젝트를 계속 활용할 수 있도록 디벨롭 레츠기릿~!

0️⃣ 디스코드에서 설정

디스코드 봇에서 사용자의 요청 없이도 먼저 알람을 보내도록 하기 위해서는 DisCord Webhook을 활용해야했다.

표 이미지 출처 : https://zerohertz.github.io/airflow-discord/

웹훅 등록

봇을 만드려는 서버의 채널에서 ⚙️ 톱니버튼을 클릭 하면 채널 편집으로 들어갈 수 있다

왼쪽 탭에서 연동을 클릭하면 이렇게 웹후크 연동 설정으로 이동할 수 있는 창이 뜬다. 웹후크보기를 클릭해서 들어간다.

필자는 이미 웹후크를 생성했기 때문에 다음과 같이 뜨지만, 없다면 새 웹후크버튼을 눌러서 클릭해주자. 그리고 이름과 사진을 자유롭게 설정해준다. 중요한 것은 ⭐️ 웹후크 URL 복사 ⭐️를 해서 URL를 저장해두는 것이다. 이 URL이 연결할 때 쓰일 URL이기 때문이다.

디스코드 쪽에서는 이렇게 하면 설정이 끝난다.


1️⃣ DiscordWebhookOperator 활용

DAG 구성 방법이나 기본적인 부분들에서 이해가 가지 않는다면, 앞 포스팅들을 참고하기를 바란다. 이 포스팅에서는 디스코드 봇과 연결하는 부분만 다루도록 하겠다!

관련 자료들을 찾아보다가 Airflow 공식에서 이미 디스코드 웹훅과 관련된 오퍼레이터를 별도로 지원한다는 점을 발견했다. 활용한 자료가 별로 없지만 일단 사용해보기로 했다.

주요 파라미터에는 HTTP 연결 아이디, WebHook Endpoint, Message 가있다.

HTTP 연결 설정하기

Airflow 웹서버 UI에서 Admin 탭에 Connections로 들어가자. 여기서 여러 연결과 관련된 설정들을 할 수 있다. 그리고 왼쪽 아래 ✚ 버튼 눌러서 새 연결을 만들어주자.

Connection Id는 임의로 원하는 걸로 설정해주자. 대신 Connection TypeHTTP로, Hosthttps://discord.com/api/ 로 해야한다.

Test를 했을 때 " 404:Not Found " 가 뜨더라도 괜찮다. 지극히 정상이다. 추가로 웹훅 엔드포인트까지 설정해줘야 완전하기 때문이다.

DAG에 Task 생성하기

우선 터미널에서 두 가지를 설치해준다.

pip install apache-airflow-providers-discord
pip install apache-airflow-providers-http

⛔️ 만약에 cannot import name 'HttpOperator' from 'airflow.providers.http.operators.http' 같은 오류가 난다면 DiscordWebhookOperator이 설치된 쪽에서 HttpOperator가 아니라 SimpleHttpOperator로 해주면 된다. 이유는 모르겠지만 SimpleHttpOperator는 잘 import가 되지만, HttpOperator는 import하는 과정에서 오류가 난다. 아마 패키지간에 버전 동기화가 잘 맞지 않는 것 같다.

기존 DAG 파일에 새로 DiscordWebhookOperator를 불러와주고 아래와 같은 Task를 새로 만들어주었다. task_id는 임의로 지정해주고

  • http_conn_id : 위에서 설정한 Connection Id 값을 넣어준다.
  • webhook_endpoint : 위에서 복사한 웹후크 URL 에서 https://discord.com/api/ 뒷 부분에 이어지는 webhooks/ ... 부분을 넣어준다.
  • message : 보내고 싶은 메세지를 최대 2000자까지 string으로 넣는다.
from airflow.providers.discord.operators.discord_webhook import DiscordWebhookOperator

discord = DiscordWebhookOperator(
        task_id='discord_operator',
        http_conn_id="conn_discord",
   		webhook_endpoint=“webhooks/{webhook.id}/{webhook.token},
        message="test"
)

다음 처럼 태스크를 추가하고 DAG을 실행시켰다. 그러면 아래와 같이 메세지가 잘 도착한 것을 확인할 수 있었다.

하지만 이 방법에서는 message가 string의 max 2000자라는 한계가 존재했다. 좀 더 자유로운 형태로 메세지를 보낼 수 있는 방법이 필요해졌다.


2️⃣ PythonOperator + Request 활용

기본적으로 다른 태스크에서는 PythonOperator를 많이 활용하고 있다. 마찬가지로 파이썬 코드로 작성해서 함수만 airflow쪽에 넘겨주는게 편하지 않을까란 생각이 들었다.

def discord() :
    url = #YOUR_Webhook_URL 
    #for all params, see https://discordapp.com/developers/docs/resources/webhook#execute-webhook
    data = {
        "content" : "message content",
        "username" : "Airdnb"
    }
    #leave this out if you dont want an embed
    #for all params, see https://discordapp.com/developers/docs/resources/channel#embed-object
    data["embeds"] = [
    {
        "description" : "text in embed",
        "title" : "embed title"
    }
    ]
    result = requests.post(url, json = data)
    try:
        result.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print(err)
    else:
        print("Payload delivered successfully, code {}.".format(result.status_code))

다음 링크 를 참고해서 함수를 새로 추가해주었다. (request 모듈 import 해줘야 한다.)

그리고 다음과 같이 간단하게 태스크를 실행시켜줬다.

    discord_bot = PythonOperator(
        task_id='discord',
        python_callable=discord
    )

잘 되었다. 메세지 내용을 좀 더 자세하게 하는 방식 등은 공식 문서를 찾아봐야겠다.


3️⃣ PythonOperator + discord-webhook

request보다 조금 더 간단한? 형태로 이미 파이썬 모듈이 별도로 존재했다.

pip install discord-webhook

이렇게 설치하면 바로 사용할 수 있다.

from discord_webhook import DiscordWebhook

message = 'Test Webhook'
url = #YOUR_WEBHOOK_URL
webhook = DiscordWebhook(
			url=url, 
            content=message
)
response = webhook.execute()

함수나 DAG는 2번과 동일하게 구성하면 될 것 같다.

Pypi 사이트 에서 좀 더 자세한 내용을 살펴볼 수 있다. 1번 방식과 달리 2번 방식처럼 이미지와 같은 Embed도 포함시켜서 메세지를 보낼 수 있고, async로 비동기로도 가능한 것 같다.

2번 방식이 더 좋은 것 같아서 따로 실행시켜 보지는 않았다.

이번 포스트에서는 간단하게 메세지를 보내는것 여부만 설정해두었는데, 다음 포스트에서는 
크롤링한 내용을 형식에 잘 맞춰서 보내는 것까지 해봐야겠다! 오늘은 여기까지👋 
profile
가볍게 재밌던 거 기록해요

0개의 댓글