Как написать музыкального бота для discord на питоне
Перейти к содержимому

Как написать музыкального бота для discord на питоне

  • автор:

Музыкальный бот для Discord на Python

Написал музыкального бота, который при команде -play (link) входит в голосовой канал, но не включает музыку, а выдает ошибку Код:

import discord from discord.ext import commands import pafy import logging import youtube_dl logging.basicConfig(filename='bot.log', level=logging.INFO) TOKEN = 'token' PREFIX = '-' intents = discord.Intents.all() intents.members = True bot = commands.Bot(command_prefix=PREFIX, intents=intents) @bot.event async def on_ready(): print(f'Logged in as ') @bot.event async def on_message(message): if message.content.lower() == 'привет': await message.channel.send('Привет!') await bot.process_commands(message) @bot.command() async def play(ctx, url: str): if not ctx.author.voice: return await ctx.send("Вы не подключены к голосовому каналу!") voice_channel = ctx.author.voice.channel if ctx.voice_client is None: vc = await voice_channel.connect() else: await ctx.voice_client.move_to(voice_channel) vc = ctx.voice_client video = pafy.new(url) best = video.getbestaudio() source = await discord.FFmpegOpusAudio.from_probe(best.url, method='fallback') vc.play(source) @bot.command() async def leave(ctx): if ctx.voice_client: await ctx.guild.voice_client.disconnect() else: await ctx.send("Бот не подключен к голосовому каналу.") logging.info('Bot Online') bot.run(TOKEN) 

Ошибка:

ERROR discord.ext.commands.bot Ignoring exception in command play Traceback (most recent call last): File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\YoutubeDL.py", line 815, in wrapper return func(self, *args, **kwargs) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\YoutubeDL.py", line 836, in __extract_info ie_result = ie.extract(url) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\extractor\common.py", line 534, in extract ie_result = self._real_extract(url) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\extractor\youtube.py", line 1794, in _real_extract 'uploader_id': self._search_regex(r'/(?:channel|user)/([^/?&#]+)', owner_profile_url, 'uploader id') if owner_profile_url else None, File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\extractor\common.py", line 1012, in _search_regex raise RegexNotFoundError('Unable to extract %s' % _name) youtube_dl.utils.RegexNotFoundError: Unable to extract uploader id; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "a:\Work\piton\discord3\venv\lib\site-packages\discord\ext\commands\core.py", line 229, in wrapped ret = await coro(*args, **kwargs) File "a:\Work\piton\discord3\main.py", line 37, in play info = ytdl.extract_info(url, download=False) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\YoutubeDL.py", line 808, in extract_info return self.__extract_info(url, ie, download, extra_info, process) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\YoutubeDL.py", line 824, in wrapper self.report_error(compat_str(e), e.format_traceback()) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\YoutubeDL.py", line 628, in report_error self.trouble(error_message, tb) File "a:\Work\piton\discord3\venv\lib\site-packages\youtube_dl\YoutubeDL.py", line 598, in trouble raise DownloadError(message, exc_info) youtube_dl.utils.DownloadError: ERROR: Unable to extract uploader id; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output. The above exception was the direct cause of the following exception: Traceback (most recent call last): File "a:\Work\piton\discord3\venv\lib\site-packages\discord\ext\commands\bot.py", line 1350, in invoke await ctx.command.invoke(ctx) File "a:\Work\piton\discord3\venv\lib\site-packages\discord\ext\commands\core.py", line 1023, in invoke await injected(*ctx.args, **ctx.kwargs) # type: ignore File "a:\Work\piton\discord3\venv\lib\site-packages\discord\ext\commands\core.py", line 238, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: DownloadError: ERROR: Unable to extract uploader id; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see https://yt-dl.org/update on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output. 

Как сделать музыкального бота в Discord?

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

60ae95992ec62845244225.png

