Создание discord-ботов на Python
В этой статье мы создаем своего дискорд-бота на боксе с нуля.
Подготовка
Предварительные действия на боксе такие же, как и в нашей статье про Telegram:
- выбираем бокс
- создаем пользователя
- настраиваем окружение
Регистрация бота
Создание бота происходит в два этапа на сайте мессенджера. Сначала создаем приложение: «Разработчикам»(в футере) → «Applications», нажимаем кнопку «New Application» в правой верхней части страницы:

Выбираем имя приложения (выбирайте мудро, хоть его и можно изменить позже):

Готово. Здесь можно переименовать приложение, дать описание, загрузить аватарку:

Теперь добавим к нему бота. В меню слева вкладка «Bot» → «Add Bot» → «Yes, do it!».
Токен бота можно получить по кнопке Copy:

Если вдруг токен попал не только в ваши руки, его всегда можно заменить кнопкой Regenerate.
Добавление бота на сервер
Переходим на вкладку «OAuth2» и создаем для него свой URL для приглашения:

Чуть ниже выбираем права для бота. Если это бот для администрирования сервера, то можно, конечно, выбрать «Administrator», но нужно быть осторожными с этим.
Выдаем права, действительно нужные боту для администрирования сервера:

Теперь бота можно добавить на сервер. Копируем ссылку и открываем её в браузере. В диалоговом окне выбираем сервер:

Проверяем его привилегии:

Всё, бот на сервере:

Код бота
Активируем виртуальное окружение и ставим нужную библиотеку:
bot@box-48639:~$ source python/bin/activate (python) bot@box-48639:~$ pip install discord
Добавляем директорию для бота, не выходя виртуального окружения:
(python) bot@box-48639:~$ mkdir discobot
Создаем конфиг бота:
(python) bot@box-48639:~$ vim discobot/config.py
Наполняем его содержимым
settings =
- token — токен бота
- bot — имя бота
- id — application ID: он находится под описанием приложения, в разделе «General Information»
- prefix — если сообщение на сервере начинается с этого символа, бот воспримет его как свою команду.
Дальше код бота. Создаем bot.py и сразу редактируем его vim’ом:
(python) bot@box-48639:~$ vim discobot/bot.py
Первыми строками активируем виртуальное окружение и импортируем нужные модули:
import os, sys activate_this = '/home/bot/python/bin/activate_this.py' with open(activate_this) as f: exec(f.read(), ) import discord from discord.ext import commands from config import settings
Обозначаем боту, с какого символа начинаются его команды:
bot = commands.Bot(command_prefix = settings['prefix'])
И создаем первую команду — бот будет отправлять реплай с текстом “I’M ALIVE!” на сообщение “!status”:
@bot.command() async def status(ctx): await ctx.reply('I\’M ALIVE!')
Добавляем в код функцию запуска:
bot.run(settings['token'])
Закрываем редактор и запускаем бота:
(python) bot@box-48639:~$ python discobot/bot.py
Отправим сообщение в Discord:

Код бота целиком:
import os, sys activate_this = '/home/bot/python/bin/activate_this.py' with open(activate_this) as f: exec(f.read(), ) import discord from discord.ext import commands from config import settings bot = commands.Bot(command_prefix = settings['prefix']) @bot.command() async def status(ctx): author = ctx.message.author await ctx.reply('I\'M ALIVE!') bot.run(settings['token'])
Запуск бота
Создаем Linux-демона — он будет следить, что бот работает. Открываем файл (mlg, если нужно, меняем на своё имя сервиса):
root@box-48639:~# vim /etc/systemd/system/mlg.service
Добавляем в него строки:
[Unit] Description=Noscope Bot After=syslog.target After=network.target [Service] Type=simple User=bot WorkingDirectory=/home/bot/discobot ExecStart=/usr/bin/python3 /home/bot/discobot/bot.py Restart=always [Install] WantedBy=multi-user.target
И запускаем демона:
root@box-48639:~# systemctl daemon-reload root@box-48639:~# systemctl enable mlg root@box-48639:~# systemctl start mlg
Проверить, что всё работает, можно так:
root@box-48639:~# systemctl status mlg
● mlg.service - Noscope Bot Loaded: loaded (/etc/systemd/system/mlg.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-05-05 16:34:46 MSK; 7s ago Main PID: 307021 (python3) Tasks: 3 (limit: 2344) Memory: 21.4M CGroup: /system.slice/mlg.service └─307021 /usr/bin/python3 /home/bot/discobot/bot.py
Дополнение кода бота
Бот улучшается в два этапа:
- добавляем код в файл бота
- перезапускаем бота
Для примера добавим в бота какое-нибудь рандомное API. Открываем файл бота:
bot@box-48639:~$ vim ~/discobot/bot.py
И добавляем в него пару библиотек и ещё одну функцию обработки команд:
import json import requests @bot.command() async def meme(ctx): response = requests.get('https://some-random-api.ml/meme') json_data = response.json() embed = discord.Embed(title = json_data['caption']) embed.set_image(url = json_data ['image']) await ctx.send(embed = embed)
Закрываем файл и перезапускаем демона, чтобы изменения вступили в силу:
root@box-48639:~# systemctl restart mlg
Результатом будет рандомный мем:

Готово! Боты в Discord умеют многое, и мы можем и дальше расширять его возможности, изучая документацию.
Полезные ссылки
- Официальная документация Discord
- Документация discord.py
- GitHub разработчиков модуля
Статусы в discord-py
Как зделать кастомный статус в discord-py? В документации я нашел атрибут CustomActivity для активности, и поидеи он должен работать как кастомный статус, но так и не работает,вот код:
await bot.change_presence(status=discord.Status.online, activity=discord.CustomActivity(sttstxtf))
Если вместо CustomActivity подставить Game то все работает А ещё хотелось бы узнать как сделать: бот слушает, и бот смотрит
Отслеживать
задан 6 июн 2022 в 16:52
user451780 user451780
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
await bot.change_presence(status = discord.Status.online, activity = discord.Activity(name = f'текст', type = discord.ActivityType.playing)) #Идёт инфа о команде помощи await asyncio.sleep(99) await bot.change_presence(status = discord.Status.idle, activity = discord.Activity(name = f'за серверами', type = discord.ActivityType.watching)) #Инфа о количестве серверов, на котором находится бот. await asyncio.sleep(99) members = 0 for guild in bot.guilds: for member in guild.members: members += 1 await bot.change_presence(status = discord.Status.idle, activity = discord.Activity(name = f'за участниками', type = discord.ActivityType.watching)) #Общее количество участников, за которыми следит бот (Находятся на серверах) await asyncio.sleep(99)
Статус: (online — онлайн) (idle — отошёл) (dnd — не беспокоить)
Гайд Создание бота для дискорда
1) Изначальная подготовка (Обязательная часть) 1.1)Скачиваем Python *тык* (При установке обязательно добавляем в PATH)
1.2)Открываем консоль (cmd) и прописываем в неё: «pip install discord.py»
2) Написание бота
2.1 ) В любом удобном для нас месте создаём папку (для удобства можно назвать её именем бота)
2.2 ) В этой папке создаём файлы «bot.py» и «config.py»
2.3 ) С помощью текстового редактора открываем config.py и пишем в него настройки нашего бота:
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 и пишем импорты
import discord # Импорт библиотеки discord.py from discord.ext import commands # Импорт из библиотеки discord.py библиотеки commands from config import settings # Импорт из файла config.py словаря конфигураций
2.5 ) После импортов пишем следующее :
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» пишем:
@client.event # Объявление события async def on_ready(): # Объявление асинхронной функции print (f"Logged on as ") # Сообщение в консоль при готовности бота (https://prnt.sc/uog9bz) await client.change_presence(status=discord.Status.online, activity=discord.Streaming(name=f'help', url='https://www.twitch.tv/unknowpage')) # Статус бота (Для примера выбрал стриминг) # Cообщение/команда которая отображается в статусе у бота (https://prnt.sc/uog6r6), меняется с помощью: name=f'help' (Пример: name=f'Hello world!') (https://prnt.sc/uog9hx)
2.6 ) Давайте добавим новую команду с выводом результата через обычное сообщение:
# Пример команды с выводом результата через обычное сообщение: # 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'Понг! `ms` :ping_pong:') # Редактирование первого сообщения на итоговое (на сам пинг) print(f'[Logs:utils] Пинг сервера был выведен | ping') # Информация в консоль, что команда "ping" была использована print(f'[Logs:utils] На данный момент пинг == ms | ping') # Вывод пинга в консоль #Итог: https://prnt.sc/uogljj
2.7 ) Давайте добавим новую команду с выводом результата через embed:
# Пример команды с выводом результата через 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'`хелп` `инфо` `сервер` `профиль` `авторы` ', inline=False) emb.add_field( name = 'Модерирование', value = f'`мут` `размут` `бан` `кик` `очистить` ', 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' © 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] Справка по командам была успешно выведена | help ') # Информация в консоль, что команда "help" была использована # Итог: https://prnt.sc/uoh6v6
2.8 ) Добавление аргументов асинхронной функции и реакции на сообщение:
# Добавление аргументов асинхронной функции, реакции на сообщение: #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'Пользователь был кикнут по причине < 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] Пользователь был кикнут по причине | 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'**Команда "кик"**', 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.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" © Copyright 2020 | Все права защищены" ) await ctx.send ( embed = emb) print(f"[Logs:error] Необходимо указать участника | kick") #Итог: https://prnt.sc/uohttb if isinstance (error, commands.MissingPermissions):# Недостаточно прав emb = discord.Embed( title = f'**Команда "кик"**', 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" © Copyright 2020 | Все права защищены" ) await ctx.send ( embed = emb) print(f"[Logs:Error] [Ошибка доступа] Пользователь [] попытался кикнуть | kick") #Итог: https://prnt.sc/uohueb
2.9 ) Проанализировав текст написанный выше, вы теперь знаете, как пишутся простейшие команды на discord.py. Для улучшения своих знаний советую почитать официальную документацию discord.py или посмотреть какие-либо видеоролики на эту тематику
begor
owned by nixer1337
1) Изначальная подготовка (Обязательная часть)
1.1)Скачиваем Python *тык* (При установке обязательно добавляем в PATH)
1.2)Открываем консоль (cmd) и прописываем в неё: «pip install discord.py»
2) Написание бота
2.1 ) В любом удобном для нас месте создаём папку (для удобства можно назвать её именем бота)
2.2 ) В этой папке создаём файлы «bot.py» и «config.py»
2.3 ) С помощью текстового редактора открываем config.py и пишем в него настройки нашего бота:
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 и пишем импорты
import discord # Импорт библиотеки discord.py from discord.ext import commands # Импорт из библиотеки discord.py библиотеки commands from config import settings # Импорт из файла config.py словаря конфигураций
2.5 ) После импортов пишем следующее :
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» пишем:
@client.event # Объявление события async def on_ready(): # Объявление асинхронной функции print (f"Logged on as ") # Сообщение в консоль при готовности бота (https://prnt.sc/uog9bz) await client.change_presence(status=discord.Status.online, activity=discord.Streaming(name=f'help', url='https://www.twitch.tv/unknowpage')) # Статус бота (Для примера выбрал стриминг) # Cообщение/команда которая отображается в статусе у бота (https://prnt.sc/uog6r6), меняется с помощью: name=f'help' (Пример: name=f'Hello world!') (https://prnt.sc/uog9hx)
2.6 ) Давайте добавим новую команду с выводом результата через обычное сообщение:
# Пример команды с выводом результата через обычное сообщение: # 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'Понг! `ms` :ping_pong:') # Редактирование первого сообщения на итоговое (на сам пинг) print(f'[Logs:utils] Пинг сервера был выведен | ping') # Информация в консоль, что команда "ping" была использована print(f'[Logs:utils] На данный момент пинг == ms | ping') # Вывод пинга в консоль #Итог: https://prnt.sc/uogljj
2.7 ) Давайте добавим новую команду с выводом результата через embed:
# Пример команды с выводом результата через 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'`хелп` `инфо` `сервер` `профиль` `авторы` ', inline=False) emb.add_field( name = 'Модерирование', value = f'`мут` `размут` `бан` `кик` `очистить` ', 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' © 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] Справка по командам была успешно выведена | help ') # Информация в консоль, что команда "help" была использована # Итог: https://prnt.sc/uoh6v6
2.8 ) Добавление аргументов асинхронной функции и реакции на сообщение:
# Добавление аргументов асинхронной функции, реакции на сообщение: #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'Пользователь был кикнут по причине < 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] Пользователь был кикнут по причине | 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'**Команда "кик"**', 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.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" © Copyright 2020 | Все права защищены" ) await ctx.send ( embed = emb) print(f"[Logs:error] Необходимо указать участника | kick") #Итог: https://prnt.sc/uohttb if isinstance (error, commands.MissingPermissions):# Недостаточно прав emb = discord.Embed( title = f'**Команда "кик"**', 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" © Copyright 2020 | Все права защищены" ) await ctx.send ( embed = emb) print(f"[Logs:Error] [Ошибка доступа] Пользователь [] попытался кикнуть | kick") #Итог: https://prnt.sc/uohueb
2.9 ) Проанализировав текст написанный выше, вы теперь знаете, как пишутся простейшие команды на discord.py. Для улучшения своих знаний советую почитать официальную документацию discord.py или посмотреть какие-либо видеоролики на эту тематику
Статус бота в дискорд через python
C:\Users\comp\Desktop\Новая папка (2)>py bot.py
Bot FluffyBOT#4006 is ready to use!
Ignoring exception in on_ready
Traceback (most recent call last):
File «C:\Users\comp\AppData\Local\Programs\Python\Python311\Lib\site-packages\disnake\client.py», line 705, in _run_event
await coro(*args, **kwargs)
File «C:\Users\comp\Desktop\Новая папка (2)\bot.py», line 15, in on_ready
await bot.change_presence(status=discord.Status.idle, activity=discord.Game(«info»))
File «C:\Users\comp\AppData\Local\Programs\Python\Python311\Lib\site-packages\disnake\client.py», line 1723, in change_presence
await self.ws.change_presence(activity=activity, status=status_str)
File «C:\Users\comp\AppData\Local\Programs\Python\Python311\Lib\site-packages\disnake\gateway.py», line 772, in change_presence
raise TypeError(«activity must derive from BaseActivity.»)
TypeError: activity must derive from BaseActivity.
Вот такая ошибка, без понятия что делать. Discord.py подключен и Disnake тоже.
Голосование за лучший ответ
в документации диснейка написано
await client.change_presence(status=disnake.Status.idle, activity=disnake.Game(«with the API»))
попробуй просто discord на disnake поменять я хз
объект activity не является наследником BaseActivity. крч создать объект типа discord.Game , который является наследником BaseActivity.
import disnake
from disnake.ext import commands
bot = commands.Bot(command_prefix=".",help_command=None, intents=disnake.Intents.all())
@bot.event
async def on_ready():
await bot.change_presence(activity=disnake.Game(name="info"), status=disnake.Status.idle)
print(f"Bot бот готов пахать")
bot.run("")