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

Discord.py создание музыкального бота

Даниил Багабоб Знаток (306), на голосовании 1 месяц назад
делаю бота для дискорда на пайтоне, хочу сделать так чтобы при вводе команды и ссылки на видео бот заходил в канал и воспроизводил музыку. Код написал, бот заходит и молчит. КОд ниже, помогите.
```import discord import random import os import openai import youtube_dl import logging import requests import sys import asyncio logging.basicConfig(filename='bot.log', level=logging.INFO) from discord import FFmpegPCMAudio from discord.ext.commands import Bot from discord.utils import get from discord.ext import commands intents = discord.Intents.default().all() bot = commands.Bot(command_prefix="!", intents=intents) bot.remove_command('help') intents.presences = True intents.members = True intents.message_content = True intents.typing = False
 @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 = youtube_dl(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("Бот не подключен к голосовому каналу.")
Голосование за лучший ответ
Артём Таптыков Гуру (4060) 2 месяца назад
Ваш код выглядит почти правильно, но есть несколько проблем, которые нужно исправить:

1. Библиотека `youtube_dl` немного изменена и не будет работать напрямую с `discord.py`. Вместо нее лучше использовать `yt-dlp`, которая является форком `youtube_dl`.
2. Метод `youtube_dl(url)` не существует. Нужно создать `YoutubeDL` объект с соответствующими параметрами.
3. Чтобы использовать аудиофайл, необходимо передавать путь к аудиофайлу, а не URL.

Вот исправленный вариант вашего кода:

```python
import discord
import os
import yt_dlp as youtube_dl
import logging
import asyncio

from discord.ext import commands

logging.basicConfig(filename='bot.log', level=logging.INFO)

intents = discord.Intents.default()
intents.message_content = True

bot = commands.Bot(command_prefix="!", intents=intents)

@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',
}],
'outtmpl': 'downloads/%(title)s.%(ext)s',
}

with youtube_dl.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
filename = ydl.prepare_filename(info)

vc.play(discord.FFmpegPCMAudio(executable="ffmpeg", source=filename))

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

bot.run('YOUR_TOKEN')
```

В этом коде:

1. Мы используем `yt-dlp` для скачивания аудио с YouTube.
2. `FFmpegPCMAudio` используется для воспроизведения скачанного аудиофайла.
3. `intents.message_content = True` добавлено для получения контента сообщений.

Не забудьте заменить `'YOUR_TOKEN'` на ваш реальный токен бота. Также убедитесь, что у вас установлен `ffmpeg` и он доступен в пути выполнения программы.
Похожие вопросы