hayou
dev8min read0

디스코드 노티 봇 만들기

디스코드 노티 봇 만들기

0. 들어가며

아마 대다수의 개발자분들은 알림을 받고 싶을 때 디스코드/슬랙 등의 웹훅 기능을 이용할 것이다.

나 또한 개인적으로는 깃헙과 연동한 웹훅의 기능들을 애용해왔는데, 웹훅을 지원하지 않는 환경에서도 노티 메시지를 받고 싶었다.

그래서 nods.js에서 특정 API를 요청하고, 응답 성공시 디스코드 봇 API를 이용해 노티를 주는 간단한 봇을 만들어보았다.

해당 글은 24.08.11 기준으로 작성되었습니다. 이후 홈페이지 구조 등의 변경이 있을 수 있습니다.


1. 디스코드 애플리케이션 생성하기

우선 디스코드 개발자 홈페이지에 접속해 봇을 만들어보자.

  1. 디스코드 개발자 홈페이지(https://discord.com/developers/applications) 접속

이때 로그인이 안되어있다면, 디스코드 로그인 페이지(https://discord.com/login)에 들어가 로그인 먼저 해주자!

dev 페이지에서는 로그인 방법을 못찾았...

  1. 어플리케이션 만들기

접속한 뒤, 오른쪽 상단의 New Application 버튼을 클릭해 어플리케이션을 만들어준다.

이후 Genral Information으로 Redirect 될 것이다.

APP ICON, NAME 등은 본인이 원하는대로!

어딘가에 저장해놓고 싶게 생긴 APPLICATION ID와 PUBLIC KEY가 있는데, 당장 Copy 안해도 사라지지 않을 뿐더러 내가 만들 노티봇에는 필요 없는 정보이다. 가볍게 무시해주자.

2. 디스코드 봇 생성하기

1번에서 생성한 애플리케이션 안에 봇을 생성해주어야 한다.

LNB(좌측 메뉴바)에 있는 Bot 메뉴를 클릭해 봇을 생성해보자.

  1. 봇 토큰 발급하기

수상하게 생긴 Reset Token 버튼을 누르면 토큰이 발급되고, 해당 토큰으로 이 봇에 접근할 수 있게 된다.

만들어진 토큰값은 Copy 해서 어딘가에 잘 저장해두자. 다시 안보여준다.

Token 값을 까먹으면 리셋해줘야하니 번거롭지 않도록 잘 관리해주자.

  1. 봇 설정

내가 사용할 기능은 오직 Message 뿐이므로, Privileged Gateway Intents에서 MESSAGE CONTENT INTENT를 On 해주자.

  1. 봇 초대하기

디스코드에서 할 일은 거의 다 끝나간다. 이제 만들어진 봇을 추가해보자.

LNB에서 OAuth2에 들어가보자.

하단에 OAuth2 URL Generator가 있는데, 여기서 Scope에 bot을 체크하고 Permissions에서 Send Messages를 체크해주자.

이후 하단에 URL이 생성되는데 해당 URL을 Copy해 주소창에 넣고 접속해보자.

해당 URL 접근시

이런 페이지가 뜨는데, 서버 관리 권한이 있는 서버에 추가해주면 된다.

3. NodeJS로 API 요청 보내기

이제 디스코드에서 설정할 내용은 더이상 없다.

코드단으로 가보자.

우선 discord.js(필수)와 env 파일을 관리하기 위한 dotenv(옵션) 라이브러리를 설치해주자.

$ npm i discord.js dotenv

이후 디스코드 메시지를 요청하는 간단한 코드를 작성해보았다.

const { Client, GatewayIntentBits } = require("discord.js");
const dotenv = require("dotenv");

dotenv.config();

// Discord 클라이언트 설정
const client = new Client({ intents: [GatewayIntentBits.MessageContent] });

// Discord 메시지 전송 함수
async function sendDiscordMessage(messageContent) {
  const channelId = process.env.CHANNEL_ID; // .env 파일에서 채널 ID를 가져옴

  try {
    // 채널 가져오기
    const channel = await client.channels.fetch(channelId);

    // 채널이 존재할 경우 메시지 전송
    if (channel) {
      await channel.send(messageContent);
      console.log("Message sent to Discord channel.");
    } else {
      console.error("Channel not found");
    }
  } catch (error) {
    console.error("Failed to send message to Discord:", error);
  }
}

// Discord 봇 로그인 및 메시지 전송 테스트
client.once("ready", () => {
  console.log(`Logged in as ${client.user.tag}!`);

  // 임의의 메시지 전송
  sendDiscordMessage("Hello, this is a test message!");
});

// Discord 봇 로그인
client.login(process.env.TOKEN);

.env 파일엔 다음 두 가지 값을 저장해주었다.

TOKEN=아까_저장해둔_Bot_Token_값
CHANNEL_ID=채널_ID

아래는 각 코드에 대한 간단한 설명이다.

  1. Discord 클라이언트 설정

우선, discord.js가 지원하는 Client 객체의 인스턴스를 생성해주자.

이때, intents의 value로 [GatewayIntentBits.MessageContent]를 넣어주자. (앞서 디스코드 Bot 페이지에서 건드린 Privileged Gateway Intents 항목들을 넣어주면 된다)

// Discord 클라이언트 설정
const client = new Client({ intents: [GatewayIntentBits.MessageContent] });
  1. Discord 로그인 및 클라이언트 상태 확인

client.login 메서드를 통해 로그인을 진행해준다.

이후 client.once 메서드를 통해 'ready' 상태인지 확인하고, 콜백 함수를 이용해 이후 로직을 시행하면 된다.

(웹소켓 통신은 역시 뭔가 좀 귀찮다)

// Discord 봇 로그인 및 메시지 전송 테스트
client.once("ready", () => {
  console.log(`Logged in as ${client.user.tag}!`);

  // 임의의 메시지 전송
  sendDiscordMessage("Hello, this is a test message!");
});

// Discord 봇 로그인
client.login(process.env.TOKEN);

3.Discord 메시지 전송

메시지를 보낼 채널을 가져온 뒤, 해당 채널에 send 요청을 보내면 끝!

// Discord 메시지 전송 함수
async function sendDiscordMessage(messageContent) {
  const channelId = process.env.CHANNEL_ID; // .env 파일에서 채널 ID를 가져옴

  try {
    // 채널 가져오기
    const channel = await client.channels.fetch(channelId);

    // 채널이 존재할 경우 메시지 전송
    if (channel) {
      await channel.send(messageContent);
      console.log("Message sent to Discord channel.");
    } else {
      console.error("Channel not found");
    }
  } catch (error) {
    console.error("Failed to send message to Discord:", error);
  }
}

4. 마치며

지금까지 디스코드 봇을 만들어 API 연동까지 해보았다.

생각보다 잘 안돼서 시간이 조금 걸렸고, 과거의 게시글들과는 디스코드 홈페이지가 조금 바뀐듯하여 약간의 애를 먹기도 했었다.

하지만 이제 한시간씩 백그라운드에서 돌아가는 자동화 스크립트 중간중간 완료 노티를 받을 수 있게되어 (그리고 그 내용을 공유할 수 있어) 업무간의 스트레스를 줄일 수 있게 되었다.

음.. 디스코드 짱!

share

comments

loading…