Рубрики
Без рубрики

Создание бота Discord с помощью Python и Reply.it

Узнайте, как создать своего собственного бота Discord с помощью Python и Reply.it. Мы пройдем все шаги, необходимые для настройки вашего бота на Discord, а затем закодируем его с помощью Python, все в облаке.

Автор оригинала: Gareth Dwyer.

Примечание: этот учебник представляет собой отрывок из Код с Reply.it: Проекты на Python для начинающих , книга и набор учебных пособий для начинающих, чтобы получить практический опыт программирования на Python.

В этом уроке мы будем использовать Repl.it и Python для создания чат-бота Discord. Если вы читаете этот учебник, вы, вероятно, по крайней мере слышали о Discord и, вероятно, имеете существующую учетную запись. Если нет, Discord-это приложение для VoIP и чата, которое предназначено для замены Skype для геймеров. Бот, которого мы создадим в этом уроке, сможет присоединиться к серверу Discord и отвечать на сообщения, отправленные людьми.

Если вы предпочитаете JavaScript, вы можете найти перевод этого руководства с использованием NodeJS вместо Python.

Вам будет легче следить за этим, если у вас есть некоторые знания Python и вы уже использовали Discord или подобное приложение, такое как Skype или Telegram. Мы не будем рассматривать самые основы Python, но мы подробно объясним каждую строку кода, поэтому, если у вас есть какой-либо опыт программирования, вы должны быть в состоянии следовать этому.

Обзор и требования

Мы будем делать все наше кодирование через Repl.it веб-IDE и хостинг нашего бота с Repl.it кроме того, вам не нужно будет устанавливать какое-либо дополнительное программное обеспечение на свой компьютер. Для этого урока вам нужно будет создать учетную запись Discord (если она у вас уже есть, вы можете пропустить это). Инструкции о том, как это сделать, приведены в следующем разделе.

В этом уроке мы рассмотрим:

  • Создание приложения и пользователя бота в вашей учетной записи Discord
  • Создание сервера на Discord
  • Добавление нашего бота на наш сервер Discord

Давайте сначала пройдем через эти шаги администратора, а затем перейдем к самой интересной части кодирования нашего бота.

Создание бота в Discord и получение токена

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

Как только у вас появится учетная запись, вы захотите создать приложение Discord. Посетите страницу разработчика Discord и нажмите кнопку “Новое приложение”, как показано на рисунке ниже.

**Изображение: 1** *Создание нового приложения Discord*

Заполните имя своего бота и выберите “Создать”.

Первое, что нужно сделать на следующей странице, – это отметить свой идентификатор клиента, который вам понадобится для добавления бота на сервер. Вы можете вернуться позже и получить его с этой страницы или скопировать его куда-нибудь, где вы можете легко найти его позже.

**Изображение: 2** *Запишите свой идентификатор клиента*

Вы также можете переименовать приложение и предоставить описание своего бота в этот момент и нажать “Сохранить изменения”.

Теперь вы создали приложение Discord. Следующим шагом является добавление бота в это приложение, поэтому перейдите на вкладку “Бот” с помощью меню слева и нажмите кнопку “Добавить бота”, как указано ниже. Нажмите “Да, сделайте это”, когда Discord спросит, уверены ли вы в том, чтобы оживить нового бота.

****Изображение: 3** *Добавление бота в наше приложение Discord*

Последнее, что нам понадобится от нашего бота, – это Токен. Любой, у кого есть токен бота, может доказать, что он принадлежит ему, поэтому вам нужно быть осторожным, чтобы не поделиться этим с кем-либо. Вы можете получить токен, нажав “Нажмите, чтобы открыть токен”, или скопировать его в буфер обмена, не видя его, нажав “Копировать”.

**Изображение: 4** *Генерация токена для нашего бота Discord*

Обратите внимание на свой токен или скопируйте его в буфер обмена, так как в ближайшее время нам нужно будет добавить его в наш код.

Создание сервера Раздора

Если у вас нет сервера Discord для добавления бота, вы можете создать его, либо открыв приложение Discord для рабочего стола, которое вы загрузили ранее, либо вернувшись на домашнюю страницу Discord в вашем браузере. Нажмите значок”+”, обозначенный восклицательным знаком, как показано ниже, чтобы создать сервер.

