Как написать бота для дискорда на пайтоне

Время на прочтение
2 мин

Количество просмотров 155K

Версии, которые стоят у автора

Версия Python: 3.8.2
Версия discord.py: 1.3.3

Приветствую, хабровчане и другие пользователи интернета. Сегодня я начну цикл статей, посвящённых созданию Discord-бота с помощью библиотеки discord.py. Мы рассмотрим создание как и примитивного бота, как и «продвинутого» бота с модулями. В этой статье мы сделаем стандартную команду и ещё одну небольшую команду. Начнём!

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

Для того, чтобы добавить бота на сервер нужно создать свое приложение и во вкладке General Information скопировать Client ID.

Здесь заменяем CLID на ранее скопированный Client ID.

https://discordapp.com/oauth2/authorize?&client_id=CLID&scope=bot&permissions=8

Во вкладке Bot создаём бота и копируем токен.

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

Устанавливаем саму библиотеку.

pip install discord

Создаём файл config.py (так удобнее), и создаём там словарь.

settings = {
    'token': 'Ваш токен',
    'bot': 'Имя бота',
    'id': Client ID бота, без кавычек,
    'prefix': 'Префикс бота'
}

Создаём main-файл, название может быть любое.
Импортируем библиотеки и наш файл конфига:

import discord
from discord.ext import commands
from config import settings

Создаём «тело» бота, название может быть любое:

bot = commands.Bot(command_prefix = settings['prefix']) # Так как мы указали префикс в settings, обращаемся к словарю с ключом prefix.

Начинаем писать основной код.

@bot.command() # Не передаём аргумент pass_context, так как он был нужен в старых версиях.
async def hello(ctx): # Создаём функцию и передаём аргумент ctx.
    author = ctx.message.author # Объявляем переменную author и записываем туда информацию об авторе.

    await ctx.send(f'Hello, {author.mention}!') # Выводим сообщение с упоминанием автора, обращаясь к переменной author.

В конце запускаем бота с помощью:

bot.run(settings['token']) # Обращаемся к словарю settings с ключом token, для получения токена

Полный код

import discord
from discord.ext import commands
from config import settings

bot = commands.Bot(command_prefix = settings['prefix'])

@bot.command() # Не передаём аргумент pass_context, так как он был нужен в старых версиях.
async def hello(ctx): # Создаём функцию и передаём аргумент ctx.
    author = ctx.message.author # Объявляем переменную author и записываем туда информацию об авторе.
    await ctx.send(f'Hello, {author.mention}!') # Выводим сообщение с упоминанием автора, обращаясь к переменной author.

bot.run(settings['token']) # Обращаемся к словарю settings с ключом token, для получения токена

Должно получится так:

Бонусный туториал!

Сделаем вывод случайных картинок с лисами
Для этого импортируем еще пару библиотек:

import json
import requests

Приступим к написанию команды.

@bot.command()
async def fox(ctx):
    response = requests.get('https://some-random-api.ml/img/fox') # Get-запрос
    json_data = json.loads(response.text) # Извлекаем JSON

    embed = discord.Embed(color = 0xff9900, title = 'Random Fox') # Создание Embed'a
    embed.set_image(url = json_data['link']) # Устанавливаем картинку Embed'a
    await ctx.send(embed = embed) # Отправляем Embed

Должно получится так:

Конец

На этом 1 часть закончена. Скоро будет опубликована 2 часть.

Всем привет, сегодня мы напишем Discord-бота на Python и discord.py + бонусом посмотрим на примеры ботов. Приступим 🙂

Перед работой

Перед тем, как начать, вам нужны:

  1. Python 3;
  2. discord.py;
  3. Discord-аккаунт и свой сервер.

Для установки discord.py воспользуйтесь пакетным менеджером:

pip3 install discord.py

Создаём нашего бота

Перейдите на Developer Portal и нажмите на New application.

Вы создали своё приложение, на странице приложение перейдите в Bot >> Add Bot и создайте своего Discord-бота.

Сохраните токен бота! Дальше он нам понадобится!

Если всё прошло успешно, поздравляю, половина дела сделана 😀

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

Теперь можно добавить бота на сервер.

Перейдите в OAuth2 >> URL Generator, в Scopes выбираем Bot и ниже — права бота, копируем сгенерированный URL. Вставляем в браузер, и добавляем на наш сервер.

Эхо-бот

Напишем традиционного эхо-бота, и разберём каждую строчку кода.

Код:

import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': 'prefix',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.event
async def on_message(ctx):
    if ctx.author != bot.user:
        await ctx.reply(ctx.content)

bot.run(config['token'])

Пример работы:

Разбор:

import discord
from discord.ext import commands

Нужные нам импорты.

config = {
    'token': 'your-token',
    'prefix': 'prefix',
}

