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

Предварительные условия: Основы Python
Версии: Python 3.10
Время чтения: 45 минут

Введение

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

Бот Discord, которого мы собираемся построить, будет слушать ключевое слово $meme и отвечать случайным мемом с Reddit.

Конечный результат будет выглядеть следующим образом:

Давайте погрузимся!

Требования

Прежде чем мы начнем, вам понадобится несколько вещей, если у вас их еще нет:

  • Установленный Python 3.
  • Установлен pip (программа установки пакетов).
  • Учетная запись Discord.
  • Сервер Discord с правами «Manager Server».

Как работает бот Discord

Сначала давайте немного расширим рамки и подумаем над таким вопросом: «Что значит создать Discord Bot?». Проще говоря, бот — это не что иное, как компьютерная программа, выполняющая некоторые полезные действия.

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

Сегодня мы сосредоточимся на том, чтобы заставить нашего бота читать и писать сообщения, поэтому давайте посмотрим, как это работает.

Из грубого рисунка выше (я инженер, а не художник) видно, как пользователи и боты подключаются к бэкенду Discord. Каждый пользователь взаимодействует с бэкендом Discord, чтобы писать и читать сообщения. Затем серверы бэкенда Discord передают событие о том, что было опубликовано новое сообщение, любой программе. Все, что нам нужно сделать, это написать нашу программу для реагирования на события сообщений (здесь она называется bot.py) и подключить ее к бэкенду Discord, используя их API.

API (Application Programming Interface) — это просто модная терминология для определения того, как одна программа общается с другой программой. В нашем случае API Discord позволяет нам читать и отправлять сообщения на его внутренние серверы.

Сначала нам нужно создать и зарегистрировать нашего бота на портале разработчиков Discord.

Настройка портала разработчиков Discord

Мы создадим и зарегистрируем наше приложение Discord на портале разработчиков. Затем мы создадим бота для приложения и получим необходимые разрешения.

Шаг 1. Перейдите на портал разработчиков

Зайдите на https://discord.com/developers/applications и зарегистрируйтесь, если вы еще этого не сделали.

Шаг 2. Создайте новое приложение

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

Нажмите «Новое приложение» в правом верхнем углу.

Далее дайте приложению имя. Здесь мы называем наше приложение MemeBot:

Шаг 3. Добавьте бота в приложение

Найдите вкладку «Бот» на левой панели:

И нажмите «Добавить бота»:

Шаг 4. Получите токен для вашего приложения

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

Нажмите «Сбросить токен», запишите его в надежном месте и, конечно, не кладите его в публичное место.

Шаг 5. Пригласите приложение на ваш сервер

Теперь, когда мы настроили наше первое приложение, нам нужно создать приглашение, чтобы наш бот попал на наш сервер Discord. Для этого мы можем нажать Генератор URL и выбрать следующие разрешения. На скриншоте ниже мы говорим Discord создать пригласительную ссылку для нашего приложения с областью действия «Бот», и этот бот должен иметь возможность «Отправлять сообщения». (Примечание: будьте осторожны с предоставлением всемогущего разрешения «Администратор» вашему боту).


Это ссылка для приглашения нашего приложения (бота Discord) на сервер Discord. Скопируйте и вставьте эту ссылку в другую вкладку браузера и пригласите бота на нужный вам сервер Discord.

Вы можете подтвердить, что это сработало, проверив наличие этого сообщения на вашем сервере Discord.

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

Написание кода на Python

Установка discord.py

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

Самое сложное в написании этой программы — это то, как мы будем взаимодействовать с API Discord. Хотя мы можем прочитать документацию по API и отправить HTTP-запросы непосредственно в Discord, у нас есть более простой способ.

Мы будем использовать пакет Python под названием discord.py, который представляет собой простую обертку вокруг Discord API. Обертка предоставляет способ доступа к API через определенный язык программирования, в данном случае Python!

Если вы используете Mac, выполните следующую команду в Терминале, чтобы установить его:

python3 -m pip install -U discord.py
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы используете Windows, то вместо этого следует использовать следующую команду:

py -3 -m pip install -U discord.py
Войти в полноэкранный режим Выйти из полноэкранного режима

Что мы только что сделали? Мы только что установили пакет Python из программы установки пакетов pip, что означает, что мы скачали код, который кто-то любезно написал и загрузил в публичный репозиторий.

Вход на сервер Discord с помощью бота

Давайте создадим новый файл bot.py в новом каталоге. Это основной файл, в котором мы будем писать логику для создания нашего бота Discord. Теперь вставьте в него следующий код:

import discord

class MyClient(discord.Client):
  async def on_ready(self):
    print('Logged on as {0}!'.format(self.user))

client = MyClient()
client.run('Your Token Here') # Replace with your own token.
Войти в полноэкранный режим Выйти из полноэкранного режима

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

import discord

class MyClient(discord.Client):
  async def on_ready(self):
    print('Logged on as {0}!'.format(self.user))
Войти в полноэкранный режим Выйти из полноэкранного режима

Во-первых, мы импортировали пакет discord.py, который только что установили, и создали собственный класс MyClient, который мы будем использовать для взаимодействия с Discord API. Мы создаем этот класс путем расширения от базового класса discord.Client. В этом базовом классе уже есть методы для реагирования на общие события. Например, функция on_ready(), приведенная выше, будет вызвана, когда вход бота Discord будет успешным.

discord.py работает вокруг концепции событий. Существуют и другие типы событий (например, сообщения), которые мы рассмотрим позже, а пока вот определение событий с их сайта:

Событие — это то, что вы слушаете, а затем реагируете на него. Например, когда происходит сообщение, вы получаете событие об этом, на которое вы можете отреагировать.

Наконец, наши последние две строки кода инстанцируют класс MyClient и вызывают run, который является основным способом запуска клиента. Клиент будет использовать заданный токен (который вы должны были сохранить ранее) для аутентификации на внутренних серверах Discord.

client = MyClient()
client.run('Your Token Here') # Replace with your own token
Войти в полноэкранный режим Выход из полноэкранного режима

Запуск бота

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

python3 bot.py
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Если в терминале вы увидите следующее сообщение, значит, ваш бот Discord успешно вошел на ваш сервер Discord.

Logged on as MemeBot#3995!
Вход в полноэкранный режим Выход из полноэкранного режима

Ответ на сообщения

Далее мы хотим, чтобы наш бот читал сообщения в канале Discord и отвечал на них.

Добавьте метод .on_message() в класс MyClient, как показано ниже:

async def on_message(self, message):
  if message.author == self.user:
    return

  if message.content.startswith('$hello'):
    await message.channel.send('Hello World!')
Войти в полноэкранный режим Выйти из полноэкранного режима

Метод .on_message() будет вызываться автоматически при появлении нового сообщения в канале, где находится наш бот. В нашем методе:

  • Сначала мы проверяем if message.author == self.user, является ли бот тем, кто отправляет сообщение в чате. Мы не хотим, чтобы бот продолжал отвечать на свои собственные сообщения.
  • Тогда у нас есть код для ответа на специальное ключевое слово $hello.

Давайте опробуем его. Выполните команду python3 bot.py, чтобы запустить нашу программу.

Теперь добавьте Memebot в любой канал и введите слово $hello в этом канале и посмотрите, что произойдет:

Мы успешно запрограммировали нашего бота на вход в Discord и ответ на наши сообщения. Но можем ли мы пойти дальше?

Как отвечать с помощью мемов

Что если вместо текстового сообщения бот будет отвечать мемами? Звучит как большой объем работы… Но самое приятное в программировании то, что мы можем повторно использовать чужие наработки (ура открытому исходному коду).

Посмотрите на этот репозиторий Github: https://github.com/D3vd/Meme_Api. Этот API возвращает ответ в формате JSON, содержащий информацию о случайных мемах с Reddit. Хм, давайте посмотрим, как это работает, посетив этот URL: https://meme-api.herokuapp.com/gimme.

