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

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

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

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

Мы будем выполнять весь код через веб-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

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

Нам не нужно изобретать велосипед, поскольку уже есть отличная оболочка Node для API бота Discord под названием discord.js. Обычно мы устанавливаем эту стороннюю библиотеку через npm, но, поскольку мы используем Repl.it, мы можем пропустить установку. Наш Repl автоматически подтянет все зависимости.

В файл index.js по умолчанию, включенный в ваш новый Repl, добавьте следующую строку кода.

const Discord = require('discord.js');

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

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

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

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

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

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

DISCORD_BOT_SECRET=NDcUN5T32zcTjMYOM0Y1MTUy.Dk7JBw.ihrTSAO1GKHZSonqvuhtwta16WU

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

На изображении ниже мы выделили кнопку «Добавить файл», новый файл (.env) и то, как определить секретный токен для использования нашим ботом.

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

const Discord = require('discord.js'); 
const client = new Discord.Client(); 
const token = process.env.DISCORD_BOT_SECRET; 
client.on('ready', () => { 
    console.log("I'm in"); 
    console.log(client.user.username); 
}); 
client.on('message', msg => { 
    if (msg.author.id != client.user.id) { 
        msg.channel.send(msg.content.split('').reverse().join('')); 
    } 
}); 
client.login(token);

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

  • Строка 1 — это то, что было раньше. Эта строка указывает Repl.it установить стороннюю библиотеку и помещает ее в этот файл, чтобы мы могли ее использовать.
  • В строке 2 мы создаем Discord Client. Мы будем использовать этот клиент для отправки команд на сервер Discord, чтобы управлять нашим ботом и отправлять ему команды.
  • В строке 3 мы извлекаем наш секретный токен из переменных среды (которые Repl.it устанавливает из нашего файла .env).
  • В строке 5 мы определяем event для нашего клиента, который определяет, как наш бот должен реагировать на событие "готово". Бот Discord будет работать асинхронно, что может немного сбивать с толку, если вы привыкли запускать стандартный синхронный код. Мы не будем подробно вдаваться в асинхронное кодирование, но если вам интересно, что это такое и зачем оно используется, на RisingStack есть хорошее руководство. Короче говоря, вместо того, чтобы запускать код в нашем файле сверху вниз, мы будем запускать фрагменты кода в ответ на определенные события.
  • В строках 6–8 мы определяем, как наш бот должен реагировать на событие «готово», которое запускается, когда наш бот успешно подключается к серверу. Мы указываем нашему боту выводить некоторую информацию на стороне сервера (т. е. она будет отображаться в выводе нашего Repl, но не будет отправляться в виде сообщения в Discord). Мы напечатаем простое сообщение I'm in, чтобы увидеть, что бот есть, и напечатаем имя пользователя нашего бота (если вы используете несколько ботов, это облегчит определение того, кто что делает).
  • Строки 10–14 похожи, но вместо ответа на событие «готово» мы сообщаем боту, как обрабатывать новые сообщения. Строка 11 говорит, что мы хотим отвечать только на сообщения, которые не от нас (иначе наш бот будет продолжать отвечать сам себе — вы можете удалить эту строку, чтобы понять, почему это проблема), и строка 12 говорит, что мы отправим новое сообщение на тот же канал, где мы получили сообщение (msg.channel), и содержимое, которое мы отправим, будет тем же сообщением, которое мы получили, но наоборот. Чтобы перевернуть строку, мы разбиваем ее на отдельные символы, переворачиваем получившийся массив, а затем снова объединяем все это в строку.

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

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

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

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

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

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

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

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

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

var http = require('http');
http.createServer(function (req, res) { 
    res.write("I'm alive"); 
    res.end();
}).listen(8080);

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

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

const keep_alive = require('./keep_alive.js')

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

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

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

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

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

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

В следующем учебнике мы рассмотрим создание собственного базового веб-приложения с использованием Django. Этот учебник также познакомит вас с HTML, JavaScript и jQuery и поможет вам перейти к созданию собственных пользовательских веб-приложений. Вы также можете найти другие учебные пособия, подобные этому, здесь.

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