**Изображение: 5** *Создание сервера Discord*

Нажмите “Создать сервер” на следующем экране, а затем укажите имя сервера. Как только сервер будет запущен и запущен, вы сможете пообщаться с самим собой или пригласить друзей пообщаться с вами. Скоро мы также пригласим нашего бота пообщаться с нами.

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

Наш бот Discord на данном этапе все еще является просто оболочкой, поскольку мы не написали никакого кода, чтобы позволить ему что-либо делать, но давайте все равно добавим его на наш сервер Discord. Чтобы добавить немного на ваш сервер, вам понадобится идентификатор клиента со страницы “Общая информация”, которую мы рассматривали ранее, когда создавали наше приложение Replbot (т. Е. идентификатор клиента, а не секретный токен бота).

Создайте URL-адрес, который выглядит следующим образом, но в конце используйте свой идентификатор клиента вместо моего:

Создайте URL-адрес, который выглядит следующим образом, но в конце используйте свой идентификатор клиента вместо моего:

Перейдите по URL-адресу, созданному в вашем веб-браузере, и вы увидите страницу, похожую на следующую, где вы можете выбрать, на какой сервер добавить своего бота.

**Изображение: 6** *Авторизация нашего бота для подключения к нашему серверу*

Выберите сервер, который мы создали на предыдущем шаге, и нажмите кнопку “авторизовать”. После завершения капчи вы должны получить уведомление о разногласиях в приложении, сообщающее вам, что ваш бот присоединился к вашему серверу.

Теперь мы можем перейти к самой веселой части создания мозга для нашего бота!

Создание Repl и установка наших зависимостей Discord

Первое, что нам нужно сделать, это создать Python Repl для написания кода для нашего бота Discord. По адресу repl.it , создайте новый ответ, выбрав в качестве языка “Python”.

Нам не нужно изобретать велосипед, так как на GitHub уже есть отличная оболочка Python для API Discord bot , что значительно ускоряет настройку базового бота discord на Python. Чтобы использовать библиотеку, мы можем просто написать import discord в верхней части main.py . Reply.it будет обрабатывать установку этой зависимости при нажатии кнопки “выполнить”.

Наш бот почти готов к работе, но нам все еще нужно подключить ваш секретный токен. Это позволит вашему коду управлять нашим ботом.

Настройка авторизации для нашего бота

По умолчанию, Repl.it код является общедоступным. Это здорово, поскольку это поощряет сотрудничество и обучение, но мы должны быть осторожны, чтобы не делиться нашим секретным токеном бота (который дает любому, кто имеет к нему доступ, полный контроль над нашим ботом).

Чтобы обойти проблему необходимости предоставления нашему коду доступа к токену, позволяя другим получить доступ к нашему коду, но не нашему токену, мы будем использовать переменные среды . На обычной машине мы бы установили их непосредственно в нашей операционной системе, но с помощью Repl.it у нас нет к этому доступа. Reply.it позволяет нам устанавливать секретные переменные среды через специальный файл .env .

Во-первых, нам нужно создать новый файл с точным именем .env . Выберите “Добавить файл” на левой панели, как показано на рисунке ниже, и назовите этот файл .env . Важно не упускать из виду . в самом начале.

**Изображение: 7** *Создайте новый файл с именем .env*

Откройте этот новый файл и добавьте переменную для определения секретного токена вашего бота (обратите внимание, что это второй токен, который мы получили при настройке бота-отличается от идентификатора клиента, который мы использовали для добавления нашего бота на наш сервер). Это должно выглядеть примерно так:

DISCORD_BOT_SECRET=NDcUN5T32zcTjMYOM0Y1MTUy.Dk7JBw.ihrTSAO1GKHZSonqvuhtwta16WU

Вам нужно будет:

  • Замените токен (после знака = ) на токен, который Discord дал вам при создании собственного бота.
  • Будьте осторожны с интервалом . В отличие от Python, если вы поставите пробел по обе стороны от = в файле .env , эти пробелы будут частью имени переменной или значения, поэтому убедитесь, что у вас нет пробелов вокруг = или в конце строки.
  • Запустите код еще раз. Иногда вам нужно обновить всю страницу, чтобы убедиться, что переменные среды успешно загружены.