Вспомогательный словарь config в котором храним токен и префикс команд (далее расскажу зачем нужен префикс команд).

bot = commands.Bot(command_prefix=config['prefix'])

Создаём нашего бота, в аргументе передаём префикс.

@bot.event

Декоратор, предназначенный для обработки событий, подробнее здесь.

async def on_message(ctx):

Создаём асинхронную функцию, с параметром ctx, представляет из себя сообщение.

if ctx.author != bot.user:

Проверка, не является ли автор сообщения нашим Discord-ботом. Дело в том, что если бот отправит сообщение, это будет новым событием, и тогда получается цикл.

await ctx.reply(ctx.content)

Отвечаем на сообщение (ctx.reply), в аргументы передаём сообщение (ctx.content).

bot.run(config['token'])

Запускаем нашего бота, в аргументы передаём токен бота.

Надеюсь вы разобрались с кодом, и мы можем переходить далее.

Обработка команд

Перед тем, как обрабатывать команды, нам пригодится наш префикс.

Рассмотрим код:

import random
import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': '$',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.command()
async def rand(ctx, *arg):
    await ctx.reply(random.randint(0, 100))

bot.run(config['token'])

Результат работы:

Разбор:

@bot.command()

Декоратор обработки команд

async def rand(ctx, *arg):

Асинхронная функция rand

await ctx.reply(random.randint(0, 100))

Отвечаем на сообщение, в аргументы передаём случайное число от 0 до 100

Бонус

Проверка роли:

import random
import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': '$',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.command()
@commands.has_role("Хозяин")
async def rand(ctx, *arg):
    await ctx.reply(random.randint(0, 100))

bot.run(config['token'])

Выгнать пользователя

import discord
from discord.ext import commands

config = {
    'token': 'your-token',
    'prefix': '$',
}

bot = commands.Bot(command_prefix=config['prefix'])

@bot.command()
async def kick(ctx, user : discord.User(), *arg, reason='Причина не указана'):
    await bot.kick(user)
    await ctx.send('Пользователь {user.name} был изгнан по причине "{reason}"')

bot.run(config['token'])

Руководство по использованию библиотеки discord-py

Здесь вы можете почитать об основах, которые необходимо понимать, чтобы грамотно работать с библиотекой и не задавать вопросов, касающихся самых базовых вещей


Вероятнее всего у вас уже имеется созданный бот, поэтому инструкция по его созданию будет пропущена (но, возмжно появится позже).

Прежде чем начать…

Прежде чем приступать к работе с ботом, я сразу рекомендую зайти на страницу вашего бота и включить намерения (intents, подробнее). Для этого зайдите в раздел приложений и выберите вашего бота. Затем, слева, на вкладке "Bot"

Бот

Включите параметры PRESENCE INTENT и SERVER MEMBERS INTENT

введите сюда описание изображения

После этого выдайте намерения в коде при инициализации бота

Намерения нужны для работы с некоторыми событиями, объектами пользователей серверов (участник/member) и др. Они вам точно понадобятся, поэтому лучше включить их сразу, чтобы потом не спрашивать, почему вам не удается получить данные о пользователе сервера или чего-либо еще.


Начало работы с ботом и discord-py

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

Для начала рассмотрим виды ботов, которые предоставляет библиотека:

  • discord.Client — фактически, самый базовый бот, на котором основаны другие. Умеет обрабатывать события по типу получения сообщений on_message(), установки реакции on_raw_reaction_add() и другие.
  • discord.ext.commands.Bot — тот же discord.Client, только умеет находить в сообщениях и обрабатывать отдельные команды, которые начинаются с какого-либо префикса, например !test
  • discord.ext.commands.Cog — про этого бота ничего сказать не могу, так как ни разу не использовал. Насколько мне известно, он нужен в тех случаях, когда вы планируете задать боту кучу разных комманд, событий и организовать все это в один отдельный класс.

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

Если помимо того, что я написал выше, вы хотите добавить еще и обработку команд по типу !ban <@User>, !play <Ссылка на видео с YouTube>, !погода и т.п., то использовать надо именно discord.ext.commands.Bot.


Пишем код

Теперь, когда вы определились с ботом можно наконец-то приступить к написанию кода.

Для начала подключим библиотеку.

На данном этапе я настоятельно рекомендую ознакомиться с руководством по использованию документации, так как на эту самую документацию я буду ссылаться очень часто и без ее использования вы вряд ли напишете что-то самостоятельно и будете постоянно спрашивать как реализовать ту или иную функцию.

В случае, если вы хотите использовать discord.ext.commands.Bot, я бы сразу отдельно подключил еще и этот пакет

from discord.ext import commands

Инициализация бота

Теперь создадим объект бота, который будет обрабатывать события и команды:

Из документации видим, что единственным обязательным аргументом при создании экземпляра класса является command_prefix.

