Найти в Дзене
Хостинг Спринтхост

Создаем Discord-бота

Все шутки намерены. Все отсылки не случайны. Мы прекрасно понимаем, что всему этому есть рабочие аналоги, но наша цель не изобрести варп-двигатель, а показать, как собирать велосипед. p.s. варп-двигатель нам все-таки пригодился бы. Дискорд-боты, боты, боты... Ботов становится все больше и больше. Их создают под разные нужды ради автоматизации нудной и повторяющейся работы. В основном боты в Discord выполняют роль модератора сервера, но к ним можно прикрутить разные функции, например, по команде присылать мем дня или прогноз погоды в Шанхае. В этой статье разберем создание бота на сервере Спринтбокс. EXEC.START() Подготовительные действия на боксе такие же, как и в нашей статье про Telegram из Базы знаний. Почитайте на досуге, там расписано начало работы на сервере. Как и шо делать-то? Расскажем как заполучить своего бота. Делается это на сайте Discord на странице приложения. Если хочется найти путь самостоятельно, то вот вам небольшая путеводная подсказка: Главная discord.com → «Раз
Оглавление
Все шутки намерены. Все отсылки не случайны.
Мы прекрасно понимаем, что всему этому есть рабочие аналоги, но наша цель не изобрести варп-двигатель, а показать, как собирать велосипед.
p.s. варп-двигатель нам все-таки пригодился бы.

Вдохновлено официальным артом Discord
Вдохновлено официальным артом Discord

Дискорд-боты, боты, боты...

Ботов становится все больше и больше. Их создают под разные нужды ради автоматизации нудной и повторяющейся работы. В основном боты в Discord выполняют роль модератора сервера, но к ним можно прикрутить разные функции, например, по команде присылать мем дня или прогноз погоды в Шанхае.

В этой статье разберем создание бота на сервере Спринтбокс.

EXEC.START()

Подготовительные действия на боксе такие же, как и в нашей статье про Telegram из Базы знаний. Почитайте на досуге, там расписано начало работы на сервере.

Как и шо делать-то?

Расскажем как заполучить своего бота.

Делается это на сайте Discord на странице приложения. Если хочется найти путь самостоятельно, то вот вам небольшая путеводная подсказка: Главная discord.com → «Разработчикам» (в футере) → «Applications».

Кнопка справа сверху
Кнопка справа сверху

Далее выбираем имя нашему боту (выбирай мудро, мой юный падаван):

Everything is awesome
Everything is awesome

Наше замечательное приложение готово:

MA BOT!!1!
MA BOT!!1!

Затем вкладка «Bot» → «Add Bot» → «Yes, do it!».

А токен где?

Токен бота можно получить по кнопке «Copy».

Токен — это уникальный набор символов бота. Никому не показывайте его, иначе кто-нибудь злой и плохой получит доступ к вашему творению.
-5

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

Двигайтесь сюда, милорд

Чтобы бота можно было добавить на свой прекрасный сервер, нужно перейти на вкладку «OAuth2» и создать для него свой URL для приглашения

Тычем в бота
Тычем в бота

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

Лучше выдать только нужные для администрирования сервера права, как тут например:

Тычем в права бота
Тычем в права бота

После того, как права будут заданы, бота можно добавить на сервер.

Скопируйте ссылку и откройте её в браузере, после чего нужно будет выбрать сервер, на который добавить бота:

Я же говорил, что everything is awesome
Я же говорил, что everything is awesome

Также нужно будет проверить его привилегии:

-9

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

Скользкий тип
Скользкий тип

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

А как кодить?

Отточенным движением руки активируем виртуальное окружение и ставим нужную библиотеку:

bot@box-48639:~$ source venv/bin/activate
(venv) bot@box-48639:~$ pip install discord

Не лишним будет создать директорию для бота. Сделать это можно из-под виртуального окружения:

(venv) bot@box-48639:~$ mkdir discobot

Теперь нам нужен конфиг:

(venv) bot@box-48639:~$ vim discobot/config.py

Редактируем файл:

settings = {
'token': ‘Тут должен быть токен',
'bot': 'My Awesome Bot',
'id': тут ID приложения без(!) кавычек,
'prefix': '!'
}

Теперь немного пояснений, что же у нас находится в настройках:

token — собственно токен бота

bot — имя нашего бота

id — это application ID, где он находится можно посмотреть на скриншоте выше, сразу после создания приложения (на самом деле он может и не пригодиться при работе бота, но лучше иметь его под рукой)

Ну и код бота, традиционно создаём bot.py или же сразу редактируем его vim’ом:

(venv) bot@box-48639:~$ vim discobot/bot.py

Для начала активируем виртуальное окружение и импортируем всё, что нам нужно:

import os, sys
activate_this = '/home/bot/venv/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):
await ctx.reply('I\’M ALIVE!')

Несложно догадаться, что бот будет отправлять реплай с текстом “I’M ALIVE!” на сообщение “!status”.

До запуска бота остался всего один(два) шаг(а) — собственно, запуск бота. Добавим в код функцию запуска:

bot.run(settings['token'])

Ну и запустим его уже наконец (во имя дискорд-ботов!):

(venv) bot@box-48639:~$ python discobot/bot.py

IT’S ALIVE!

Оно живое, ЖИВОЕ!
Оно живое, ЖИВОЕ!

Полный код бота можно посмотреть тут.

Чёрная магия

Теперь призовём Linux-демона для того, чтобы тот следил, что бот работает. Ритуал призыва начинается так:

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. Нужно будет импортировать ещё пару библиотек и добавить ещё одну функцию обработки команд:

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-бот готов

Вот мы и создали бота. Его можно улучшить и подкинуть пару интересных функций. В этом вам помогут документация discord.py, их GitHub и официальная документация Discord.

Еще больше инструкций можно найти в Базе знаний Спринтбокс. Там же можно взять себе VPS/VDS под любые нужды и желания, хоть сервер Майнкрафта установить.