Создание бота Discord с использованием Discord.js
Опубликовано: 2022-03-10Платформы для командного общения становятся популярными день ото дня, так как все больше и больше людей работают из дома. Slack и Discord — две самые популярные платформы для командного общения. Хотя Discord ориентирован на геймеров, некоторые функции, такие как возможность добавления до 50 участников в комнату голосовых вызовов, делают его отличной альтернативой Slack. Одним из наиболее существенных преимуществ использования такой платформы является то, что многие задачи можно автоматизировать с помощью ботов.
В этой статье мы создадим бота с нуля , используя JavaScript и с помощью Discord.js. Мы рассмотрим процесс от создания бота до его развертывания в облаке. Прежде чем создавать нашего бота, давайте набросаем функции, которые он будет иметь:
- Делитесь случайными шутками из множества шуток.
- Добавляйте и удаляйте роли пользователей, выбирая эмодзи.
- Делитесь твитами с определенной учетной записи на определенный канал.
Поскольку модуль Discord.js основан на Node.js, я предполагаю, что вы немного знакомы с Node.js и npm. Знакомство с JavaScript является обязательным для этой статьи.
Теперь, когда мы знаем предпосылки и нашу цель, давайте начнем. А если вы хотите сразу же клонировать и исследовать код, вы можете воспользоваться репозиторием GitHub.
Шаги, чтобы следовать
Мы создадим бота, выполнив несколько шагов.
Во-первых, мы создадим сервер Discord . Сервер Discord похож на группу, в которой вы можете назначать разные темы разным каналам, очень похоже на сервер Slack. Основное различие между Slack и Discord заключается в том, что Slack требует разных учетных данных для доступа к разным серверам, тогда как в Discord вы можете получить доступ ко всем серверам, частью которых вы являетесь, с помощью единой аутентификации.
Причина, по которой нам нужно создать сервер, заключается в том, что без прав администратора сервера мы не сможем добавить бота на сервер. Как только наш сервер будет создан, мы добавим бота на сервер и получим токен доступа с портала разработчиков Discord. Этот токен позволяет нам общаться с Discord API. Discord предоставляет нам официальный открытый API для взаимодействия. API можно использовать для чего угодно: от обслуживания запросов для ботов до интеграции OAuth. API поддерживает все, от бота на одном сервере до бота, который можно интегрировать на сотни серверов. Он очень мощный и может быть реализован многими способами.
Библиотека Discord.js поможет нам общаться с Discord API с помощью токена доступа . Все функции будут основаны на Discord API. Затем мы можем начать кодировать нашего бота. Мы начнем с написания небольших фрагментов кода, которые познакомят нас с Discord API и библиотекой Discord.js. Затем мы поймем концепцию партиалов в Discord.js. Как только мы поймем партиалы, мы добавим к боту так называемую систему «ролей реакции». Сделав это, мы также узнаем, как общаться с Twitter с помощью пакета npm под названием twit
. Этот пакет npm поможет нам интегрировать функцию пересылки твитов Twitter. Наконец, мы развернем его в облаке с помощью Heroku.
Теперь, когда мы знаем, как мы собираемся построить нашего бота, давайте начнем над ним работать.
Создание сервера Discord
Первое, что нам нужно сделать, это создать сервер Discord . Без сервера с правами администратора мы не сможем интегрировать бота.
Создать сервер Discord очень просто, а теперь Discord предоставляет шаблоны, которые делают его еще проще. Следуйте инструкциям ниже, и ваш сервер Discord будет готов. Во-первых, мы выберем, как мы собираемся получить доступ к порталу Discord. Мы можем использовать как веб-версию, так и приложение. Оба работают одинаково. Мы будем использовать веб-версию для этого урока.
Если вы читаете эту статью, я предполагаю, что у вас уже есть учетная запись Discord. Если нет, просто создайте учетную запись, как на любом другом веб-сайте. Нажмите кнопку «Войти» в правом верхнем углу и войдите, если у вас есть учетная запись, или нажмите кнопку «Зарегистрироваться». Заполните простую форму, заполните капчу, и вы успешно создали учетную запись. После открытия приложения или веб-сайта Discord щелкните значок плюса слева, где находится список серверов. Когда вы нажмете на нее, вам будет предложено выбрать шаблон или создать свой собственный.
Мы выберем вариант «Создать мой собственный». Пропустим следующий вопрос. Мы назовем наш сервер Discord «Smashing Example». Вы также можете предоставить фотографию для вашего сервера. Нажав кнопку «Создать», вы создадите свой сервер.
Регистрация бота в Discord
Прежде чем кодировать бота, нам нужно получить токен, предоставленный Discord . Этот токен установит соединение из нашего кода в Discord. Чтобы получить токен, мы должны зарегистрировать нашего бота на нашем сервере. Чтобы зарегистрировать бота, нам нужно посетить портал разработчиков Discord. Если вы создаете приложение Discord впервые, вы найдете там пустой список. Чтобы зарегистрировать наше приложение, нажмите на ссылку «Новое приложение» в правом верхнем углу. Дайте вашему приложению имя и нажмите кнопку «Создать». Мы назовем наше приложение «Smashing App».
Новое меню дает нам некоторые опции. Справа находится опция с надписью «Бот». Нажмите на нее и выберите «Добавить бота». Нажмите на подтверждение, измените имя бота, если хотите, сохраните изменения и скопируйте токен, полученный с этой страницы. Наш бот теперь зарегистрирован в Discord. Мы можем начать добавлять функциональность и кодировать бота.
Создание бота
Что такое Discord.js?
Discord.js определяет себя так:
Discord.js — это мощный модуль node.js, который позволяет вам очень легко взаимодействовать с API Discord. Он использует гораздо более объектно-ориентированный подход, чем большинство других библиотек JS Discord, что делает код вашего бота значительно более аккуратным и легким для понимания.
Таким образом, Discord.js значительно упрощает взаимодействие с Discord API. Он имеет 100% покрытие официальным API Discord.
Инициализация бота
Откройте ваш любимый текстовый редактор и создайте папку, в которой будут сохранены все ваши файлы. Откройте интерфейс командной строки (CLI), cd
в папку и инициализируйте папку с помощью npm: npm init -y
.
Нам понадобятся два пакета , чтобы начать сборку бота. Первый — это dotenv, а второй, очевидно, модуль Discord.js Node.js. Если вы знакомы с Node.js, то вы знакомы с пакетом dotenv. Он загружает переменные среды из файла с именем .env
в process.env
.
Установите эти два, используя npm i dotenv discord.js
.
После завершения установки создайте два файла в корневой папке. Назовите один из файлов .env
. Назовите другой основной файл как хотите. Я назову его app.js
Структура папок будет выглядеть так:
│ .env │ app.js │ package-lock.json │ package.json └─── node_modules
Мы будем хранить токены и другую конфиденциальную информацию в файле .env
, а код, создающий результаты, — в файле app.js
Откройте файл .env
и создайте новую переменную. Давайте назовем переменную BOT_TOKEN
для этого примера. Вставьте свой токен в этот файл. Теперь файл .env
будет выглядеть примерно так:
BOT_TOKEN=ODAxNzE1NTA2Njc1NDQ5ODY3.YAktvw.xxxxxxxxxxxxxxxxxxxxxxxx
Мы можем начать работу над файлом app.js
Первое, что нужно сделать, это потребовать модули, которые мы установили.
const Discord = require('discord.js'); require('dotenv').config();
Модуль dotenv
инициализируется с помощью метода config()
. Мы можем передать параметры в метод config()
. Но поскольку это очень простое использование модуля dotenv, нам не нужны какие-либо специальные функции от него.
Чтобы начать использовать модуль Discord.js, нам нужно инициализировать конструктор. Это показано в документации:
const client = new Discord.Client();
Модуль Discord.js предоставляет метод с именем client.on
. Метод client.on
прослушивает различные события. Библиотека Discord.js основана на событиях , а это означает, что каждый раз, когда событие генерируется из Discord, будут вызываться функции, связанные с этим событием.
Первое событие, которое мы будем прослушивать, — это событие ready
. Этот метод запустится, когда соединение с Discord API будет готово. В этом методе мы можем передать функции, которые будут выполняться при установлении соединения между API Discord и нашим приложением. Давайте передадим в этот метод оператор console.log
, чтобы узнать, установлено ли соединение. Метод client.on
с событием ready
будет выглядеть так:
client.on('ready', () => { console.log('Bot is ready'); });
Но это не установит соединение с API, потому что мы не вошли в бота с сервером Discord. Чтобы включить это, модуль Discord.js предоставляет метод login
в систему. Используя метод login
в систему, доступный на клиенте, и передав токен в этом методе, мы можем войти в приложение с сервером Discord.
client.login(process.env.BOT_TOKEN)
Если вы запустите приложение сейчас — с помощью node app.js
или, если вы используете nodemon, то с nodemon app.js
— вы сможете увидеть сообщение консоли, которое вы определили. Наш бот успешно авторизовался на сервере Discord. Мы можем начать экспериментировать с некоторыми функциями.
Давайте начнем с получения некоторого содержимого сообщения в зависимости от кода.
message
Событие
Событие message
прослушивает некоторое сообщение. Используя метод reply
, мы можем запрограммировать бота на ответ в соответствии с сообщением пользователя.
client.on('message', (msg) => { if (msg.content === 'Hello') msg.reply('Hi'); });
Этот пример кода будет отвечать «Привет» всякий раз, когда получено сообщение «Привет». Но для того, чтобы это заработало, нам нужно подключить бота к серверу.
Подключение бота к серверу Discord
До этого момента бот не связан ни с одним сервером. Чтобы подключиться к нашему серверу ( пример Smashing ), посетите портал разработчиков Discord. Нажмите на название приложения, которое мы создали ранее в этом руководстве (в нашем случае «Smashing App»). Выберите приложение и нажмите «OAuth2» в меню. Вы найдете группу под названием «Scopes». Установите флажок «бот» и скопируйте сгенерированный URL-адрес.
Перейдите по этому URL-адресу в новой вкладке, выберите свой сервер и нажмите «Авторизовать». Заполните капчу, и наш бот теперь будет подключен к серверу, который мы выбрали.
Если вы сейчас посетите сервер Discord, вы увидите, что уведомление уже было отправлено Discord, и теперь бот также отображается в списке участников с правой стороны.
Добавление функциональности в бот
Теперь, когда наш бот подключен к серверу, если вы отправите «Привет» на сервер, бот ответит «Привет». Это просто введение в Discord API. Настоящее веселье вот-вот начнется.
Чтобы поближе познакомиться с модулем Discord.js, давайте добавим функциональность, которая отправляет шутку при получении определенной команды. Это похоже на то, что мы только что сделали.
Добавление функции случайной шутки в бот
Чтобы сделать эту часть более понятной и понятной, мы не будем использовать никаких API. Шутки, которые вернет наш бот, будут простым массивом. Каждый раз в пределах диапазона массива будет генерироваться случайное число, и будет осуществляться доступ к этому конкретному местоположению массива для возврата шутки.
Если вы когда-либо использовали функциональность, предоставляемую ботом в Discord, вы могли заметить, что какой-то специальный символ отличает обычные сообщения от специальных команд. Я собираюсь использовать ?
перед нашими командами, чтобы они выглядели иначе, чем обычные сообщения. Итак, наша команда шутки будет ?joke
.
Мы создадим массив с именем jokes
в нашем файле app.js
Чтобы получить случайную шутку из массива, используйте следующую формулу:
jokes[Math.floor(Math.random() * jokes.length)]
Формула Math.random() * jokes.length
будет генерировать случайное число в пределах диапазона массива. Метод Math.floor
сгенерированное число.
Если вы console.log()
this, Math.floor(Math.random() * jokes.length)
, вы получите лучшее понимание. Наконец, jokes[]
выдадут нам случайную шутку из массива jokes
.
Вы могли заметить, что наш первый код был использован для ответа на наше сообщение. Но мы не хотим получать здесь ответ. Скорее, мы хотим получить шутку в виде сообщения, никого не отмечая. Для этого в модуле Discord.js есть метод с именем channel.send()
. Используя этот метод, мы можем отправлять сообщения в канал, где была вызвана команда. Итак, полный код до этого момента выглядит так:
const Discord = require('discord.js'); require('dotenv').config(); const client = new Discord.Client(); client.login(process.env.BOT_TOKEN); client.on('ready', () => console.log('The Bot is ready!')); // Adding jokes function // Jokes from dcslsoftware.com/20-one-liners-only-software-developers-understand/ // www.journaldev.com/240/my-25-favorite-programming-quotes-that-are-funny-too const jokes = [ 'I went to a street where the houses were numbered 8k, 16k, 32k, 64k, 128k, 256k and 512k. It was a trip down Memory Lane.', '“Debugging” is like being the detective in a crime drama where you are also the murderer.', 'The best thing about a Boolean is that even if you are wrong, you are only off by a bit.', 'A programmer puts two glasses on his bedside table before going to sleep. A full one, in case he gets thirsty, and an empty one, in case he doesn't.', 'If you listen to a UNIX shell, can you hear the C?', 'Why do Java programmers have to wear glasses? Because they don't C#.', 'What sits on your shoulder and says “Pieces of 7! Pieces of 7!”? A Parroty Error.', 'When Apple employees die, does their life HTML5 in front of their eyes?', 'Without requirements or design, programming is the art of adding bugs to an empty text file.', 'Before software can be reusable it first has to be usable.', 'The best method for accelerating a computer is the one that boosts it by 9.8 m/s2.', 'I think Microsoft named .Net so it wouldn't show up in a Unix directory listing.', 'There are two ways to write error-free programs; only the third one works.', ]; client.on('message', (msg) => { if (msg.content === '?joke') { msg.channel.send(jokes[Math.floor(Math.random() * jokes.length)]); } });
Я удалил часть кода «Привет»/«Привет», потому что она нам больше не нужна.
Теперь, когда у вас есть общее представление о модуле Discord.js, давайте углубимся. Но модуль может делать гораздо больше — например, добавлять роли человеку или банить его или выгонять. А пока мы построим простую систему реакций и ролей.
Построение системы «реакция-роль»
Всякий раз, когда пользователь отвечает специальным смайликом в определенном сообщении или канале, роль, связанная с этим смайликом, будет предоставлена пользователю. Реализация будет очень простой. Но прежде чем строить эту реактивно-ролевую систему, мы должны понять партиалы.
Частицы
Частичное — это концепция Discord.js. Discord.js обычно кэширует все сообщения, что означает, что он хранит сообщения в коллекции. Когда кешированное сообщение получает какое-либо событие, например получение сообщения или ответа, генерируется событие. Но сообщения, отправленные до запуска бота, не кэшируются. Таким образом, реакция на такие экземпляры не вызовет никаких событий, если только мы не получим их перед использованием. В версии 12 библиотеки Discord.js представлена концепция партиалов. Если мы хотим захватить такие некэшированные события , мы должны выбрать частичные. В библиотеке есть пять типов партиалов:
-
USER
-
CHANNEL
-
GUILD_MEMBER
-
MESSAGE
-
REACTION
В нашем случае нам понадобятся всего три типа партиалов:
-
USER
, человек, который реагирует; -
MESSAGE
, сообщение, на которое реагируют; -
REACTION
, реакция пользователя на сообщение.
В документации больше о партиалах.
Библиотека Discord.js предоставляет очень простой способ использования партиалов. Нам просто нужно добавить одну строку кода, передав объект в Discord.Client()
. Новый конструктор выглядит так:
const client = new Discord.Client({ partials: ['MESSAGE', 'REACTION', 'CHANNEL'], });
Создание ролей на сервере Discord
Чтобы включить систему ролей реакции, мы должны создать несколько ролей. Первая роль, которую мы собираемся создать, — это роль бота . Чтобы создать роль, перейдите в «Настройки сервера»:
В настройках сервера перейдите к опции «Роли» и нажмите на маленький значок плюса ( +
) рядом с надписью «Роли».
Во-первых, давайте создадим роль bot
и обязательно отметим опцию «Управление ролями» в меню параметров роли. После создания роли bot
вы можете добавить еще несколько ролей. Я добавил роли js
, c++
и python
. Вам не нужно давать им никаких особых способностей, но это вариант.
Здесь помните одну вещь: роли Discord работают на основе приоритета . Любая роль, у которой есть роли ниже нее, может управлять ролями ниже нее, но не может управлять ролями выше нее. Мы хотим, чтобы наша роль бота управляла ролями js
, c++
и python
. Итак, убедитесь, что роль bot
выше других ролей. Просто перетащите, чтобы изменить порядок ролей в меню «Роли» настроек вашего сервера.
Когда вы закончите создавать роли, назначьте bot
роль бота . Чтобы дать роль, нажмите на имя бота в списке участников с правой стороны сервера, а затем нажмите на маленький значок плюса ( +
). Он покажет вам все доступные роли. Выберите здесь роль «бота», и все готово.
Активация режима разработчика в Discord
Роли, которые мы создали, не могут использоваться в нашем коде по их именам. В Discord все, от сообщений до ролей, имеет свой идентификатор. Если вы нажмете на индикатор «еще» в любом сообщении, вы увидите опцию «Копировать ID». Эта опция доступна для всего в Discord, включая роли.
Скорее всего, вы не найдете эту опцию по умолчанию. Вам нужно будет активировать опцию под названием «Режим разработчика». Чтобы активировать его, перейдите в настройки Discord (не в настройки вашего сервера), прямо рядом с вашим именем в левом нижнем углу. Затем перейдите к опции «Внешний вид» в разделе «Настройки приложения» и активируйте «Режим разработчика» отсюда. Теперь вы сможете копировать идентификаторы.
messageReactionAdd
и messageReactionRemove
Событие, которое должно быть сгенерировано, когда на сообщение отреагировали, называется messageReactionAdd
. И всякий раз, когда реакция удаляется, должно быть сгенерировано событие messageReactionRemove
.
Продолжим построение системы. Как я уже сказал, сначала нам нужно прослушать событие messageReactionAdd
. Оба события messageReactionAdd
и messageReactionRemove
принимают два параметра в своей функции обратного вызова. Первый параметр — это reaction
, а второй — user
. Это довольно очевидно.
Кодирование функциональности роли реакции
Во-первых, мы создадим сообщение, описывающее, какой смайлик будет выполнять какую роль, что-то вроде того, что я сделал здесь:
Вы можете подумать, как мы будем использовать эти смайлики в нашем коде? Смайлики по умолчанию — Unicode, и нам придется скопировать версию Unicode. Если вы будете следовать синтаксису \:emojiName:
и нажмете «Enter», вы получите смайлик с именем. Например, мой смайлик для роли JavaScript — лиса; поэтому, если я наберу \:fox:
и нажму «Enter» в Discord, я получу смайлик в виде лисы. Точно так же я бы использовал \:tiger:
и \:snake:
чтобы получить эти смайлики. Сохраните их в настройках Discord; они нам понадобятся позже.
Вот начальный код. Эта часть кода просто проверяет некоторые крайние случаи. Как только мы поймем эти случаи, мы реализуем логику системы «реакция-роль».
// Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; });
Мы передаем асинхронную функцию. В обратном вызове первое, что мы делаем, это проверяем, является ли сообщение частичным . Если это так, то мы извлекаем его, то есть кэшируем или сохраняем в методе карты JavaScript. Точно так же мы проверяем, является ли сама реакция частичной, и затем делаем то же самое. Затем мы проверяем, является ли отреагировавший пользователь ботом, потому что мы не хотим назначать роли боту, реагирующему на наши сообщения. Наконец, мы проверяем, находится ли сообщение на сервере. Discord.js использует guild
в качестве альтернативного имени сервера. Если сообщения нет на сервере, то мы остановим функцию.
Наш бот будет назначать роли только в том случае, если сообщение находится в канале roles
. Если вы щелкните правой кнопкой мыши канал roles
, вы увидите опцию «Копировать идентификатор». Скопируйте идентификатор и следуйте инструкциям.
if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return;
Выше показан оставшийся код обратного вызова. Мы используем свойство reaction.message.channel.id
, чтобы получить идентификатор канала. Затем мы сравниваем его с идентификатором канала ролей, который мы только что скопировали. Если это правда, то проверяем смайлики и сравниваем их с реакциями. reaction.emoji.name
возвращает эмодзи, которые использовались для реакции. Мы сравниваем его с нашей Unicode-версией эмодзи. Если они совпадают, то reaction.message.guild.members.cache
свойство response.message.guild.members.cache.
Кэш — это коллекция, в которой хранятся данные . Эти коллекции представляют собой Map
JavaScript с дополнительными утилитами. Одной из предоставляемых им утилит является метод get
. Чтобы получить что-либо по идентификатору, мы можем просто передать идентификатор в этом методе. Итак, мы передаем user.id
в методе get
, чтобы получить пользователя. Наконец, метод roles.add
добавляет роль пользователю. В методе roles.add
мы передаем идентификатор роли. Вы можете найти идентификатор роли в настройках вашего сервера «Роль». Щелчок правой кнопкой мыши на роли даст вам возможность скопировать идентификатор роли. И мы закончили добавлять систему реакций и ролей в нашего бота!
Мы можем добавить функцию удаления роли, когда пользователь удаляет свою реакцию на сообщение. Это точно такой же код, как и наш выше, с той лишь разницей, что мы прослушиваем событие messageReactionRemove
и используем метод roles.remove
. Итак, полный код добавления и удаления ролей будет таким:
// Adding reaction-role function client.on('messageReactionAdd', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.add('802208314766524526'); } } else return; }); // Removing reaction roles client.on('messageReactionRemove', async (reaction, user) => { if (reaction.message.partial) await reaction.message.fetch(); if (reaction.partial) await reaction.fetch(); if (user.bot) return; if (!reaction.message.guild) return; if (reaction.message.channel.id == '802209416685944862') { if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208163776167977'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208242696192040'); } if (reaction.emoji.name === '') { await reaction.message.guild.members.cache .get(user.id) .roles.remove('802208314766524526'); } } else return; });
Добавление функции переадресации Twitter
Следующая функция, которую мы собираемся добавить к нашему боту, будет немного сложнее. Мы хотим сосредоточиться на конкретной учетной записи Twitter, чтобы каждый раз, когда учетная запись Twitter публикует твит, он был перенаправлен на наш канал Discord .
Прежде чем приступить к кодированию, нам нужно будет получить необходимые токены с портала разработчиков Twitter. Посетите портал и создайте новое приложение, нажав кнопку «Создать приложение» в опции «Обзор». Дайте вашему приложению имя, скопируйте все токены и вставьте их в файл .env
вашего кода с правильными именами. Затем нажмите «Настройки приложения» и включите трехстороннюю функцию OAuth. Добавьте приведенные ниже URL-адреса в качестве URL-адресов обратного вызова для целей тестирования:
https://127.0.0.1/ https://localhost/
Если у вас есть веб-сайт, добавьте адрес к URL-адресу веб-сайта и нажмите «Сохранить». Перейдите на вкладку «Ключи и токены» и сгенерируйте ключи доступа и токены. Скопируйте и сохраните их в файле .env
. Наша работа с порталом для разработчиков Twitter завершена. Мы можем вернуться в наш текстовый редактор, чтобы продолжить кодирование бота. Для достижения желаемой функциональности нам нужно добавить еще один пакет npm с именем twit
. Это клиент Twitter API для Node.js. Он поддерживает как REST, так и потоковый API.
Сначала установите пакет twit с помощью npm install twit
и добавьте его в свой основной файл:
const Twit = require('twit');
Мы должны создать экземпляр twit, используя конструктор Twit
. Передайте объект в конструкторе Twit
со всеми токенами, которые мы получили от Twitter:
const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, });
Здесь также указывается тайм-аут . Мы хотим, чтобы все форварды находились в определенном канале. Я создал отдельный канал под названием «Twitter forwards», куда будут пересылаться все твиты. Я уже объяснил, как вы можете создать канал. Создайте свой канал и скопируйте ID.
// Destination Channel Twitter Forwards const dest = '803285069715865601';
Теперь нам нужно создать поток. Потоковый API позволяет получить доступ к потоку данных по сети. Данные разбиваются на более мелкие фрагменты, а затем передаются. Вот наш код для потоковой передачи данных:
// Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter });
В follow
ключе я указываю @Stupidcounter
потому что он твитит каждую минуту, что отлично подходит для наших целей тестирования. Вы можете указать идентификатор любого дескриптора Twitter, чтобы получать его твиты. TweeterID даст вам идентификатор любого дескриптора. Наконец, используйте метод stream.on
, чтобы получить данные и передать их в нужный канал.
stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });
Мы прослушиваем событие tweet
и всякий раз, когда это происходит, передаем твит функции обратного вызова. Мы создадим собственное сообщение; в нашем случае сообщение будет таким:
Read the latest tweet by The Count (@Stupidcounter) here: https://twitter.com/Stupidcounter/status/1353949542346084353
Опять же, мы используем метод client.channels.cache.get
для получения нужного канала и метод .send
для отправки нашего сообщения. Теперь запустите своего бота и подождите минуту. Сообщение Twitter будет отправлено на сервер.
Итак, вот полный код переадресации Twitter:
// Adding Twitter forward function const Twit = require('twit'); const T = new Twit({ consumer_key: process.env.API_TOKEN, consumer_secret: process.env.API_SECRET, access_token: process.env.ACCESS_KEY, access_token_secret: process.env.ACCESS_SECRET, bearer_token: process.env.BEARER_TOKEN, timeout_ms: 60 * 1000, }); // Destination channel Twitter forwards const dest = '803285069715865601'; // Create a stream to follow tweets const stream = T.stream('statuses/filter', { follow: '32771325', // @Stupidcounter }); stream.on('tweet', (tweet) => { const twitterMessage = `Read the latest tweet by ${tweet.user.name} (@${tweet.user.screen_name}) here: https://twitter.com/${tweet.user.screen_name}/status/${tweet.id_str}`; client.channels.cache.get(dest).send(twitterMessage); return; });
Все функции, которые мы хотим добавить, готовы. Осталось только развернуть его в облаке. Мы будем использовать Heroku для этого.
Развертывание бота на Heroku
Сначала создайте новый файл в корневом каталоге папки с кодом вашего бота. Назовите его Procfile
. Этот Procfile
будет содержать команды, которые будут выполняться при запуске программы. В файл мы добавим worker: node app.js
, который будет сообщать Heroku о том, какой файл запускать при запуске.
После добавления файла давайте инициируем репозиторий git
и отправим наш код на GitHub (как это сделать, выходит за рамки этой статьи). Я бы посоветовал добавить папку node_modules
и файл .env
в файл .gitignore
, чтобы размер вашего пакета оставался небольшим, а конфиденциальная информация не попадала вовне.
После того, как вы успешно отправили весь свой код на GitHub, посетите веб-сайт Heroku. Войдите или создайте учетную запись, если у вас ее еще нет. Нажмите кнопку «Создать», чтобы создать новое приложение, и назовите его по своему усмотрению. Выберите «Метод развертывания» в качестве GitHub.
Найдите свое приложение и нажмите «Подключиться», как только найдете его. Включите автоматическое развертывание в меню «Развертывание», чтобы каждый раз, когда вы вносите изменения в код, код автоматически развертывался в Heroku.
Теперь нам нужно добавить переменные конфигурации в Heroku, что очень просто. Перейдите к опции «Настройки» под названием вашего приложения и нажмите «Показать переменные конфигурации».
Здесь мы добавили переменные конфигурации в виде пар ключ-значение. Когда вы закончите, снова перейдите на вкладку «Развертывание» и нажмите «Развернуть ветку» в разделе «Развертывание вручную».
Последнее, что нужно учитывать, это то, что вы можете столкнуться с 60-секундным сбоем из-за ошибки , который остановит выполнение бота. Чтобы этого не произошло, мы должны изменить рабочий тип приложения. В Heroku, если вы перейдете на вкладку «Ресурсы» своего приложения, вы увидите, что в разделе «Бесплатные Dynos» включен web npm start
. Мы должны отключить это и включить worker node app.js
Итак, нажмите кнопку редактирования рядом с кнопкой web npm start
, выключите ее и включите параметр worker node app.js
. Подтвердите изменение. Перезапустите все ваши динамометры, и мы закончили!
Заключение
Надеюсь, вам понравилось читать эту статью. Я попытался охватить все основы, которые вам необходимо понять при разработке сложного бота. Документация Discord.js — отличное место, чтобы узнать больше. У него отличные объяснения. Кроме того, вы найдете весь код в репозитории GitHub. И вот несколько ресурсов, которые будут полезны в вашем дальнейшем развитии:
- Документация, Портал разработчиков Discord
- Discord API (сервер Discord)
- Частицы, Discord.js, GitHub
- Портал разработчиков, Твиттер
- Twit, пакет и документация