import asyncio import discord import youtube_dl from discord.ext import commands # Suppress noise about console usage from errors youtube_dl.utils.bug_reports_message = lambda: '' ytdl_format_options = < 'format': 'bestaudio/best', 'outtmpl': '%(extractor)s-%(id)s-%(title)s.%(ext)s', 'restrictfilenames': True, 'noplaylist': True, 'nocheckcertificate': True, 'ignoreerrors': False, 'logtostderr': False, 'quiet': True, 'no_warnings': True, 'default_search': 'auto', 'source_address': '0.0.0.0' # bind to ipv4 since ipv6 addresses cause issues sometimes >ffmpeg_options = < 'options': '-vn' >ytdl = youtube_dl.YoutubeDL(ytdl_format_options) class YTDLSource(discord.PCMVolumeTransformer): def __init__(self, source, *, data, volume=0.5): super().__init__(source, volume) self.data = data self.title = data.get('title') self.url = data.get('url') @classmethod async def from_url(cls, url, *, loop=None, stream=False): loop = loop or asyncio.get_event_loop() data = await loop.run_in_executor(None, lambda: ytdl.extract_info(url, download=not stream)) if 'entries' in data: # take first item from a playlist data = data['entries'][0] filename = data['url'] if stream else ytdl.prepare_filename(data) return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data) class Music(commands.Cog): def __init__(self, bot): self.bot = bot @commands.command() async def join(self, ctx, *, channel: discord.VoiceChannel): """Joins a voice channel""" if ctx.voice_client is not None: return await ctx.voice_client.move_to(channel) await channel.connect() @commands.command() async def play(self, ctx, *, query): """Plays a file from the local filesystem""" source = discord.PCMVolumeTransformer(discord.FFmpegPCMAudio(query)) ctx.voice_client.play(source, after=lambda e: print('Player error: %s' % e) if e else None) await ctx.send('Now playing: <>'.format(query)) @commands.command() async def yt(self, ctx, *, url): """Plays from a url (almost anything youtube_dl supports)""" async with ctx.typing(): player = await YTDLSource.from_url(url, loop=self.bot.loop, stream=True) ctx.voice_client.play(player, after=lambda e: print('Player error: %s' % e) if e else None) await ctx.send('Now playing: <>'.format(player.title)) @commands.command() async def stream(self, ctx, *, url): """Streams from a url (same as yt, but doesn't predownload)""" async with ctx.typing(): player = await YTDLSource.from_url(url, loop=self.bot.loop, stream=True) ctx.voice_client.play(player, after=lambda e: print('Player error: %s' % e) if e else None) await ctx.send('Now playing: <>'.format(player.title)) @commands.command() async def volume(self, ctx, volume: int): """Changes the player's volume""" if ctx.voice_client is None: return await ctx.send("Not connected to a voice channel.") ctx.voice_client.source.volume = volume / 100 await ctx.send("Changed volume to <>%".format(volume)) @commands.command() async def stop(self, ctx): """Stops and disconnects the bot from voice""" await ctx.voice_client.disconnect() @play.before_invoke @yt.before_invoke @stream.before_invoke async def ensure_voice(self, ctx): if ctx.voice_client is None: if ctx.author.voice: await ctx.author.voice.channel.connect() else: await ctx.send("You are not connected to a voice channel.") raise commands.CommandError("Author not connected to a voice channel.") elif ctx.voice_client.is_playing(): ctx.voice_client.stop() def setup(client): client.add_cog(Music(client)) print('Music: activated')
Ignoring exception in command yt: Traceback (most recent call last): File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped ret = await coro(*args, **kwargs) File "C:\Users\volva\Desktop\botTest\cogs\music.py", line 82, in yt player = await YTDLSource.from_url(url, loop=self.bot.loop, stream=True) File "C:\Users\volva\Desktop\botTest\cogs\music.py", line 52, in from_url return cls(discord.FFmpegPCMAudio(filename, **ffmpeg_options), data=data) File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\player.py", line 225, in __init__ super().__init__(source, executable=executable, args=args, **subprocess_kwargs) File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\player.py", line 138, in __init__ self._process = self._spawn_process(args, **kwargs) File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\player.py", line 147, in _spawn_process raise ClientException(executable + ' was not found.') from None discord.errors.ClientException: ffmpeg was not found. The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke await ctx.command.invoke(ctx) File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke await injected(*ctx.args, **ctx.kwargs) File "C:\Users\volva\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped raise CommandInvokeError(exc) from exc discord.ext.commands.errors.CommandInvokeError: Command raised an exception: ClientException: ffmpeg was not found.
  • Вопрос задан более двух лет назад
  • 9204 просмотра

