Искать в Базе знаний

Создание discord‑бота на Python

В этой статье мы создаем своего дискорд-бота на боксе с нуля. 

Подготовка

Предварительные действия на боксе такие же, как и в нашей статье про Telegram:

Регистрация бота

Создание бота происходит в два этапа на сайте мессенджера. Сначала создаем приложение: «Разработчикам» (в футере) → «Applications», нажимаем кнопку «New Application» в правой верхней части страницы:
content-image
Выбираем имя приложения (выбирайте мудро, хоть его и можно изменить позже):
content-image
Готово. Здесь можно переименовать приложение, дать описание, загрузить аватарку:
content-image
Теперь добавим к нему бота. В меню слева вкладка «Bot» → «Add Bot» → «Yes, do it!».
Токен бота можно получить по кнопке Copy:
content-image
Если вдруг токен попал не только в ваши руки, его всегда можно заменить кнопкой Regenerate.

Добавление бота на сервер

Переходим на вкладку «OAuth2» и создаем для него свой URL для приглашения:
content-image
Чуть ниже выбираем права для бота. Если это бот для администрирования сервера, то можно, конечно, выбрать «Administrator», но нужно быть осторожными с этим.
Выдаем права, действительно нужные боту для администрирования сервера:
content-image
Теперь бота можно добавить на сервер. Копируем ссылку и открываем её в браузере. В диалоговом окне выбираем сервер:
content-image
Проверяем его привилегии:
content-image
Всё, бот на сервере:
content-image

Код бота

Активируем виртуальное окружение и ставим нужную библиотеку:
bot@box-48639:~$ source python/bin/activate
(python) bot@box-48639:~$ pip install discord
Добавляем директорию для бота, не выходя виртуального окружения:
(python) bot@box-48639:~$ mkdir discobot
Создаем конфиг бота:
(python) bot@box-48639:~$ vim discobot/config.py
Наполняем его содержимым:
settings = {
    'token': 'ODQ2MzkxFDQ2OTI5Dzc2Njc1.YKu1Fg.OqAK4hPGz6NzXaF6lsXWYRssstk',
    'bot': 'My Awesome Bot',
    'id': 849291049223776275,
    'prefix': '!'
}
Что здесь что:
  • token — токен бота
  • bot — имя бота
  • id — application ID: он находится под описанием приложения, в разделе «General Information»
  • prefix — если сообщение на сервере начинается с этого символа, бот воспримет его как свою команду.
Дальше код бота. Создаем bot.py и сразу редактируем его vim’ом:
(python) bot@box-48639:~$ vim discobot/bot.py
Первыми строками активируем виртуальное окружение и импортируем нужные модули:
import os, sys
activate_this = '/home/bot/python/bin/activate_this.py'
with open(activate_this) as f:
    exec(f.read(), {'__file__': activate_this})

import discord
from discord.ext import commands
from config import settings
Обозначаем боту, с какого символа начинаются его команды:
bot = commands.Bot(command_prefix=settings['prefix'])
И создаем первую команду — бот будет отправлять реплай с текстом “I’M ALIVE!” на сообщение “!status”:
@bot.command()
async def status(ctx):
    await ctx.reply('I\’M ALIVE!')
Добавляем в код функцию запуска:
bot.run(settings['token'])
Закрываем редактор и запускаем бота:
(python) bot@box-48639:~$ python discobot/bot.py
Отправим сообщение в Discord:
content-image
Код бота целиком:
import os, sys
activate_this = '/home/bot/python/bin/activate_this.py'
with open(activate_this) as f:
    exec(f.read(), {'__file__': activate_this})

import discord
from discord.ext import commands
from config import settings

bot = commands.Bot(command_prefix=settings['prefix'])

@bot.command()
async def status(ctx):
    author = ctx.message.author
    await ctx.reply('I\'M ALIVE!')

bot.run(settings['token'])

Запуск бота

Создаем Linux-демона — он будет следить, что бот работает. Открываем файл (mlg, если нужно, меняем на своё имя сервиса):
root@box-48639:~# vim /etc/systemd/system/mlg.service
Добавляем в него строки:
[Unit]
Description=Noscope Bot
After=syslog.target
After=network.target

[Service]
Type=simple
User=bot
WorkingDirectory=/home/bot/discobot
ExecStart=/usr/bin/python3 /home/bot/discobot/bot.py
Restart=always

[Install]
WantedBy=multi-user.target
И запускаем демона:
root@box-48639:~# systemctl daemon-reload
root@box-48639:~# systemctl enable mlg
root@box-48639:~# systemctl start mlg
Проверить, что всё работает, можно так:
root@box-48639:~# systemctl status mlg
● mlg.service - Noscope Bot
     Loaded: loaded (/etc/systemd/system/mlg.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-05-05 16:34:46 MSK; 7s ago
   Main PID: 307021 (python3)
      Tasks: 3 (limit: 2344)
     Memory: 21.4M
     CGroup: /system.slice/mlg.service
            └─307021 /usr/bin/python3 /home/bot/discobot/bot.py

Дополнение кода бота

Бот улучшается в два этапа:
  • добавляем код в файл бота
  • перезапускаем бота
Для примера добавим в бота какое-нибудь рандомное API. Открываем файл бота:
bot@box-48639:~$ vim ~/discobot/bot.py
И добавляем в него пару библиотек и ещё одну функцию обработки команд:
import json
import requests

@bot.command()
async def meme(ctx):
    response = requests.get('https://some-random-api.ml/meme')
    json_data = response.json()
    embed = discord.Embed(title=json_data['caption'])
    embed.set_image(url=json_data['image'])
    await ctx.send(embed=embed)
Закрываем файл и перезапускаем демона, чтобы изменения вступили в силу:
root@box-48639:~# systemctl restart mlg
Результатом будет рандомный мем:
content-image
Готово! Боты в Discord умеют многое, и мы можем и дальше расширять его возможности, изучая документацию.

Полезные ссылки

2005–2025 ООО «СПРИНТХОСТ.РУ»
Входит в Реестр аккредитованных ИТ-компаний
и Реестр провайдеров хостинга
Лицензия №162552