Он принимает строку (str), по которой бот будет определять, то что сообщение является командой и обрабатывать его нужно именно как команду.

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

В качестве префикса команды укажем !, намерения нужно выдавать именно те, которые вы будете использовать, но на первое время можно выдать все, то есть discord.Intents.all()

Если у вас discord.ext.commands.Bot:

bot = commands.Bot(command_prefix='!', intents=discord.Intents.all())

Если у вас discord.Client, то префикс указывать не нужно (класс не принимает такого аргумента):

bot = discord.Client(intents=discord.Intents.all())

Основные обработчики событий

Теперь у нас есть объект bot, для которого нужно написать логику взаимодействия.

В качестве обработчиков событий используются асинхронные (async) функции (def), помеченные декоратором @bot.event, где bot — название объекта вашего бота. Функция должна иметь название, строго как в документации — иначе событие просто не будет обработано.

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

async def on_ready()

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

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

Выглядеть это будет вот так:

@bot.event
async def on_ready():
  # сам по себе объект bot (discord.ext.commands.Bot) не содержит имени бота
  # зато содержит объект пользователя, которым он является
  # а вот объект пользователя уже хранит в себе имя
  print(f'{bot.user.name} запустился и готов к работе!')

async def on_message(message)

Добавим обработчик сообщений, чтобы получать вызов функции каждый раз, когда bot получает сообщение в ЛС или на сервере.

В списке событий находим событие on_message(message), которое принимает обязательный аргумент message. Этот аргумент имеет тип discord.Message из которого вы можете получить текст сообщения, а также объекты автора сообщения, сервер, канал, вложения, реакции, упоминания, ссылку на сообщение и много чего еще

@bot.event
async def on_message(message):
  print(f'Получено сообщение! Текст: {message.content}, Сервер: {message.guild}')

Здесь вы можете прописать любую логику взаимодействия. Хоть даже удалять все только что переданные обработчиком сообщения (главное чтобы у бота были на то права).
Самое главное — задать функции аргумент, который будет принимать объект сообщения. Вы можете назвать его как хотите, например даже так: async def on_message(собщение), главное чтобы он был.

Если аргумент не указать, то при вызове события нового сообщения, discord-py отправит в функцию on_message() аргумент, содержащий объект сообщения, но получит ошибку о том, что указанная функция не принимает аргументов и ничего работать не будет. Это равноценно созданию функции, которая должна считать сумму 2 переданных в виде аргументов числа, но при этом она не принимает их.


Другие события

По аналогии с примерами, приведенными выше, можно создать обработчик любого другого события, предствленного в discord-py. Главное, чтобы совпадало название и принимаемые аргументы.

Примеры других часто используемых событий:

on_raw_reaction_add(payload), on_raw_reaction_remove(payload) — события добавления и удаления реакции с сообщения, соответствено. Из объекта payload вы можете получить сервер, сообщения и прочую инфу

on_member_join(member), on_member_remove(member) — события подключения и выхода участника с сервера, в качестве аргумента принимает объект участника из которого можно получить всю информацию о пользователе.

Остальное вы можете найти в списке событий.


Запуск бота

У вас уже есть объект бота и, вероятно, обработчики событий. Теперь бота нужно запустить.

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

Для этого у объекта bot нужно вызвать функцию run():

TOKEN = '' # здесь ваш токен
bot.run(TOKEN)

Особенности

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

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

Чтобы бот работал без вашего участия, его можно поставить на хостинг — тогда он будет постоянно запущен на удаленном сервере, а не на вашем устройстве. Например, можно использовать бесплатный (уже не бесплатный) хостинг Heroku. В интернете есть куча разных туториалов по настройке. Возможно, когда-нибудь здесь появится ссылка на мой :)


В итоге должен получиться примерно такой код, посмотреть который можно здесь.

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

Для этого примера достаточно было бы простого бота discord.Client, так как он обрабатывает только события. Но я наперед прописал в коде бота discord.ext.commands.Bot, так как дальше в этот код мы будем добавлять обработку команд.


Обработка отдельных команд


Данный раздел содержит информацию об устаревших в дискорде prefix-командах (!command / >command / $command и т.п.). На данный момент актуально создавать именно slash-команды (/command), которые интегрируются в дискорд и позволяют более комфортно разделять аргументы и добавлять к ним описание.

Так или иначе, руководство по slash-командам подразумевает знание материала по работе с prefix-командами. Поэтому прежде чем переходить к slash-командам, я рекомендую ознакомиться с материалом ниже.

Почитать про slash-команды можно здесь.