Python библиотека discord

Решил я написать музыкального бота в дискорде, посмотрел как работать с api дискорда на питоне, везде библиотека «discord.py». В официальной документации я совсем ничего не понимаю. Поэтому смотрел туториалы на ютубе и пытался гуглить. Везде описывают только основы основ.
Я так и не нашёл команду, для подключения бота в голосовой чат. Можете скинуть какую-нибудь нормальную обучалку?

Лучший ответ

Без умения гуглить на английском либо читать документацию на английском шансов мало.
discord.VoiceChannel.connect
(это Coroutine функция)

Остальные ответы

почему вы тащитесь от жизни обманами?

Что делать, если Discord-бот не в сети

Что делать, если бот в Discord не в сети

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

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

Причина 1: Сбой авторизации бота

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

Открытие панели управления участником для проверки работоспособности бота в Discord

Появится панель управления участником с информацией о нем. Если там есть кнопка «Добавить бота» или «Авторизовать бота», нажмите ее и еще раз пройдите те же самые шаги, связанные с выбором сервера и подтверждением предоставления интеграции необходимых прав.

Повторная авторизация для проверки работоспособности бота в Discord

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

Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей

Причина 2: Некорректная работа интеграции

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

  1. Найдите неактивного бота в списке участников и щелкните по нему правой кнопкой мыши.
  2. Из появившегося контекстного меню выберите пункт «Управление интеграцией». Переход к интеграциям для проверки работоспособности бота в Discord
  3. Ознакомьтесь с предоставленными и отсутствующими правами. Убедитесь в том, что интеграция имеет необходимый уровень доступа, чтобы оставаться активной и выполнять команды пользователя. Если это не так, откройте раздел с ролями, выберите отдельную роль целевого бота и предоставьте ей необходимые права. Проверка прав доступа интеграции для проверки работоспособности бота в Discord
  4. Если с доступом все нормально, но интеграция все еще не работает, удалите ее полностью при помощи кнопки в этом же окне. Кнопка удаления интеграции для проверки работоспособности бота в Discord
  5. Подтвердите удаление и самостоятельно добавьте бота на сервер точно так же, как делали это первый раз. Можете попробовать отыскать его через другую площадку размещения ботов или найти официальный сайт, чтобы точно выбрать последнюю рабочую версию. Подтверждение удаления интеграции для проверки работоспособности бота в Discord

Причина 3: Бот сломан или отключен создателем

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

  1. Я не буду рекомендовать конкретную площадку размещения ботов, поскольку их десятки, самых разных и проверенных. Откройте любую, на которой находится установленный вами бот. Отыщите его через поиск, чтобы открыть страницу интеграции. Поиск на открытых площадках для проверки работоспособности бота в Discord
  2. Найдите свежие отзывы и почитайте, что пишут о боте пользователи. Если не вы один столкнулись с его нерабочим состоянием, то причина проблемы непосредственно в интеграции, и исправить ее может только создатель. Чтение отзывов на открытых площадках для проверки работоспособности бота в Discord

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

Причина 4: Проблема в работе Discord

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

  1. Откройте утилиту «Выполнить», используя для этого стандартное сочетание клавиш Win + R. Введите в поле поиска %appdata% и подтвердите переход по данному пути. Переход к локальным файлам для проверки работоспособности бота в Discord
  2. Откроется список папок, среди которых нужно найти «Discord» и удалить данную папку. Удаление локальных файлов для проверки работоспособности бота в Discord
  3. Обязательно завершите все процессы программы через «Диспетчер задач», после чего повторите запуск мессенджера и проверьте, помогло ли это исправить проблему с работой бота. Завершение процессов для проверки работоспособности бота в Discord

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *