Гайд Создание бота для дискорда [Python]

Undetected
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2019
Сообщения
187
Реакции
65
Увидел тему @ImGoose и решил сделать более подробный гайд

1) Изначальная подготовка (Обязательная часть)
1.1)Скачиваем Python
Пожалуйста, авторизуйтесь для просмотра ссылки.
(При установке обязательно добавляем в PATH)
1.2)Открываем консоль (cmd) и прописываем в неё: "pip install discord.py"
1.3.1)Заходим на сайт Discord Developers
Пожалуйста, авторизуйтесь для просмотра ссылки.

1.3.2)Нажимаем на кнопку "New Application"
1.3.3) В появившемся окне вводим имя нашего приложения и нажимаем "Сreate".
1.3.4) Во вкладке "General Information" можно сменить имя и аватарку нашего приложения (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
1.3.5) Заходим в "Bot", нажимаем кнопку "Add bot"
1.3.5.1) Так же во вкладке "Bot" вы всегда сможете сменить имя и аватарку бота (
Пожалуйста, авторизуйтесь для просмотра ссылки.
) P.S. Рекомендую ставить такое же имя и аватарку как у приложения
1.3.6) Заходим в "OAuth2" и ставим галочки как у меня (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
1.3.7) Теперь переходим по получившейся ссылке (
Пожалуйста, авторизуйтесь для просмотра ссылки.
) и добавляем бота на свой сервер (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)

2) Написание бота

2.1) В любом удобном для нас месте создаём папку (для удобства можно назвать её именем бота)
2.2) В этой папке создаём файлы "bot.py" и "config.py"
2.3) С помощью текстового редактора открываем config.py и пишем в него настройки нашего бота:

Python:
Expand Collapse Copy
settings = {
    'TOKEN': 'BOT TOKEN', # Получение токена - https://prnt.sc/uofhur
    'NAME BOT': 'BOT NAME', # Имя вашего бота
    'ID': 'BOT ID', # Получение ID - https://prnt.sc/uofik2
    'PREFIX': '$', # Префикс
    'OWNER':'BOT OWNER',    # ИЗМЕНЯЙТЕ НА СВОЙ NICK:ID (Пример: Toil#5605)
    'OWNER NAME':'OWNER NAME' # ИМЯ ВЛАДЕЛЬЦА (Пример: Toil)
}

2.4) С помощью текстового редактора открываем bot.py и пишем импорты
Python:
Expand Collapse Copy
import discord # Импорт библиотеки discord.py
from discord.ext import commands # Импорт из библиотеки discord.py библиотеки commands
from config import settings # Импорт из файла config.py словаря конфигураций
2.5) После импортов пишем следующее :
Python:
Expand Collapse Copy
prefix = settings['PREFIX'] # Получение переменной "prefix" из нашего config.py

client = commands.Bot(command_prefix = settings['PREFIX']) # Создаем переменную client используемую для всех наших взаимодействий с ботом
client.remove_command('help') # Удаляем изначальную команду "help"

client.run (settings['TOKEN']) #Убираем в самый конец файла и больше не трогаем (нужен для запуска бота)

2.5) После client.remove_command('help') # Удаляем изначальную команду "help" пишем:
Python:
Expand Collapse Copy
@client.event # Объявление события
async def on_ready(): # Объявление асинхронной функции
    print (f"Logged on as {settings['NAME BOT']}") # Сообщение в консоль при готовности бота (https://prnt.sc/uog9bz)

    await client.change_presence(status=discord.Status.online, activity=discord.Streaming(name=f'{prefix}help', url='https://www.twitch.tv/unknowpage')) # Статус бота (Для примера выбрал стриминг)
    # Cообщение/команда которая отображается в статусе у бота (https://prnt.sc/uog6r6), меняется с помощью: name=f'{prefix}help' (Пример: name=f'Hello world!') (https://prnt.sc/uog9hx)


2.6) Давайте добавим новую команду с выводом результата через обычное сообщение:

Python:
Expand Collapse Copy
# Пример команды с выводом результата через обычное сообщение:
# Ping
@client.command(aliases = ['Ping', 'PING', 'pING', 'ping', 'Пинг', 'ПИНГ', 'пИНГ', 'пинг', 'Понг', 'ПОНГ', 'пОНГ', 'понг'])
#@client.command - объявление команды | (aliases = ['Ping', 'PING' ...]) - Альтернативное название команды
async def __ping(ctx): # Объявление асинхронной функции __ping с возможностью публикации сообщения
    ping = client.ws.latency # Получаем пинг клиента

    ping_emoji = '?????' # Эмоция пинга, если он меньше 100ms

    if ping > 0.10000000000000000:
        ping_emoji = '?????' # Эмоция пинга, если он больше 100ms

    if ping > 0.15000000000000000:
        ping_emoji = '?????' # Эмоция пинга, если он больше 150ms

    if ping > 0.20000000000000000:
        ping_emoji = '?????' # Эмоция пинга, если он больше 200ms

    if ping > 0.25000000000000000:
        ping_emoji = '?????' # Эмоция пинга, если он больше 250ms

    if ping > 0.30000000000000000:
        ping_emoji = '?????' # Эмоция пинга, если он больше 300ms

    if ping > 0.35000000000000000:
        ping_emoji = '?????' # Эмоция пинга, если он больше 350ms

    message = await ctx.send('Пожалуйста, подождите. . .') # Переменная message с первоначальным сообщением
    await message.edit(content = f'Понг! {ping_emoji} `{ping * 1000:.0f}ms` :ping_pong:') # Редактирование первого сообщения на итоговое (на сам пинг)
    print(f'[Logs:utils] Пинг сервера был выведен | {prefix}ping') # Информация в консоль, что команда "ping" была использована
    print(f'[Logs:utils] На данный момент пинг == {ping * 1000:.0f}ms | {prefix}ping') # Вывод пинга в консоль
    #Итог: https://prnt.sc/uogljj

2.7) Давайте добавим новую команду с выводом результата через embed:

Python:
Expand Collapse Copy
# Пример команды с выводом результата через embed:
# Help
@client.command(aliases = ['Help', 'help', 'HELP', 'hELP', 'хелп', 'Хелп', 'ХЕЛП', 'хЕЛП'])
async def __help (ctx):
    emb = discord.Embed( title = 'ДОСТУПНЫЕ КОМАНДЫ:', description = 'ВНИМАНИЕ! Бот ещё в разработке!', colour = discord.Color.red() )
    # title - Жирный крупный текст (Заголовок) | description - Текст под заголовком | colour - Цвет полоски

    emb.set_author(name = ctx.author.name, icon_url = ctx.author.avatar_url)
    # Отображает: ctx.author.name - Имя отправителя, ctx.author.avatar_url - Аватар отправителя
    emb.add_field( name = 'Информация', value = f'`{prefix}хелп` `{prefix}инфо` `{prefix}сервер` `{prefix}профиль` `{prefix}авторы` ', inline=False)
    emb.add_field( name = 'Модерирование', value = f'`{prefix}мут` `{prefix}размут` `{prefix}бан` `{prefix}кик` `{prefix}очистить` ', inline=False)
    # Отображаемый блок текста. name - Жирный крупный текст | value - обычный текст под "name" | inline = True - Блоки текста будут в одну строку (https://prnt.sc/uogw2x) / inline = False - Блоки текста будут один под другим (https://prnt.sc/uogx3t)
    emb.set_thumbnail(url = client.user.avatar_url)
    # emb.set_thumbnail - Добавляет картинку около текста (Например: emb.set_thumbnail(url = "https://icons.iconarchive.com/icons/elegantthemes/beautiful-flat-one-color/128/unlocked-icon.png") (NOAD) добавит картинку замка (https://prnt.sc/uogztb) | client.user.avatar_url - Отображает аватарку бота
    emb.set_footer( icon_url = ctx.guild.owner.avatar_url, text = f'{ctx.guild.owner.name} © Copyright 2020 | Все права защищены' )
    # emb.set_thumbnail - Добавляет картинку под текстом | ctx.guild.owner.avatar_url - Аватарка создателя сервера | ctx.guild.owner.name - Имя создателя сервера

    await ctx.send ( embed = emb)
    # Отправляет сообщение и так же преобразует emb в embed

    print(f'[Logs:info] Справка по командам была успешно выведена | {prefix}help ')
    # Информация в консоль, что команда "help" была использована
    # Итог: https://prnt.sc/uoh6v6

