Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Не работает музыкальный бот дискорд

Радмир Замалетдинов Ученик (87), на голосовании 2 недели назад
Вот часть когда музыкального бота
import youtube_dl
import pafy

@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("Бот не подключен к голосовому каналу.")
При запуске команды бот пишет ошибку
Traceback (most recent call last):
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/core.py", line 235, in wrapped
ret = await coro(*args, **kwargs)
File "/home/runner/Discord-bot/main.py", line 264, in play
video = pafy.new (url)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/pafy.py", line 124, in new
return Pafy(url, basic, gdata, size, callback, ydl_opts=ydl_opts)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/backend_youtube_dl.py", line 31, in __init__
super(YtdlPafy, self).__init__(*args, **kwargs)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/backend_shared.py", line 97, in __init__
self._fetch_basic()
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/pafy/backend_youtube_dl.py", line 50, in _fetch_basic
self._rating = self._ydl_info['average_rating']
KeyError: 'average_rating'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/bot.py", line 1350, in invoke
await ctx.command.invoke(ctx)
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/core.py", line 1029, in invoke
await injected(*ctx.args, **ctx.kwargs) # type: ignore
File "/home/runner/Discord-bot/.pythonlibs/lib/python3.10/site-packages/discord/ext/commands/core.py", line 244, in wrapped
raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: KeyError: 'average_rating'
Поставил только часть кода потому что в полном коде много ключей от OpenAI и других
Голосование за лучший ответ
Hiгer Cabanovih Мастер (1158) 1 месяц назад
на ругай его за безделие
GGG Просветленный (26024) 1 месяц назад
Ваша ошибка возникает из-за того, что библиотека pafy не может найти ключ 'average_rating' в возвращаемых данных. Это может быть связано с изменениями в API YouTube или с тем, что youtube_dl возвращает данные в другом формате.

Есть несколько способов решения этой проблемы:

Использование yt_dlp вместо youtube_dl и pafy: yt_dlp является форком youtube_dl и может быть более актуальным и поддерживаемым. Вы можете использовать его напрямую для загрузки аудио.

Использование альтернативных библиотек: Если проблема сохраняется, рассмотрите использование других библиотек для получения аудио с YouTube.

Вот пример исправленного кода с использованием yt_dlp:
 import discord 
from discord.ext import commands
import yt_dlp as youtube_dl

bot = commands.Bot(command_prefix='!')

@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

ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '192',
}],
}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=False)
url2 = info['url']
source = await discord.FFmpegOpusAudio.from_probe(url2)

vc.play(source)

@bot.command()
async def leave(ctx):
if ctx.voice_client:
await ctx.guild.voice_client.disconnect()
else:
await ctx.send("Бот не подключен к голосовому каналу.")

# Запуск бота
bot.run('YOUR_BOT_TOKEN')
В этом примере:

Используется yt_dlp вместо pafy для получения аудио с YouTube.
Настройки ydl_opts указывают, что мы хотим получить лучшую доступную аудиодорожку.
Команда play загружает и проигрывает аудио с YouTube.
Не забудьте установить необходимые библиотеки, если они еще не установлены:
 pip install discord.py yt-dlp 
Радмир ЗамалетдиновУченик (87) 1 месяц назад
Ты хоть если используешь чат гпт то исправляй код, ты же знаешь что ИИ ещё не способен нормально писать код, особенно gpt 3.5
Похожие вопросы