I'm FanJae.

[EA FC Pro club Draft Bot] 3. Discord 패키지 추가 및 봇 실행 본문

Toy Project/EA FC Pro club Draft Bot [Python]

[EA FC Pro club Draft Bot] 3. Discord 패키지 추가 및 봇 실행

FanJae 2024. 9. 1. 17:46

1. Discord 패키지 추가

pip install discord

- 위 명령으로 설치를 진행했으나 아래와 같은 오류가 발생하였다.

AttributeError : module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

- Stack overflow에서 확인한 글에 따르면, pkgutil.Implmporter 클래스가 제거되었다고 한다.

- 이에 따라 pip 수동 설치가 필요하다고 한다.

python -m ensurepip --upgrade
python -m pip install --upgrade setuptools
setuptools python -m pip install <module>

- <module>에 디스코드를 입력하여 설치해준다.


2. 기본 봇 생성

 

2-1. main.py 작성

import discord
from discord.ext import commands

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name} ({bot.user.id})')
    await bot.change_presence(status=discord.Status.online, activity=discord.Game(name="Test"))
    
bot.run('BOT_TOKEN')
Intents = discord.Intents.default()
- Intents 는 Discord API와의 상호작용을 설정한다.
- Intents.default()는 기본 설정을 사용하여 메시지 및 서버 이벤트에 접근할 수 있도록 한다.
Intents.message_content = True
- 이 옵션은 봇이 메시지를 수신하고 처리할 수 있게 한다.

bot = commands.Bot(command_prefix='!', intents=intents)
- 봇의 인스턴스를 생성한다.
- command_prefix='!'는 봇이 명령어를 인식할때 사용하는 접두사이다.
- intents를 봇에 적용해준다.

@bot.event
- Discord 이벤트 처리를 하는 함수를 정의한다.
- on_ready는 봇이 준비가 완료되었을때 호출되는 이벤트 핸들러이다.
- 봇이 Discord 서버에 성공적으로 연결되면 이 함수가 실행된다.

await bot.change_presence(status=discord.Status.online, activity=discord.Game(name="Test"))
- 봇의 상태를 온라인으로 설정한다.
- 현재 활동을 'Test'로 설정한다. Discord 사용자들이 봇의 현재 상태를 볼 수 있도록 해준다.

bot.run('BOT_TOKEN')
- 봇을 실행하는 명령어

- Discord API와 연결하여 봇이 이벤트를 수신하고 처리할 수 있도록 한다.
- 'BOT_TOKEN'은 Discord 개발자 포털에서 생성한 토큰값을 입력해야한다.

※ 봇 토큰을 소스코드에 기입해서는 안된다. 따라서, .env 파일 등에 저장하여 처리한다.

※ 이전, 관리했던 봇은 토큰이.. 소스코드에 있었다. (내가 작성한 코드는 아녔지만... 위험한 코드다.) 

 

2-2. Python .env 파일 작성 (Token값 분리)

※ 일반적으로, API KEY, ACCESS KEY 같은 중요 파일은 소스코드에 직접적으로 넣지 않는다.

 

2-2-1. .env 파일 작성

- .env 파일로 분리하여 이를 코드에서 불러오는 방법으로 처리하고자 한다.

# .env
BOT_TOKEN=MY_TOKEN

- 실제 MY_TOKEN에는 자신의 토큰 값을 넣어주면 된다.

※ env 파일은 띄어쓰기 없이 입력을 해야한다.

※ Git 업로드를 해야 하는 경우 파일을 업로드 하면 안되므로, .gitignore에 .env 파일을 추가해준다.

 

2-2-2. 패키지 설치

python -m pip install python-dotenv

※ 본인의 경우, 파이썬 버전이 여러 개 설치되어 있어서, pip install python-dotenv로 했을때는 작동하지 않았다.

 

2-2-3. .env 코드 예제

# .env
TEST_KEY=TEST
from dotenv import load_dotenv
import os

# load .env
load_dotenv()

TEST_KEY = os.environ.get('TEST_KEY')
print(TEST_KEY)

 

2-2-4. 코드 결합 (최종 main.py)

import discord
from discord.ext import commands
from dotenv import load_dotenv
import os

load_dotenv() #.env 파일의 환경 변수 로드
BOT_TOKEN = os.environ.get('BOT_TOKEN')

intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)


@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name} ({bot.user.id})')
    await bot.change_presence(status=discord.Status.online, activity=discord.Game(name="Test"))
    
bot.run(BOT_TOKEN)

 

2-2-5. 최종 실행 결과

- 봇이 정상적으로 실행되고 있음을 확인 가능하다.

 

2-3. 오류 해결

discord.errors.PrivilegedIntentsRequired: Shard ID None is requesting privileged intents that have not been explicitly enabled in the developer portal. It is recommended to go to https://discord.com/developers/applications/ and explicitly enable the privileged intents within your application's page. If this is not possible, then consider disabling the privileged intents instead.

- 위와 같은 오류가 발생했다면, 아래 권한 설정을 Enabled 처리해야 한다.

 

Comments