**Изображение: 8** *Создание нашего файла .env*

Давайте создадим бота Discord, который повторяет все, что мы говорим, но в обратном порядке. Мы можем сделать это всего за несколько строк кода. В вашем main.py файл, добавьте следующее:

import discord
import os

client = discord.Client()

@client.event
async def on_ready():
    print("I'm in")
    print(client.user)

@client.event
async def on_message(message):
    if message.author != client.user:
        await message.channel.send(message.content[::-1])

token = os.environ.get("DISCORD_BOT_SECRET")
client.run(token)

Давайте разорвем это на части строка за строкой, чтобы посмотреть, что он делает.

  • Строки 1-2 импортируйте библиотеку discord, которую мы установили ранее, и встроенную библиотеку операционной системы, которая нам понадобится для доступа к секретному токену нашего бота.
  • В строке 4 мы создаем Диссонанс Клиент . Это объект Python, который мы будем использовать для отправки различных команд на серверы Discord.
  • В строке 6 мы говорим , что определяем событие для нашего клиента. Эта строка является декоратором Python, который возьмет функцию непосредственно под ней и каким-то образом изменит ее. Бот Discord будет работать асинхронно , что может немного сбить с толку, если вы привыкли работать со стандартным Python. Мы не будем углубляться в асинхронный Python здесь, но если вам интересно, что это такое и почему оно используется, есть хорошее руководство по адресу freeCodeCamp . Короче говоря, вместо того, чтобы запускать код в нашем файле сверху вниз, мы будем запускать фрагменты кода в ответ на определенные события.
  • В строках 7-9 мы определяем, на какое событие мы хотим ответить и каким должен быть ответ. В этом случае мы говорим, что в ответ на событие on_ready (когда наш бот успешно присоединяется к серверу) мы должны вывести некоторую информацию на стороне сервера (т. Е. Это будет отображаться в выводе нашего Repl, но не отправлено в виде сообщения через Discord). Мы напечатаем простой Я нахожусь в сообщении, чтобы увидеть, что бот там, и распечатать идентификатор пользователя нашего бота (если вы используете несколько ботов, это облегчит работу с тем, кто что делает).
  • Строки 11-14 похожи, но вместо ответа на событие on_ready мы сообщаем нашему боту, как обрабатывать новые сообщения. Строка 13 говорит, что мы хотим отвечать только на сообщения, которые не от нас (в противном случае наш бот будет продолжать отвечать сам себе-вы можете удалить эту строку, чтобы понять, почему это проблема), и строка 14 говорит, что мы отправим новое сообщение на тот же канал, где мы получили сообщение ( message.channel ), и содержимое, которое мы отправим, будет тем же сообщением, которое мы получили, но в обратном направлении ( message.content[::-1]::-1 это немного странная, но полезная идиома Python для изменения строки или списка).

Последние две строки получают наш секретный токен из переменных среды, которые мы настроили ранее, а затем сообщают вашему боту о запуске.

Нажмите большую зеленую кнопку “Выполнить” еще раз, и вы увидите, что ваш бот сообщает об успешном присоединении к каналу в выводе Repl.

**Изображение: 9** *Видя, как наш бот присоединяется к нашему серверу*

Откройте Discord и на сервере, который мы создали ранее, выберите приложение ReplBotApplication на панели в правой части экрана.

.

****Изображение:10** *Бот ответа активен*

Как только вы выберете это, вы сможете отправить сообщение (введя его в поле, выделенное ниже) и увидеть, как ваш бот ответит!

.

**Изображение:11** *Отправьте сообщение своему боту*

Бот отвечает каждый раз, меняя текст, который мы вводим.

.

**Изображение:12** *Наш бот может говорить!*

Поддержание жизни нашего бота

Теперь ваш бот может отвечать на сообщения, но только до тех пор, пока ваш Repl работает. Если вы закроете вкладку браузера или выключите компьютер, ваш бот остановится и больше не будет отвечать на сообщения о разногласиях.

Reply.it ваш код будет работать после закрытия вкладки браузера только в том случае, если вы используете веб-сервер. Потому что мы используем Python discord.py библиотека, наш бот не требует явного веб-сервера, но мы можем создать сервер и запустить его в отдельном потоке, просто чтобы сохранить наш Репл живым. Мы сделаем это с помощью фреймворка Flask .

Создайте новый файл в своем проекте под названием keep_alive.py и добавьте следующий код:

from flask import Flask
from threading import Thread

app = Flask('')

@app.route('/')
def home():
    return "I'm alive"

def run():
  app.run(host='0.0.0.0',port=8080)

def keep_alive():
    t = Thread(target=run)
    t.start()

Мы не будем подробно останавливаться на этом, поскольку это не является центральным для нашего бота, но здесь мы запускаем веб-сервер, который вернет “Я жив”, если кто-нибудь его посетит, и мы предоставим метод для запуска этого в новом потоке (оставив основной поток для нашего бота Repl).

В нашем main.py файл, нам нужно добавить импорт для этого сервера в верхней части. Добавьте следующую строку в верхней части main.py .

from keep_alive import keep_alive

В main.py нам нужно запустить веб – сервер непосредственно перед запуском загрузки. Добавьте эти три строки в main.py , непосредственно перед строкой с token.environ.get("DISCORD_BOT_SECRET") :

keep_alive()
token = os.environ.get("DISCORD_BOT_SECRET")
client.run(token)

Сделав это и снова нажав зеленую кнопку “Выполнить”, вы увидите некоторые изменения в своем ответе. Во-первых, вы увидите новую панель в правом верхнем углу, которая показывает веб-вывод с вашего сервера. Мы видим, что посещение вашего ответа теперь возвращает базовую веб-страницу, показывающую строку “Я жив”, которую мы сказали нашему веб-серверу вернуть по умолчанию. В нижней правой панели вы также можете увидеть некоторые дополнительные выходные данные от запуска и непрерывной работы Flask, прослушивания запросов.

**Изображение:13** *Вывод с нашего сервера колб*

Теперь ваш бот будет оставаться живым даже после закрытия браузера или выключения машины разработки. Repl все равно очистит ваш сервер и убьет вашего бота примерно через час бездействия, поэтому, если вы некоторое время не используете своего бота, вам придется войти в Repl и снова запустить бота. Кроме того, вы можете настроить сторонний (бесплатный!) сервис, например Uptime Robot . Робот Uptime пингует ваш сайт каждые 5 минут, чтобы убедиться, что он все еще работает-обычно, чтобы уведомить вас о неожиданном времени простоя, но в этом случае постоянные пинги имеют побочный эффект сохранения нашего Репла, поскольку он никогда не будет работать больше часа без какой-либо активности.

Разветвление и расширение нашего базового бота

Это не очень полезное и то, и другое, но сейчас возможности ограничены только вашим творчеством! Вы можете заставить своего бота получать ввод от пользователя, обрабатывать ввод и отвечать любым выбранным вами способом. На самом деле, с базовым вводом и выводом, которые мы продемонстрировали, у нас есть большинство компонентов любого современного компьютера, все из которых основаны на архитектуре фон Неймана (мы могли бы легко добавить недостающую память, если бы наш бот записал в файл или с немного большим усилием связался с базой данных SQLite для постоянного хранения).

Если вы следовали этому учебнику, у вас будет свой собственный базовый бот для ответа, с которым можно поиграть и расширить. Если вы просто читали, вы можете легко раскошелиться на этого бота по адресу https://repl.it/@GarethDwyer1/discord-bot и расширьте его так, как вы хотите (вам нужно будет добавить свой собственный токен и воссоздать файл .env по-прежнему). Счастливого взлома!

Если вы застряли в поисках идей, почему бы не связать свой дискорд с API Twitch , чтобы получать уведомления, когда ваши любимые стримеры находятся в Сети, или создать текстовое приключение .

В следующем уроке мы снова построим точно такую же лодку , но с использованием NodeJS вместо Python. Даже если вы предпочитаете Python, часто бывает хорошей идеей создать один и тот же проект на двух языках, чтобы вы могли лучше оценить различия и сходства.