[Dev] 디스코드 봇 만들기 (1)

조수현·2025년 5월 18일

서론

이거 저거 만들고 싶어지는 요즘ㅋ 일 하다가 자동화가 필요한 게 생겨서 만들어 봤다
이미 업무하는 서버에 누가 만들어놓은 봇이긴한데 기능이 부족하고 매 번 봇 적용이 늦어서 직접 만들었다
현재 업무 서버에 적용했고 테스트 단계에 있다

필요한 기능

  • 평일, 일정한 시각에 디스코드 채널에 메세지를 올려야 함
  • 스레드를 생성하고 해당 스레드에 메세지를 달아야 함
  • 메세지에는 오늘 날짜가 포함됨

디스코드 webhook

웹훅(webhook)이란 한 서버에서 특정 이벤트가 발생할 시, 다른 서버에서 지정된 다른 이벤트가 발생하는 기능

  • 디스코드의 웹훅이라고 하면 깃헙을 많이 사용하는데
  • 예를 들면 깃헙에서 develop브랜치에 푸시 이벤트가 발생할 시, 디스코드에 'develop 브랜치에 푸시 발생'이라는 메세지를 보낼 수 있음

webhook 생성

  • 웹훅을 보낼 디스코드 채널 설정 화면
  • 연동 > 웹후크 > 새 웹후크
  • 웹후크 URL 복사를 눌러 URL 저장
  • 이 URL로 POST 통신을 보내 메세지를 보냄

메세지 전송 POST 통신

const body = {
  content: '메세지',
};

const response = await fetch(`${DISCORD_WEBHOOK_URL}?wait=true`, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify(body),
});
  • 요청 URL의?wait=true는 생성한 메세지에 대한 데이터를 응답으로 받기위한 쿼리
  • 보낼 메세지를 body의 content에 담아 전송

AWS lambda

작성한 스크립트 코드를 실행하는 서버

  • 생성한 웹훅 URL을 이용해 채널에 메세지를 보내는 POST통신 스크립트 작성
  • 해당 스크립트 람다에 저장

프로젝트 생성

  • 직접 람다에 스크립트를 작성해도 되지만 깃헙에 코드를 저장하고 관리하고 싶어서 프로젝트 생성
  • node.js로 스크립트 작성

생성 과정
1. 프로젝트 폴더 생성
2.npm init -y 명령어로 node 프로젝트 설정 및 package.json 생성
3. index.js 파일 생성

스크립트 작성 및 실행

  • handler라는 이름의 함수가 lambda의 endpoint
  • 메세지 전송하고 결과를 콘솔에 찍어보는 스크립트 작성
  • npm i dotenv를 설치해 nodejs에서 환경 변수 사용
  • node index.js 명령어로 파일 실행
  • node 서버로 실행할 때를 위해 handler() 함수 호출을 했지만 람다에서는 해당 호출문은 제거하고 올려야 함
import dotenv from "dotenv";
dotenv.config();

export const handler = async (event) => {
  try {
    const body = {
      content: "메세지 전송",
    };
    const messageResponse = await fetch(`${process.env.DISCORD_WEBHOOK_URL}?wait=true`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(body),
    });

    console.log("[SUCCESS]", messageResponse);

    const response = {
      statusCode: 200,
      body: JSON.stringify(result),
    };

    return response;
  } catch (error) {
    console.error("[FAIL] ", error);
    return { statusCode: 500 };
  }
};

handler();

디스코드에 전송된 메세지

람다 생성

  • aws 가입/로그인 후 lambda 생성


코드 업로드

  • 프로젝트를 압축해 .zip 생성
    -에서 업로드 클릭 > .zip 파일 클릭 후 압축한 파일 업로드
  • 그냥 사실 index.js 파일 복사해서 람다에 붙여넣기 해도 됨

환경 변수 설정

  • .env가 그냥 동작할 줄 알고 프로젝트 압축해서 넣었는데 동작 안함...
  • 메뉴에서 구성 > 환경변수 들어가서 키랑 값 입력

아래 코드 업로드를 마친 화면

테스트

  • deploy버튼을 눌러 코드를 람다에 저장
  • test버튼을 눌러, 테스트 생성 후 코드 실행을 테스트 함

테스트 정상 실행 후 람다 터미널

디스코드 결과

AWS EventBridge

설정된 스케쥴에 따라 지정된 코드를 실행시키는 이벤트

  • aws event bridge 접속 후 규칙 생성
  • 일정(schedule)로 선택하면 아래에 규칙생성으로 이동이라는 버튼이 생김

cron 표현식

  • cron 표현식으로 트리거의 스케쥴을 작성해야함 (자세한 건 검색하면 나옴)
  • 내가 원하는 건 평일 오전 8시에 메세지 전송 (이건 2편에서 결과화면으로 확인)
  • 요일을 지정하면 일은 지정해도 의미가 없기 때문에 물음표로 작성
  • 지금은 테스트하기 위해 1분 마다로 해 보았음
  • 이벤트 브릿지랑 아까 작성한 람다 함수랑 연결

결과

  • 1분마다 람다에 올려놓은 코드가 동작하는 것을 확인

마무리

다음 글은
보낸 메세지의 스레드를 만들고
스레드에 메세지를 보내는 기능을 추가할 것!

profile
프론트엔드 개발 블로그

0개의 댓글