Вот ответ, который я получил:

{
  "postLink": "https://redd.it/w0teq0",
  "subreddit": "me_irl",
  "title": "me_irl",
  "url": "https://i.redd.it/ztpkxx6yl0c91.png",
  "nsfw": false,
  "spoiler": false,
  "author": "ozgonngu",
  "ups": 110,
  "preview": [
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=108u0026crop=smartu0026auto=webpu0026s=e3db2a1ed5ee73480224b55b16fcb38925ea9095",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=216u0026crop=smartu0026auto=webpu0026s=aaec73a28c4c0b2bc47f4f9722be2fdb8ba95893",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=320u0026crop=smartu0026auto=webpu0026s=90495a39d05f6d9d8975fb776887c08f65ece2c4",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=640u0026crop=smartu0026auto=webpu0026s=b291abfb8f85b5826f001dee881570e694bdb46c",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=960u0026crop=smartu0026auto=webpu0026s=7afc3f2532c7017a0045ae50777a18a2e452183e",
  ],
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Похоже, что поле url здесь содержит ссылку на изображение мема. Как насчет того, чтобы наш бот отвечал на сообщения пользователя этим изображением?

Интеграция API мемов

Давайте вставим эти строки кода в начало файла.

import requests
import json

def get_meme():
  response = requests.get('https://meme-api.herokuapp.com/gimme')
  json_data = json.loads(response.text)
  return json_data['url']
Вход в полноэкранный режим Выйти из полноэкранного режима

Пакет requests позволяет нам делать HTTP-запросы к любому URL. В данном случае мы вызываем метод GET к URL, который предоставит нам данные мемов.

Пакет json позволяет нам читать данные в формате JSON. Это полезно, поскольку большинство данных, передаваемых в Интернете, имеют формат JSON, как, например, ответ JSON, который мы видели выше.

Нам нужно установить пакет requests, чтобы импортировать его. Выполните следующую команду:

python3 -m pip install requests
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь нам остается только вызвать get_meme() внутри метода on_message() нашего бота. Давайте также изменим ключевое слово с $hello на $meme, так как оно более уместно. Ваш код должен выглядеть следующим образом:

import discord
import requests
import json

def get_meme():
  response = requests.get('https://meme-api.herokuapp.com/gimme')
  json_data = json.loads(response.text)
  return json_data['url']

class MyClient(discord.Client):
  async def on_ready(self):
    print('Logged on as {0}!'.format(self.user))

  async def on_message(self, message):
    if message.author == self.user:
      return
    if message.content.startswith('$meme'):
      await message.channel.send(get_meme())

client = MyClient()
client.run('Your Token Here') # Replace with your own token
Вход в полноэкранный режим Выйти из полноэкранного режима

Пора протестировать!

Только помните, что вам нужно закрыть и перезапустить вашу программу. Нажмите управление+c чтобы закрыть текущую запущенную программу в терминале, а затем снова запустите python3 bot.py.

Момент истины…

Успех! 🎉

Заключительные слова

Вот и все, что нужно, чтобы настроить и закодировать бота Discord на Python! Обратите внимание: бот будет отвечать вам до тех пор, пока программа запущена. Если вы закроете терминал или выключите компьютер, программа больше не будет запущена. Если вы хотите, чтобы программа работала вечно, нам придется развернуть ее на другом компьютере в облаке. Однако это урок для другого дня.

Надеюсь, вам понравился этот урок. Если у вас возникли вопросы, вы можете написать мне в twitter по адресу @hongjjeon.

Дополнительные ресурсы

  • Решение на GitHub
  • Портал разработчиков Discord

Об авторе:

Хонг Джеон — инженер-программист в компании Waymo (ранее известной как проект Google по созданию самоуправляемых автомобилей). Свою страсть к обмену знаниями Хон обнаружил в колледже, когда был ассистентом преподавателя на нескольких занятиях по программированию. Его можно найти в Твиттере по адресу @hongjjeon.

Оцените статью
devanswers.ru
Добавить комментарий