Напоминаю, что для работы с командами, в качестве бота нужно использовать объект discord.ext.commands.Bot, а не discord.Client! Не забудьте также про префикс

  • Команды бота, как и обработчики событий, являются асинхронными функциями (async def).

  • Чтобы discord-py обнаружил команду в коде, функцию нужно пометить декоратором @bot.command(), где bot — название объекта вашего бота.

    Скобки в декораторе @bot.command() обязательны, в отличии от @bot.event, так как декторатор discord.ext.commands.Command() принимает необязательные аргументы. Без скобок декоратор корректно работать не будет. *Подробнее про декораторы можно почитать выше

  • В отличии от обработчиков событий, функцию можно назвать как захочется — название функции станет названием команды.

  • Любая функция, являющаяся командой, должна принимать обязательный аргумент ctx (можно назвать как угодно). Аргумент является контекстом (discord.ext.commands.Context) выполнения команды, из которого можно получить сервер, автора, сообщение, канал и др. информацию. При вызове команды, Контекст в функцию передает библиотека discord-py.

Перед созданием первой команды

Для начала, если у вас в коде есть обработчик событий on_message(), его нужно немного доработать.

Из документации видим, что у объекта пользователя (discord.User) есть свойство bot, имеющее тип bool. Значит, если свойство имеет значение True — пользователь является ботом, иначе — не является)

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

Для этого, кстати, в on_message() нужно добавить еще одну строку await bot.process_commands(message), которую можно найти в списке методов объекта discord.ext.commands.Bot. Метод принимает в качестве аргумента сообщение с типом discord.Message и нужен для того, чтобы проверять, являестя ли сообщение командой.
Многие, забыв добавить эту строку, потом не понимают, почему их бот игнорирует команды (подробный разбор проблемы)

@bot.event
async def on_message(message):
  if message.author.bot:
    return
  await bot.process_commands(message)

Ключевое слово return завершает выполнение функции, то есть код, который идет дальше, так или иначе не будет выполнен.

Создание первой команды

Создадим команду с названием test, при вызове которой бот будет отвечать в чат «Успешный тест!»:

@bot.command()
async def test(ctx):
  # список свойств и методов контекста можно найти в документации по запросу context
  await ctx.send('Успешный тест!')

Результат:

image

Все работает!

Реализацию такой команды можно было бы сделать через обычного бота discord.Client прямо в on_message(), проверяя, наличие префикса и конкретного названия команды. Однако при большом количестве команд запихивать все в одну функцию не очень хорошо, да и не удобно разделять аргументы, про которые, кстати, можно почитать далее.

*Почитать подробнее, почему не стоит делать команды через on_message() можно здесь

Сложные команды

Несколько названий

Для создания нескольких названий одной команды можно передать в декоратор @bot.command() аргумент aliases, принимающий список (list) или кортеж (tuple) с названиями команды. При этом самого названия функции там быть не должно.

@bot.command(aliases=['test', 'тест', 'тестовая_команда', 'test_command'])
async def test_(ctx):
  pass
Работа с аргументами команды

Предположим, вам нужно при вызове функции принять от пользователя число, значение типа bool и участника сервера discord.Member

image

Чтобы принять эти параматры, нужно указать их в качестве аргументов функции, которая используется в качестве команды:

@bot.command()
async def get_values(ctx, number, boolean, member):
    ...

Поскольку Python — язык с динамической типизацией, по умолчанию все полученные значения принимают строковый тип str, так как фактически были получены из строки (str), содержащей текст сообщения.

Тогда

  • number будет равно '16'
  • boolean будет равно 'True'
  • member будет равно '<@!239863351063144451>'

То есть из number нельзя будет вычесть число, boolean == True примет значение False, а member просто примет строку, содержащую форму упоминания пользователя.

Вместо того, чтобы вручную выполнять приведение типов (number = int(number), boolean = bool(boolean) и т.д.), можно сразу же явно указать тип аргумента функции:

@bot.command()
async def get_values(ctx, number: int, boolean: bool, member: discord.Member):
    ...

И вот теперь уже все будет работать корректно. Помимо discord.Member можно указать любой другой тип библиотеки discord-py.

Из объекта member, например, можно получить id (member.id), ссылку на аватар (member.avatar_url) и другую информацию, которую можно найти в документации по объекту discord.Member.

Получить весь текст как один аргумент

В случае, когда вам в качестве аргумента нужен весь текст команды, можно использовать оператор *:

image

@bot.command()
async def get_text(ctx, *, text):
    ...

text будет иметь тип str и значение 'это тестовый текст для проверки функции'


Если сделать так:

@bot.command()
async def get_text(ctx, *text):
    ...

