Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何让Discord机器人播放YouTube音频_Python_Discord.py Rewrite - Fatal编程技术网

Python 如何让Discord机器人播放YouTube音频

Python 如何让Discord机器人播放YouTube音频,python,discord.py-rewrite,Python,Discord.py Rewrite,我是一名高中生,正在制作一个Discord机器人作为最后一个项目,我在寻找在Discordpy Rewrite中播放YouTube音频的工作教程或基线时遇到了问题。如果有我缺少的教程或基本代码可以做到这一点,我将非常感谢 我已经看过一些教程并尝试过了,但出于这样或那样的原因,它们似乎不起作用。我花了很多项目时间搜索,但似乎找不到我要找的东西。下面,我找到了一些让机器人播放MP3文件的代码,但我不确定如何使用YouTube链接来实现 @bot.command() async def mp3play

我是一名高中生,正在制作一个Discord机器人作为最后一个项目,我在寻找在Discordpy Rewrite中播放YouTube音频的工作教程或基线时遇到了问题。如果有我缺少的教程或基本代码可以做到这一点,我将非常感谢

我已经看过一些教程并尝试过了,但出于这样或那样的原因,它们似乎不起作用。我花了很多项目时间搜索,但似乎找不到我要找的东西。下面,我找到了一些让机器人播放MP3文件的代码,但我不确定如何使用YouTube链接来实现

@bot.command()
async def mp3play(context):
  user = context.message.author
  voice_channel = user.voice.voice_channel
  channel = None
  if voice_channel != None:
    channel=voice_channel.name
    vc = await channel.connect()
    audio = vc.play("holder.mp3", after=lambda: print("Complete."))
    vc.start()
    while vc.is_playing():
      await asyncio.sleep(1)
    vc.stop()
  else:
    await ctx.send("User must be in a voice channel.")
您好,在discord.py 1.2.2的新版本中对方法进行了一些更改,您可以在文档本身中跟踪方法的迁移
首先,您需要实现一个名为
YTDLSource
的类来控制
yotube\u dl

youtube\u dl.utils.bug\u报告\u消息=lambda:“” ytdl_格式_选项={ “格式”:“最佳音频/最佳”, “outtmpl”:“%(提取器)s-%(id)s-%(标题)s.%(ext)s”, “RestrictFileName”:True, 'noplaylist':True, “nocheckcertificate”:正确, “忽略错误”:False, “logtostderr”:False, “安静”:没错, “无警告”:正确, “默认搜索”:“自动”, “源地址”:“0.0.0.0”绑定到ipv4,因为ipv6地址有时会导致问题 } ffmpeg_选项={ '选项':'-vn' } ytdl=youtube\u dl.YoutubeDL(ytdl\u格式\u选项) YTDLSource类(discord.PCMVolumeTransformer): def u u init _;(self,source,*,data,volume=0.5): super().\uuuu init\uuuu(源、卷) self.data=数据 self.title=data.get('title') self.url=data.get('url') @类方法 来自url的异步定义(cls,url,*,循环=无,流=假): loop=循环或异步IO.get\u event\u loop() 数据=等待循环。在执行器中运行(无,lambda:ytdl。提取信息(url,下载=非流)) 如果数据中有“条目”: #从播放列表中选取第一项 数据=数据['entries'][0] filename=data['url']如果流是ytdl。准备文件名(数据) 返回cls(discord.FFmpegPCMAudio(文件名,**ffmpeg_选项),data=data) 在music命令中使用这个类,注意我的def play属于另一个我称为Voice的类

@commands.command(pass\u context=True)
异步def播放(self、ctx、*、url):
打印(url)
服务器=ctx.message.guild
voice\u channel=server.voice\u客户端
与ctx.typing()异步:
player=wait YTDLSource.from_url(url,loop=self.bot.loop)
ctx.voice_channel.play(player,after=lambda e:print('player错误:%s'%e),如果没有其他错误)
等待ctx.send('正在播放:{}'。格式(player.title))

在此之前,只需添加您的齿轮和享受

这是我所有的音乐机器人代码:

导入itertools
导入回溯
从异步\u超时导入超时
从functools导入部分
从youtube\u dl导入YoutubeDL
ytdlopts={
“格式”:“最佳音频/最佳”,
'outtmpl':'downloads/%(提取器)s-%(id)s-%(title)s.%(ext)s',
“RestrictFileName”:True,
'noplaylist':True,
“nocheckcertificate”:正确,
“忽略错误”:False,
“logtostderr”:False,
“安静”:没错,
“无警告”:正确,
“默认搜索”:“自动”,
“源地址”:“0.0.0.0”#ipv6地址有时会导致问题
}
ffmpegopts={
“在选项之前”:“-nostdin”,
'选项':'-vn'
}
ytdl=YTDLUPEDL(ytdlopts)
类VoiceConnectionError(commands.CommandError):
“”“连接错误的自定义异常类。”“”
类InvalidVoiceChannel(VoiceConnectionError):
“”“无效语音频道的例外情况。”“”
YTDLSource类(discord.PCMVolumeTransformer):
定义初始化(自身、源、*、数据、请求者):
super().\uuuu init\uuuuu(源)
self.requester=请求者
self.title=data.get('title')
self.web\u url=data.get('webpage\u url')
#YTDL info dicts(数据)具有您可能需要的其他有用信息
# https://github.com/rg3/youtube-dl/blob/master/README.md
def uu getitem uu(self,item:str):
“”“允许我们访问类似于dict的属性。
这仅在您未下载时有用。
"""
返回自我。获取属性(项目)
@类方法
异步定义创建源(cls、ctx、搜索:str、*、循环、下载=False):
loop=循环或异步IO.get\u event\u loop()
to_run=partial(ytdl.extract_info,url=search,download=download)
数据=等待循环。在执行器中运行(无,要运行)
如果数据中有“条目”:
#从播放列表中选取第一项
数据=数据['entries'][0]
等待ctx.send(f'``ini\n[将{data[“title”]}添加到队列。]\n`````)
如果下载:
source=ytdl.prepare\u文件名(数据)
其他:
返回{'webpage_url':数据['webpage_url'],'requester':ctx.author,'title':数据['title']}
返回cls(discord.FFmpegPCMAudio(源),data=data,requester=ctx.author)
@类方法
异步def regather_流(cls、数据、*、循环):
“”用于准备流,而不是下载。
由于Youtube流媒体链接过期。”“”
loop=循环或异步IO.get\u event\u loop()
请求者=数据[“请求者”]
to_run=partial(ytdl.extract_info,url=data['webpage_url'],download=False)
数据=等待循环。在执行器中运行(无,要运行)
返回cls(discord.FFmpegPCMAudio(数据['url']),数据=数据,请求者=请求者)
类MusicLayer(commands.Cog):
“”“使用音乐机器人分配给每个帮会的职业。
这个类实现了一个队列和循环,允许不同的协会收听不同的播放列表
同时。
当机器人与语音断开连接时,它的实例将被销毁。
"""
__插槽uu=('bot','uguild','uchannel','ucog','queue','next','current','np',