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

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

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

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

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

В этом уроке мы рассмотрим: * Создание приложения и пользователя-бота в вашей учетной записи Discord * Создание сервера в Discord * Добавление нашего бота на наш сервер Discord

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

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

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

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

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

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

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

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

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

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

Создание Дискорд-сервера

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

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

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

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

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

https://discordapp.com/api/oauth2/authorize?scope=bot&client_id=746269162917331028

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

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

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

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

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

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

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

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

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

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

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

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

DISCORD_BOT_SECRET=NDcUN5T32zcTjMYOM0Y1MTUy.Dk7JBw.ihrTSAO1GKHZSonqvuhtwta16WU

Вам потребуется: * Заменить токен (после знака =) на токен, который Discord дал вам при создании собственного бота. * Будьте осторожны с интервалами. В отличие от Python, если вы поместите пробел по обе стороны от = в файле .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 мы создаем Discord Client. Это объект Python, который мы будем использовать для отправки различных команд на серверы Discord.
  • В строке 6 мы говорим, что определяем event для нашего клиента. Эта строка является декоратором Python, который возьмет функцию непосредственно под ней и каким-то образом изменит ее. Бот Discord будет работать асинхронно, что может немного сбивать с толку, если вы привыкли работать со стандартным Python. Мы не будем подробно вдаваться в асинхронный Python, но если вам интересно, что это такое и почему он используется, на FreeCodeCamp есть хорошее руководство. Короче говоря, вместо того, чтобы запускать код в нашем файле сверху вниз, мы будем запускать фрагменты кода в ответ на определенные события.
  • В строках 7–9 мы определяем, на какое событие мы хотим реагировать и каким должен быть ответ. В этом случае мы говорим, что в ответ на событие on_ready (когда наш бот успешно подключается к серверу) мы должны вывести некоторую информацию на стороне сервера (т. е. она будет отображаться в выводе нашего Repl, но не будет отправлена ​​в виде сообщения). через Дискорд). Мы напечатаем простое сообщение I'm in, чтобы увидеть, что бот существует, и напечатаем идентификатор пользователя нашего бота (если вы используете несколько ботов, это облегчит определение того, кто что делает).
  • Строки 11–14 похожи, но вместо ответа на событие on_ready мы сообщаем боту, как обрабатывать новые сообщения. Строка 13 говорит, что мы хотим отвечать только на сообщения, которые не от нас (иначе наш бот будет продолжать отвечать сам себе — вы можете удалить эту строку, чтобы понять, почему это проблема), и строка 14 говорит, что мы отправим новое сообщение на тот же канал, где мы получили сообщение (message.channel), и содержимое, которое мы отправим, будет тем же сообщением, которое мы получили, но наоборот (message.content[::-1] - ::-1 - это немного странная, но полезная идиома Python для обращения строки или списка).

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

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

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

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

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

Сохранение жизни нашего бота

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

Repl.it будет поддерживать работу вашего кода после закрытия вкладки браузера, только если вы используете веб-сервер. Поскольку мы используем библиотеку Python discord.py, нашему боту не требуется явный веб-сервер, но мы можем создать сервер и запустить его в отдельном потоке, просто чтобы поддерживать работу нашего Repl. Сделаем это с помощью фреймворка 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 = os.environ.get("DISCORD_BOT_SECRET"):

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

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

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

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

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

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

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

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

Первоначально опубликовано на https://ritza.co.