디스코드 봇으로 채팅에 이미지 전송하기

2026년 1월 11일·5개 메시지

이미지를 채팅으로 보내는 방법을 정리한다. 이미지 URL로 링크만 보내는 방식, 메시지로 파일을 업로드하는 방식, 임베드(embed)에 이미지를 표시하는 방식 각각의 구현 예제와 호스팅 관련 주의사항을 다룬다.

증상

봇이 이미지를 보내려 할 때 텍스트만 전송되거나 링크가 미리보기로 뜨지 않거나, 로컬 파일 경로에서 이미지를 읽지 못해 에러가 발생할 수 있다. 임베드에 이미지가 보이지 않거나, 업로드 파일이 용량 제한 때문에 실패하는 경우도 있다.

원인

  • 이미지 주소(URL)가 HTTPS가 아니거나 직접 이미지 파일을 반환하지 않아 Discord가 가져오지 못함.
  • 이미지 URL이 인증이 필요한 리다이렉트 또는 접근 제한이 걸려 있음.
  • 로컬 파일 경로가 호스팅 환경(예: 리눅스 컨테이너)에서 존재하지 않거나 경로/대소문자 문제로 접근 실패.
  • 업로드 파일이 Discord의 파일 크기 제한을 초과함(기본 8MB, 서버 업그레이드에 따라 다름).
  • 코드에서 올바른 라이브러리 API를 사용하지 않음(버전에 따른 API 변경).

해결 방법

1단계: 가장 간단한 방법 — 이미지 URL을 사용해 임베드로 표시

이미지가 외부에 공개된 HTTPS URL로 존재하면 임베드의 image 필드에 넣으면 빠르게 미리보기를 띄울 수 있다. URL은 직접 이미지 파일을 반환해야 하고, 가능하면 확장자(.png/.jpg/.gif)나 올바른 Content-Type을 가지는지 확인한다.

예: discord.js (v14) 예제

// Node.js + discord.js v14
const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] });

client.on('messageCreate', message => {
  if (message.content === '!image') {
    const embed = new EmbedBuilder()
      .setTitle('샘플 이미지')
      .setImage('https://example.com/image.png');
    message.channel.send({ embeds: [embed] });
  }
});

client.login(process.env.TOKEN);

예: discord.py (v2) 예제

# Python + discord.py v2
from discord.ext import commands
from discord import Embed

bot = commands.Bot(command_prefix='!')

@bot.command()
async def image(ctx):
    embed = Embed(title="샘플 이미지")
    embed.set_image(url="https://example.com/image.png")
    await ctx.send(embed=embed)

bot.run(os.getenv("TOKEN"))

2단계: 로컬 파일을 업로드해서 전송하기

로컬 파일을 직접 전송하려면 실행 환경에서 파일이 접근 가능한지 확인한다. 개발 머신(macOS)에서는 경로가 동작해도, 호스팅 환경은 대소문자 구분이나 상대경로가 달라 실패할 수 있다. 배포 시 파일을 컨테이너에 포함하거나, 외부 스토리지에 업로드한 뒤 URL로 제공하는 방식을 권장한다.

discord.js (v14) 파일 업로드 예

const { AttachmentBuilder } = require('discord.js');
const file = new AttachmentBuilder('./images/pic.png');
message.channel.send({ files: [file] });

discord.py 파일 업로드 예

from discord import File
await ctx.send(file=File('images/pic.png'))

3단계: 호스팅 전략과 권장 방식

  • 파일 크기 제한 문제를 피하려면 외부 스토리지(CDN, S3, Cloudflare R2 등)에 업로드하고 공개 HTTPS 링크를 사용해 임베드로 표시한다.
  • 직접 호스팅하는 경우 정적 파일 서버가 Content-Type: image/* 를 반환하도록 설정한다.
  • 디스코드에서 이미지가 보이지 않을 때는 브라우저에서 URL을 열어 직접 접근 가능한지, 리다이렉트나 인증 요구가 없는지 확인한다.
  • 개발 환경이 macOS이면 배포 환경(Linux)와 경로/대소문자 차이를 사전에 점검한다.
  • 배포(호스팅) 플랫폼으로 디스호스트 같은 서비스를 사용하면 정적 호스팅 또는 객체 스토리지에 이미지를 올리고 그 URL을 임베드에 사용하면 안정적이다.

마무리

이미지를 전송하려면 공개 HTTPS 이미지 URL을 임베드의 image로 사용하는 방법이 가장 간단하며, 로컬 파일 전송은 호스팅 환경과 파일 크기 제한을 반드시 확인해야 한다. 디스코드 봇 개발 시에는 올바른 URL, 접근 권한, 호스팅 설정을 우선 점검하면 문제를 빠르게 해결할 수 있다.