2.8) Добавление аргументов асинхронной функции и реакции на сообщение:
Python:
Expand Collapse Copy
# Добавление аргументов асинхронной функции, реакции на сообщение:
#Kick
@client.command(aliases = ['кик', 'Кик', 'кИК', 'КИК', 'Kick', 'kICK', 'KICK', 'kick'])
@commands.has_permissions ( administrator = True ) # Команда только для пользователей имеющих роль с правами "Администратор"
async def __kick(ctx, member: discord.Member, *, reason = None): # Асинхронная функция __kick(ctx, member: discord.Member, *, reason = None)
    #Аргументы: ctx - отправка сообщения с помощью команды (Обязательно)
    #Аргументы: member: discord.Member - "member" ----- можно изменить, но не забывайте изменять аргумент в самой командеr (Discord.Member - для получения id указанного пользователя)
    #Аргументы: * - предшествующий аргумент необходим
    #Аргументы: reason = None - "reason" ----- можно изменить, но не забывайте изменять аргумент в самой команде, "None" - значение по умолчанию
    await ctx.message.add_reaction('✅') # Добавляет реакцию к сообщению с командой
    await member.kick( reason = reason ) # Кикнуть пользователя по причине (Преобразует причину бота в причину дискорда)
    emb = discord.Embed( title = 'kick', description = f'Пользователь {member}  был кикнут по причине { reason } ', colour = discord.Color.red() )
    emb.set_author( name = client.user.name )
    emb.set_footer( text = ctx.author.name, icon_url = ctx.author.avatar_url )
    emb.set_thumbnail(url = client.user.avatar_url)

    await ctx.send( embed = emb )

    print(f'[Logs:moderation] Пользователь {member} был кикнут по причине {reason} | {prefix}kick ')
    # Итог: https://prnt.sc/uohdqh и https://prnt.sc/uohf5a


@__kick.error # Объявление ошибки в команде
async def kick_error(ctx, error): # ctx - обязательно! error - можно изменить, но не забывайте изменять аргумент в самой команде
    if isinstance ( error, commands.MissingRequiredArgument): # Недостаточно аргументов
        emb = discord.Embed( title = f'**Команда "{prefix}кик"**', description = f'Изгоняет указаного участника с сервера с возможностью возвращения ', colour = discord.Color.red() )
        emb.set_author(name = ctx.author.name, icon_url = ctx.author.avatar_url)
        emb.add_field( name = 'Использование', value = "!кик <@⁣Участник | ID>", inline=False)
        emb.add_field( name = 'Пример', value = "`!кик @⁣Участник`\n┗ Кикнет указаного участника.", inline=False)
        emb.set_thumbnail(url = client.user.avatar_url)
        emb.set_footer( icon_url = ctx.guild.owner.avatar_url, text = f"{settings['OWNER NAME']} © Copyright 2020 | Все права защищены"   )
        await ctx.send ( embed = emb)
        print(f"[Logs:error] Необходимо указать участника | {prefix}kick")
        #Итог: https://prnt.sc/uohttb
    if isinstance (error, commands.MissingPermissions):# Недостаточно прав
        emb = discord.Embed( title = f'**Команда "{prefix}кик"**', description = f'Изгоняет указаного участника с сервера с возможностью возвращения ', colour = discord.Color.red() )
        emb.set_author(name = ctx.author.name, icon_url = ctx.author.avatar_url)
        emb.add_field( name = 'ОШИБКА!', value = "У вас недостаточно прав!", inline=False)
        emb.set_thumbnail(url = client.user.avatar_url)
        emb.set_footer( icon_url = ctx.guild.owner.avatar_url, text = f"{settings['OWNER NAME']} © Copyright 2020 | Все права защищены"   )
        await ctx.send ( embed = emb)
        print(f"[Logs:Error] [Ошибка доступа] Пользователь [{ctx.author}] попытался кикнуть | {prefix}kick")
        #Итог: https://prnt.sc/uohueb
2.9) Проанализировав текст написанный выше, вы теперь знаете, как пишутся простейшие команды на discord.py. Для улучшения своих знаний советую почитать
Пожалуйста, авторизуйтесь для просмотра ссылки.
или посмотреть какие-либо видеоролики на эту тематику
Если кому-нибудь нужен исходник, прикрепил. Не знаю нужен VT для .py или нет, но на всякий случай вот:
Пожалуйста, авторизуйтесь для просмотра ссылки.
и
Пожалуйста, авторизуйтесь для просмотра ссылки.

Если допустил какие-либо ошибки, пишите исправлю

UPD: Обновил под discord.py 1.5.1
 

Вложения

  • Bot.zip
    Bot.zip
    3.7 KB · Просмотры: 608
Последнее редактирование:
для новичков пойдёт хорошая работа

ток юзай словарь для цветов пинга т.к будет чище код (остальное не смотрел, в глаз попало) и пользуйся cogsами под каждый подраздел/как тебе угодно, тоже сделает код чище
 
Реально подробнее чем у меня :orehus:
Я даже не понял половину
 
все на автомате?
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
иссуе тупа
1610332323439.png
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1610414933162.png

не, ну я не исключаю что я бабулех, но что не так, я просто написал $help
а всё, решил
 
Назад
Сверху Снизу