База знаний

Часто задаваемые вопросы, на которые мы уже ответили

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

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

Подготовка

Предварительные действия на боксе такие же, как и в нашей статье про 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 умеют многое, и мы можем и дальше расширять его возможности, изучая документацию.

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


Была ли эта инструкция полезной?