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


Введение

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

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

Окончательный результат будет выглядеть так:

Пример мема

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


Требования

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

  • Питон 3 установлены.
  • точка (установщик пакета) установлен.
  • Дискорд-аккаунт.
  • Сервер Discord с разрешениями «Сервер менеджера».


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

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

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

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

Рисунок схемы сервера

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

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

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


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

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


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

Посещать и войдите в систему, если вы еще этого не сделали.


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

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

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

Создать приложение

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

Создать нового бота


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

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

Добавить низ

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

Добавить бота


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

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

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

Сбросить токен


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

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

настроить разрешения
получить пригласительную ссылку

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

пригласить бота

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

пригласить успех

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


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


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

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

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

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

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

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

Выйти из полноэкранного режима

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

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

Выйти из полноэкранного режима

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


Войдите на сервер 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/дайме.

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

{
  "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=108\u0026crop=smart\u0026auto=webp\u0026s=e3db2a1ed5ee73480224b55b16fcb38925ea9095",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=216\u0026crop=smart\u0026auto=webp\u0026s=aaec73a28c4c0b2bc47f4f9722be2fdb8ba95893",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=320\u0026crop=smart\u0026auto=webp\u0026s=90495a39d05f6d9d8975fb776887c08f65ece2c4",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=640\u0026crop=smart\u0026auto=webp\u0026s=b291abfb8f85b5826f001dee881570e694bdb46c",
    "https://preview.redd.it/ztpkxx6yl0c91.png?width=960\u0026crop=smart\u0026auto=webp\u0026s=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 package позволяет нам делать HTTP-запросы на любой URL-адрес. В этом случае мы вызываем метод GET для URL-адреса, который даст нам данные мема.

json package позволяет нам читать данные 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
Войти в полноэкранный режим

Выйти из полноэкранного режима

Время проверить это!

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

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

Мем с жабой

Успех! 🎉


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

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

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


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


Об авторе:

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