voice_client 和 url 突然在 discord.py 机器人中不起作用

Posted

技术标签:

【中文标题】voice_client 和 url 突然在 discord.py 机器人中不起作用【英文标题】:voice_client and url suddenly not working in discord.py bot 【发布时间】:2021-08-05 06:18:05 【问题描述】:

我一直在编写一个不和谐的音乐机器人,我的简单版本没有任何错误!现在我想添加队列功能,我设计了它以便 replit.com 可以处理它。但现在我有错误说:

Ignoring exception in command play:
Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
    ret = await coro(*args, **kwargs)
  File "main.py", line 69, in _play
    vc = ctx.voice_client
AttributeError: 'str' object has no attribute 'voice_client'

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

Traceback (most recent call last):
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 939, in invoke
    await ctx.command.invoke(ctx)
  File "/opt/virtualenvs/python3/lib/python3.8/site-packages/discord/ext/commands/core.py", line 863, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/opt/virtualenvs/python3/lib/python3.8/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: AttributeError: 'str' object has no attribute 'voice_client'

一般来说,像“is_paused”或“is_playing”这样的不和谐播放变量都不再起作用(得到相同的AttributeError。)!

这是我的代码:

queue_urls = []

class Music(commands.Cog):
  async def check_for_play(self, ctx):
    if len(queue_urls) > 0: #if there still are more items in the queue...
      await ctx.invoke(self.real_play) #...run the player again

  async def real_play(self, ctx): #the player plays the song...
    voice = discord.utils.get(bot.voice_clients, guild=ctx.guild)
    url = queue_urls[0]
    queue_urls.pop(0)
    with youtube_dl.YoutubeDL(ytdlopts) as ydl:
      info = ydl.extract_info(url, download=False)
      URL_NEXT = info['formats'][0]['url']
    voice.play(discord.FFmpegPCMAudio(URL_NEXT, **ffmpegopts), after=lambda e: ctx.invoke(self.check_for_play)) #...and when the song is finished, should run the function check_for_play

  @bot.command(name='play', aliases=['sing', 'p'])
  async def _play(self, ctx): #the command...
    vc = ctx.voice_client
    if not vc.is_connected:
      channel = ctx.author.voice.channel
      await channel.connect()
    url = ctx.message.content
    url = ttourl(url)
    queue_urls.append(url) #...adds the item to the queue...
    voicec = ctx.voice_client
    if not voicec.is_playing: #...and starts the player if its not already playing
      await ctx.invoke(self.real_play)

【问题讨论】:

【参考方案1】:

您遇到此错误是因为您的 cog 不完整且部分错误:

您没有声明 __init__ 构造函数,如果您想访问 cog 中的 bot 变量,这是必需的:
class Music(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
您需要将每个 bot 引用替换为 self.bot,如下所示:
voice = discord.utils.get(self.bot.voice_clients, guild=ctx.guild)
在 cog 内部,您需要将 @bot.command() 替换为 @commands.command()
@commands.command(name='play', aliases=['sing', 'p'])
async def _play(self, ctx):

【讨论】:

那么前缀是什么?当我键入“!play ...”时,找不到该命令。当我输入“play ...”时,什么也没有发生??我不知道在这里做什么...... 您的前缀是您在声明机器人时设置的前缀 (bot = commands.Bot(...))。你应该看看cogs 是如何产生的。【参考方案2】:

我知道你在这里设计了一个 cog,但是你拥有的命令装饰器对于运行一个 cog 是不正确的。装饰器从client.command() 更改为commands.command()。当您说这在您的简化版本中有效时,我假设您的意思是单文件程序。

【讨论】:

我真的不明白你的意思。我已经用前缀声明了“bot”,我唯一改变的是将 voice.play 移动到另一个异步函数中。 好吧,所以我一开始以为你只是拿走了你的部分代码并发送了它,但现在很明显你不知道如何制作一个 cog (discordpy.readthedocs.io/en/stable/ext/commands/cogs.html)。 别担心,我现在知道了。但显然机器人没有运行 real_play 函数......我是否输入了错误的语法或什么(没有错误消息)? 好吧,ctx.invoke 更多地用于在脚本中调用命令,而 real_player 函数不是命令。我建议在你的 cog 类之上使用那些不需要装饰器的函数。您可以使用await real_play(self.client, ctx) 之类的方式给他们打电话。

以上是关于voice_client 和 url 突然在 discord.py 机器人中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“FFmpegPCMAudio”对象没有属性“_process”

markdown Merubah域名(URL)instalasi cms berbasis wordpress di共享主机杨menggunakan控制面板cPanel

最近做了一个短网址服务 di81.com

5320di手机移动卡不能上网,求连接设置

如何在 Python 中使用引用者和 href 查找 url?

vue项目中点击按钮事件突然刷新页面然后网页url中自动加上了问号