text будет иметь тип tuple и значение ('это', 'тестовый', 'текст', 'для, 'проверки', 'функции')


Также можно сначала получить несколько отдельных слов, а уже потом оставшийся текст:

@bot.command()
async def get_text(ctx, first_word, second_word, *, other_text):
    ...
  • first_word будет иметь тип str и значение 'это'
  • second_word будет иметь тип str и значение 'тестовый'
  • other_text будет иметь тип str и значение 'текст для проверки функции'

Итог

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

Данной информации должно хватить для понимания базовых вещей, таких как работа с документацией, создание prefix-команд, работа с обработчиками событий и т.д.


Другие материалы

  • Slash-команды
  • Фоновые задачи (Tasks)
  • UI-Элементы (Кнопки, выпадающие списки и дилоговые окна)

Из этого туториала Вы узнаете, как полностью создать собственного бота Discord в облаке.

Вам не нужно ничего устанавливать на свой компьютер, и вам не нужно ничего платить за размещение своего бота.

Мы будем использовать целый ряд инструментов, в том числе Discord API, библиотеки Python, и платформы облачных вычислений под названием Repl.it.

Как создать учетную запись Discord Bot

Чтобы работать с библиотекой Python и API Discord, мы должны сначала создать учетную запись Discord Bot.

Вот шаг к созданию учетной записи Discord Bot.

1. Убедитесь, что вы вошли на сайт Discord.

2. Перейдите на страницу приложения.

3. Щелкните кнопку «Новое приложение».

4. Дайте приложению имя и нажмите «Создать».

5. Перейдите на вкладку «Бот» и нажмите «Добавить бота». Вам нужно будет подтвердить действие, нажав «Yes, do it!»

Оставьте настройки по умолчанию для Public Bot и Require OAuth2 Code Grant.

Ваш бот создан. Следующим шагом будет копирование токена.

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

Вы можете регенерировать токен, если он случайно станет доступен.

Как пригласить вашего бота присоединиться к серверу

Теперь вам нужно подключить своего пользователя-бота к серверу. Для этого вы должны создать для него URL-адрес приглашения.

Перейдите на вкладку «OAuth2». Затем выберите «бот» в разделе «scopes».

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

После выбора соответствующих разрешений нажмите кнопку «Copy» над разрешениями. Это скопирует URL-адрес, который можно использовать для добавления бота на сервер.

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

Чтобы добавить бота, вашей учетной записи необходимы разрешения «Управление сервером».

Теперь, когда вы создали пользователя-бота, мы начнем писать код Python для бота.

Как написать код для базового бота Discord с помощью библиотеки discord.py

Мы будем использовать библиотеку Python discord.py, чтобы написать код для бота. discord.py — это оболочка API для Discord, которая упрощает создание бота Discord на Python.

Как создать реплику и установить disocrd.py

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

Создайте новый Repl и выберите «Python» в качестве языка.

Чтобы использовать библиотеку discord.py, просто напишите import discord  вверху main.py. Repl.it автоматически установит эту зависимость, когда вы нажмете кнопку «Run».

Если вы предпочитаете кодировать бота локально, вы можете использовать эту команду в MacOS для установки discord.py:

python3 -m pip install -U discord.py

Возможно, вам придется использовать pip3 вместо pip.

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

py -3 -m pip install -U discord.py

Как настроить события Discord для вашего бота

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

Сделаем бота, который отвечает на конкретное сообщение. Этот простой код бота вместе с объяснением кода взят из документации discord.py. Позже мы добавим в бота дополнительные функции.

Добавьте этот код в main.py. (Вы можете назвать файл как-нибудь иначе, только не discord.py.) Я вскоре объясню, что делает весь этот код.

import discord
import os

client = discord.Client()

@client.event
async def on_ready():
    print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

client.run(os.getenv('TOKEN'))

Когда вы создали своего пользователя-бота в Discord, вы скопировали токен. Теперь мы собираемся создать файл .env для хранения токена. Если вы запускаете свой код локально, вам не нужен файл .env. Просто замените os.getenv('TOKEN') токеном.

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

Поэтому, если вы разрабатываете на Repl.it, включайте в файл .env только личную информацию, такую ​​как токены или ключи.

Нажмите кнопку «Добавить файл» и создайте файл с именем .env.

Внутри файла добавьте следующую строку, включая ваш фактический токен, который вы скопировали ранее:

Теперь давайте рассмотрим, что делает каждая строка в коде вашего бота Discord.

  1. Первая строка импортирует библиотеку discord.py.
  2. Вторая строка импортирует библиотеку os, но она используется только для получения переменной TOKEN из файла .env. Если вы не используете .env файл, эта строка вам не нужна.
  3. Затем мы создаем экземпляр Client. Это связь с Discord.
  4. Декоратор @client.event() используется для регистрации события. Это асинхронная библиотека, поэтому все делается с помощью обратных вызовов. Обратный вызов — это функция, которая вызывается, когда происходит что-то еще. В этом коде событие on_ready() вызывается, когда бот готов к использованию. Затем, когда бот получает сообщение, вызывается событие on_message().
  5. Триггер событий каждый раз вызывает on_message(), когда принимается сообщение, но мы не хотим, что-то делать, если сообщение от самих себя. Поэтому, если Message.author это то же самое, что и Client.user, просто делаем return.
  6. Затем мы проверяем Message.content, начинается ли с '$hello'. Если да, то бот отвечает 'Hello!' в канал, в котором он использовался.
  7. Теперь, когда бот настроен, последняя строка запускает бот с токеном входа. Он получает токен из файла .env.

У нас есть код для бота, поэтому теперь нам просто нужно его запустить.

Как запустить бота

Теперь нажмите кнопку запуска вверху, чтобы запустить своего бота в repl.it.

Если вы пишете бота локально, вы можете использовать эти команды в терминале для запуска бота:

В Windows:

В других системах:

Теперь перейдите в свою комнату в Discord и введите «$hello». Ваш бот должен ответить «Hello!».

Как улучшить бота

Теперь, когда у нас есть базовый бот, мы его улучшим. Не зря он называется «Encourage Bot».

Этот бот будет отвечать сообщением ‘Hello!’ всякий раз, когда кто-то отправляет сообщение, содержащее грустное или удручающее слово.

Любой желающий сможет добавить ободряющие сообщения для использования бота, а отправленные пользователем сообщения будут храниться в базе данных Repl.it.

Бот также вернет случайную вдохновляющую цитату из API, когда кто-то наберет в чате сообщение «$inspire».

Мы начнем с добавления функции «$inspire».

Как добавить в бота вдохновляющие цитаты

Мы будем получать вдохновляющие цитаты из API под названием zenquotes.io. Нам нужно импортировать еще пару модулей Python, добавить функцию get_quote() и обновить код нашего бота, чтобы вызвать функцию.

Вот обновленный код. После кода я объясню новые части.

import discord
import os
import requests
import json

client = discord.Client()

def get_quote():
  response = requests.get("https://zenquotes.io/api/random")
  json_data = json.loads(response.text)
  quote = json_data[0]['q'] + " -" + json_data[0]['a']
  return(quote)

@client.event
async def on_ready():
  print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  if message.content.startswith('$inspire'):
    quote = get_quote()
    await message.channel.send(quote)

client.run(os.getenv('TOKEN'))

Теперь нам нужно импортировать модуль requests. Этот модуль позволяет нашему коду делать HTTP-запрос для получения данных из API. API возвращает JSON, и модуль json упрощает работу с возвращенными данными.

Функция get_quote() очень проста. Во-первых, она использует модуль запросов для запроса данных из URL-адреса API. API возвращает случайную вдохновляющую цитату. Эту функцию можно легко переписать для получения котировок из другого API, если текущий перестанет работать.

Затем внутри функции мы используем json.loads() для преобразования ответа API в JSON. Методом проб и ошибок я понял, как перевести цитату из JSON в нужный строковый формат. Цитата возвращается из функции в виде строки.

Последняя часть кода обновляется ближе к концу. Ранее он искал сообщение, которое начиналось с «$hello». Теперь он ищет «$inspire». Вместо того, чтобы возвращать «Hello!», Он получает цитату quote = get_quote() и возвращает цитату.

На этом этапе вы можете запустить свой код и попробовать его.

Как добавить в бота обнадеживающие сообщения

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

Как добавить грустные слова в бота

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

Добавьте следующую строку после создания переменной client:

sad_words = ["sad", "depressed", "unhappy", "angry", "miserable"]

Не стесняйтесь добавлять в список больше слов.

Как добавить в бота обнадеживающие сообщения

Теперь мы добавим список ободряющих сообщений, которыми бот ответит.

Добавьте следующий список после созданного вами списка sad_words:

starter_encouragements = [
  "Cheer up!",
  "Hang in there.",
  "You are a great person / bot!"
]

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

Как отвечать на сообщения

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

Теперь мы обновим функцию on_message(), чтобы проверять все сообщения, чтобы увидеть, содержат ли они слово из списка sad_words. Если будет найдено грустное слово, бот отправит случайное сообщение из списка.

Вот обновленный код:

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

  msg = message.content

  if msg.startswith('$inspire'):
    quote = get_quote()
    await message.channel.send(quote)
    
  if any(word in msg for word in sad_words):
    await message.channel.send(random.choice(starter_encouragements))

Это хорошее время для тестирования бота. Теперь вы знаете достаточно, чтобы создать собственного бота. 

В данной статье мы создадим Discord бот, используя при этом только Python.

Discord — это, фактически, универсальная платформа голосового и текстового общения для геймеров.

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

Хотя есть много вещей, которые вы можете создать с помощью API Discord, в этом руководстве мы остановимся на создании бота на Python.

Необходимые приготовления

Чтобы создать Discord бот, вам понадобится:

  1. Аккаунт в Discord и собственный сервер
  2. Python
  3. Устойчивое интернет-соединение во время всего процесса.

Что такое боты?

Бот (сокращение от «робот») — это программа, которая выполняет автоматические, повторяющиеся и заранее определенные задачи. Боты обычно имитируют человеческое поведение или подменяют его. Поскольку все их действия автоматизированы, они работают намного быстрее, чем обычные пользователи.

Боты очень часто используются для ответов на типовые вопросы, возникающие в различных сообществах. Они действуют как своего рода представители человека для выполнения различных функций. Основной особенностью такого бота является то, что он устраняет необходимость вручную отвечать каждому участнику и полностью автоматизирует данный процесс.

Для чего нужны чат-боты

Автоматизация ответов на основные вопросы

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

Ускорение рабочих процессов

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

Экономия денег и времени

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

[python_ad_block]

Пишем код для чат-бота

Сперва убедитесь, что на вашем компьютере установлен Python. Если его еще нет, то загрузите его с официального сайта.

Среду программирования можно использовать любую, какая вам больше нравится. Например, PyCharm, VS Code или Sublime.

Теперь идите на сайт Discord и откройте на нем Developer’s Section (раздел разработчика).

Теперь выберите опцию New application (новое приложение) в правом верхнем углу страницы и дайте вашему новому приложению имя. Как видите, можно даже добавить изображение к аватару вашего бота. Мы можем сделать это позже. Сейчас пойдем в раздел Bot (на странице слева) и выберем опцию Add bot (добавить бота).

Сделав это, перейдите в категорию OAuth2 и в секции scope выберите опцию bot. Далее идите в секцию Permissions и настройте разрешения по вашему выбору.

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

После этого установим библиотеку discord.

Для этого введем следующую команду:

pip install discord

Вот официальный сайт, где есть вся необходимая информация по данной библиотеке. Здесь же мы только заметим, что эта библиотека поддерживает API acync/await.

После установки этой библиотеки откройте ваш редактор кода и создайте файл bot.py.

Основная задача нашего тестового бота будет состоять в том, чтобы давать ответ всем пользователям на их сообщение «Hello». Но вы, конечно, можете его настроить в соответствии с вашими потребностями.

Для начала импортируем необходимые библиотеки:

import discord
from discord.ext import commands

Создадим переменную Client:

client = commands.Bot( command_prefix=" / " )

Обратите внимание, что вы можете выбрать любой префикс (например «>«, «.» и тому подобное).

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

Например, в нашем случае, чтобы вызвать бота, нужно написать /hello, а не просто hello.

Напишем следующий код для определения статуса бота:

@client.event
async def on_ready( ):
           print("Bot is ready")

Это сообщение будет отображаться всякий раз, когда вы размещаете своего бота в сети. Вы также можете проверить статус бота из самого Discord.

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

Теперь, когда бот готов к работе, мы можем ответить пользователям на их приветствие hello:

@client.event
async def hello( ):
          await ctx.send("Hi")

Эта функция задает условие, при котором, когда пользователь набирает /hello, бот отвечает hi.

Для запуска бота нам понадобится токен. Он находится в разделе Bot на сайте Discord. Мы заходили туда при создании бота.

client.run(" Token ")

Замените слово Token на ваш код. Сам токен находится рядом с аватором бота. Если вдруг его там нет, нажмите на надпись Click to Reveal Token. Это должно сработать.

Теперь настало время запустить нашего бота!

Откройте CMD и наберите следующую команду:

bot.py

Если так не выходит, то наберите вот это:

python bot.py

Если вы правильно выполнили все предыдущие шаги, то должны увидеть сообщение Bot is ready.

Теперь перейдем на наш сервер и введем тестовый запрос, который в нашем случае был /hello. Мы увидим, что наш бот отвечает нам Hi.

Точно таким же образом пишем бот для приветствия новых участников:

import os

import discord
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')

client = discord.Client()

@client.event
async def on_ready():
    print(f'{client.user.name} has joined Discord!')

@client.event
async def on_member_join(member):
    await member.create_dm()
    await member.dm_channel.send(
        f'Hello {member.name}!! Welcome to Our Discord Server!'
    )

client.run(TOKEN)

Возможные проблемы при создании бота

Все может быть не так просто, как это кажется на первый взгляд. Вы обязательно должны помнить о проблемах, с которыми можете столкнуться при создании бота. Некоторые из них мы перечислили ниже:

  1. Различные способы отправки текстовых сообщений. У всех людей есть свой стиль написания текстовых сообщений (короткие предложения, длинные предложения, несколько коротких предложений в разных сообщениях и так далее). Так что понять пользователя может быть непростой задачей.
  2. Пользовательские эмоции. Все мы люди, и всем нам свойственны эмоции. Наше поведение контролируется эмоциями. Мы чувствуем себя по-разному в разные моменты времени. И, кроме того, настроение постоянно меняется, и это отражается на сообщениях.
  3. Создание креативного и интерактивного пользовательского интерфейса (UI): Промежуток времени, за который можно привлечь внимание пользователя, очень невелик. Здесь в игру вступает диалоговый интерфейс. Его задача состоит в привлечении пользователей. То, как бот реагирует на сообщение пользователя, должно привлекать его внимание. Чем эффективнее мы это делаем, тем больше шансов, что бот снова будет востребован. Поэтому следует уделять особое внимание написанию ответов на запросы пользователей.

Заключение

Мы рассмотрели, как создать Discord бот на Python. Разумеется, это был простейший бот. Но вы, конечно же, можете написать свой собственный код и добавить множество различных функций, например OCR.

Спасибо за внимание и хорошего дня!

Перевод статьи «Build Your First Discord Bot Using Python».

Приветик всем! 👋
С вами я, Данил. Сегодня, мы с вами создадим своего собственного бота на языке программирования Python. Если кто не знает, что такое Python, почитать можно по ссылке:

Что ж, если вы все готовы, то начинаем! 🤟

Во первых, импортируем библиотеку которая называется Discord (Discord.py).

Для этого напишем вот такой простенький скрипт:

import discord
from discord.ext import commands

Как вы видите, тут не чего сложного.

Давайте припишем вот такую маленькую часть кода, напишем первую команду, и запустим бота:

bot = commands.Bot(command_prefix=»!»)
@bot.command()
async def say(ctx, arg):
ctx.send(arg)

Дальше, мы должны добыть токен для запуска бота.

Для этого переходим на этот сайт:

Там нажимаем кнопку New Application.

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

Дальше нажимаем пункт «Bot». Там нажимаем «Add bot». Потом соглашаемся на всё, и бот почти готов

У вас откроется такое окно:

После нажимаете кнопку «Copy». Таким способом вы копируете свой токен.

Что ж, вернёмся к скрипту. Осталось дописать одну строку и всё готово:

bot.run(«токен с сайта»)

Ну и наконец-то. Финальный этап. Возвращаемся к Developer Portal, и выбираем пункт OAuth2. После, нажимаем на кнопку URL-generator. Там выдаём боту право «bot», ну а после все его права на сервере.(Это: send messages). Потом копируем ссылку, которую он нам выдал, и вставляем её в браузер. В моём случае это Яндекс.

Там выбераем сервак и выставляем все права доступа.

В итоге он зайдёт на сервер. 🎉

Дальше запустим скрипт и увидим то, что наш бот прекрасно печатает слова на команду !say.

Поздравляю, вы написали своего первого бота на Python! 🎁

Ну что ж, я думаю, все разобрались. Если что-то не понятно — гуглите! Если вам это понравилось, фаловьтесь на мои соц-сети:
Twitter —

Discord —

Ну что, удачи! Всем пока! 😉

This page gives a brief introduction to the library. It assumes you have the library installed,
if you don’t check the Installing portion.

A Minimal Bot¶

Let’s make a bot that responds to a specific message and walk you through it.

It looks something like this:

# This example requires the 'message_content' intent.

import discord

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')

@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

client.run('your token here')

Let’s name this file example_bot.py. Make sure not to name it discord.py as that’ll conflict
with the library.

There’s a lot going on here, so let’s walk you through it step by step.

  1. The first line just imports the library, if this raises a ModuleNotFoundError or ImportError
    then head on over to Installing section to properly install.

  2. Next, we create an instance of a Client. This client is our connection to Discord.

  3. We then use the Client.event() decorator to register an event. This library has many events.
    Since this library is asynchronous, we do things in a “callback” style manner.

    A callback is essentially a function that is called when something happens. In our case,
    the on_ready() event is called when the bot has finished logging in and setting things
    up and the on_message() event is called when the bot has received a message.

  4. Since the on_message() event triggers for every message received, we have to make
    sure that we ignore messages from ourselves. We do this by checking if the Message.author
    is the same as the Client.user.

  5. Afterwards, we check if the Message.content starts with '$hello'. If it does,
    then we send a message in the channel it was used in with 'Hello!'. This is a basic way of
    handling commands, which can be later automated with the discord.ext.commands – Bot commands framework framework.

  6. Finally, we run the bot with our login token. If you need help getting your token or creating a bot,
    look in the Creating a Bot Account section.

Now that we’ve made a bot, we have to run the bot. Luckily, this is simple since this is just a
Python script, we can run it directly.

On Windows:

On other systems:

Now you can try playing around with your basic bot.

Понравилась статья? Поделить с друзьями:
  • Как написать бота для дискорда на python для музыки
  • Как написать бота для гта 5 рп
  • Как написать бота для вк на python для беседы
  • Как написать бота для вк на php
  • Как написать бота для ватсап