Как в discord.py сделать интерактивную кнопку со ссылкой?
Естественно, выдает ошибку. Не знаю, как это сделать..
Upd:
Попробовал такой вариант
button = Button(style=discord.ButtonStyle.url, label='Перейти', url=URL_IN_BUTTON) await interaction.response.send_message(content=text, ephemeral=True, view=button)
тоже не работает
- Вопрос задан 22 нояб. 2023
- 89 просмотров
1 комментарий
Простой 1 комментарий
Создание 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’а по разработки приложений. Далее создаём приложение с помощью кнопки New Application.
Нужно дополнить этот отдел информацией и изображениями
Шаг 2 — Hello World! [ ]
Напишем сначала просто код для того чтобы бот запускался.
import discord client = discord.Client() client.run("Insert here token of bot")
Кстати, токен бота обычно хранят в отдельном файле. Далее создаём событие через @client.event и пишем асинхронную функцию on_message.
@client.event async def on_message(message): if message.content.startswith(".hello"): await message.channel.send("Hello World!")
Также в разработке Discord ботов пример Hello World заменяется «Ping Pong». Выглядит так: пишешь команду ping, получаешь ответ Pong! Теперь напишем событие во время запуска. Оно необязательно, но благодаря ему можно узнать когда можно использовать бота + некоторые команды (например client.change_presence()) лучше использовать именно в этом событии.
@client.event async def on_ready(): print("I'm ready!")
Шаг 2.1 — Создание бота через commands.Bot() [ ]
Особо ничем не отличается т.к. является классом-наследником от Client, однако имеет возможности которые значительно облегчают разработку. Вот так выглядит обычный код с запуском бота и Ping Pong:
import discord from discord.ext import commands client = commands.Bot() @client.command() async def ping(ctx): await ctx.send("Pong!") client.run("Insert here token of bot")
В командах необходимо писать ctx даже если он не используется!
Вопросы с меткой [discord.py]
Я тестирую бота в Discord и пытаюсь получить текущее время в часах у пользователя, в каком часовом поясе он находиться не известно. Естественно datetime.now() и datetime.now(pytz.timezone(‘Europe/.
задан 24 июл 2021 в 12:55
2k показов
Как использовать кнопки и подсказки при вводе команд, присутствующие в верифицированных ботах в библиотеке discord.py
При использовании бота Juniper Bot я заметил кнопки, которых нет у обычных ботов, но эту функцию мне хотелось бы использовать. Можете пожалуйста сказать, как использовать изображённые снизу функцию (.
задан 25 июн 2021 в 14:04
4k показов
Как установить ограничение в использовании команды по роли Discord.py
Я делаю бота для Discord на Python с помощью модуля Discord.py. И мне нужно сделать так, чтобы определенную команду могли использовать только участники имеющие определенные роли. Я Пробовал перед .
задан 21 янв 2021 в 5:35
3k показов
Как отключить бота discord от голосового канала?
Есть проблема при отключении бота от голосового чата: import discord import asyncio from discord.ext import commands from discord.ext.commands import Bot Bot = commands.Bot(command_prefix=’!’) @Bot.
задан 27 сен 2019 в 22:51
Редактирование embed по нажатию кнопки
Пытаюсь повторить функцию, в которой по нажатию кнопки «голос пользователя» добавляется в определённый столбец Embed. (См. скрины 1 и 2) @bot.slash_command(description=»Создание .
задан 28 дек 2021 в 18:56
1k показов
Прямой вывод звука из Ютуб в канал дискорда
Хочу сделать музыкального бота сам. Но проблема в выводе звука. Он берет аргументы, ищет в ютубе, берет href первого видео и выдает ссылку. Я это сделал с помощью bs4 и requests. Дальше я хотел .
задан 8 дек 2019 в 23:14
79 показов
Ошибка при объявлении двух глобальных переменных
if message.content.lower().startswith(‘!m_change’): global DIR global MODE if (DIR == ‘arts/normal’ and MODE == ‘Обычный.’): DIR = ‘arts/hentai’ MODE = ‘Хентай.’ .
задан 19 дек 2020 в 11:46
Как вывести ошибку Forbidden discord.py
Здраствуйте! Не знаю как вывести ошибку discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions. Различные методы пробовал, через cog_command_error() и isinstance(error, .
задан 23 июн 2021 в 13:35
4k показов
Discord.py | Слэш команды
Моя проблема заключается в том что когда я хочу использовать слэш команду то ответ на неё появляется не сразу. Только после 2-х, 3-х раз использовании данной команды. Сперва появляется ошибка, а .
задан 23 июл 2021 в 16:24
239 показов
Как забанить участников у которых нет определённой роли discord.py?
Мне нужно забанить всех участников у которых нет определённой роли, но я не понимаю, как это сделать.
задан 13 апр 2021 в 19:07
3k показов
Как считать время проведенное в голосовом канале? | discord.py
У меня есть код, который реагирует на вход в голосовой, и выход из него. При входе пишется «1», при выходе «0». Как мне его изменить, чтобы он еще и считал время проведенное в .
задан 21 дек 2020 в 11:50
433 показа
Не работает команда random у бота на discord.py. В консоли пусто
Бот просто не отвечает на команду. Если не ввести первое или второе число, то он об этом напишет, а если ввести всё правильно, то следом не последуют никакой реакции, но при этом работают абсолютно .
задан 12 дек 2020 в 10:08
2k показов
Как получить информацию о том, какую роль в дискорде занимает человек discord.py
Как в коде python с помощью библиотеки discord.py получить сведения о том, какую роль занимает человек?
задан 24 фев 2020 в 13:48
392 показа
Как узнать, что в голосовом канале, кроме бота, больше никого нет? [discord-py]
Использую библиотеку discord.py, событие на вход/выход пользователей определять умею, а вот как узнать, что в канале больше никого нет кроме бота? Каким образом это можно реализовать? Код для события .
задан 13 янв 2021 в 7:21
260 показов
Магазин на Discord.py
Я пишу магазин для своего сервера Discord. У меня возникла проблема с добавлением роли в магазин. Буду очень благодарен, если вы мне поможете. @Client.command() async def shop(ctx, value=None, price=.