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

Undetected
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2019
Сообщения
178
Реакции[?]
63
Поинты[?]
8K
Увидел тему popCat и решил сделать более подробный гайд

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:
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:
import discord # Импорт библиотеки discord.py
from discord.ext import commands # Импорт из библиотеки discord.py библиотеки commands
from config import settings # Импорт из файла config.py словаря конфигураций
2.5) После импортов пишем следующее :
Python:
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:
@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:
# Пример команды с выводом результата через обычное сообщение:
# 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:
# Пример команды с выводом результата через 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:
# Добавление аргументов асинхронной функции, реакции на сообщение:
#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
 

Вложения

  • 3.7 KB Просмотры: 597
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
22 Июн 2017
Сообщения
223
Реакции[?]
135
Поинты[?]
0
для новичков пойдёт хорошая работа

ток юзай словарь для цветов пинга т.к будет чище код (остальное не смотрел, в глаз попало) и пользуйся cogsами под каждый подраздел/как тебе угодно, тоже сделает код чище
 
аоууеоооы
Пользователь
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
67
Реакции[?]
33
Поинты[?]
2K
Реально подробнее чем у меня :orehus:
Я даже не понял половину
 
Забаненный
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
19
Реакции[?]
1
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
иссуе тупа
1610332323439.png
 
Забаненный
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
19
Реакции[?]
1
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Забаненный
Статус
Оффлайн
Регистрация
23 Окт 2020
Сообщения
19
Реакции[?]
1
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1610414933162.png
не, ну я не исключаю что я бабулех, но что не так, я просто написал $help
а всё, решил
 
Сверху Снизу