В этой статье мы создаем своего дискорд-бота на боксе с нуля.
Подготовка
Предварительные действия на боксе такие же, как и в нашей статье про Telegram:
Регистрация бота
Создание бота происходит в два этапа на сайте мессенджера. Сначала создаем приложение: «Разработчикам» (в футере) → «Applications», нажимаем кнопку «New Application» в правой верхней части страницы:

Выбираем имя приложения (выбирайте мудро, хоть его и можно изменить позже):

Готово. Здесь можно переименовать приложение, дать описание, загрузить аватарку:

Теперь добавим к нему бота. В меню слева вкладка «Bot» → «Add Bot» → «Yes, do it!».
Токен бота можно получить по кнопке Copy:

Если вдруг токен попал не только в ваши руки, его всегда можно заменить кнопкой Regenerate.
Добавление бота на сервер
Переходим на вкладку «OAuth2» и создаем для него свой URL для приглашения:

Чуть ниже выбираем права для бота. Если это бот для администрирования сервера, то можно, конечно, выбрать «Administrator», но нужно быть осторожными с этим.
Выдаем права, действительно нужные боту для администрирования сервера:

Теперь бота можно добавить на сервер. Копируем ссылку и открываем её в браузере. В диалоговом окне выбираем сервер:

Проверяем его привилегии:

Всё, бот на сервере:

Код бота
Активируем виртуальное окружение и ставим нужную библиотеку:
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:

Код бота целиком:
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
Результатом будет рандомный мем:

Готово! Боты в Discord умеют многое, и мы можем и дальше расширять его возможности, изучая документацию.