You need to enable JavaScript to run this app. Discord Python机器人开发:实现命令传入歌曲名播放对应MP3文件
优惠活动
大模型
产品
解决方案
定价
更多

Discord Python机器人开发:实现命令传入歌曲名播放对应MP3文件

本地MP3播放功能修正实现

你当前的代码存在几处会导致功能无法运行的问题,调整后即可实现传入歌曲名自动匹配本地MP3播放的需求:

  • 命令参数映射错误:直接绑定到bot实例的普通命令,不需要类方法的self参数,所有命令函数的第一个入参必须是上下文对象ctx,原代码编写的async def play(self,musicname)会导致discord.py触发命令时参数传递完全错位。
  • 引用未初始化的变量:代码中用到的message、voice都没有在作用域内定义,所有关联实例可以直接从ctx中获取:添加反应的目标消息是ctx.message,机器人当前的语音连接实例是ctx.voice_client。
  • 缺少基础状态校验:没有前置判断机器人是否已连接语音频道、当前是否有正在播放的音频,未连接状态下直接调用播放方法会直接抛出运行时错误。
  • 参数接收逻辑不兼容:如果歌曲名包含空格,单参数接收会截断输入内容,需要使用通配符*将用户传入的所有内容拼接为完整的歌曲名。

修正后的完整可运行代码

import discord
from discord import FFmpegPCMAudio
from discord.ext import commands

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


@bot.command()
async def join(ctx):
    connected = ctx.author.voice
    if connected:
        await connected.channel.connect()

@bot.command()
async def leave(ctx):
    await ctx.voice_client.disconnect()

@bot.command()
async def play(ctx, *, musicname):
    await ctx.message.add_reaction("✅")
    # 校验机器人语音连接状态
    if not ctx.voice_client:
        await ctx.reply("请先让机器人加入语音频道")
        return
    # 校验是否有正在播放的音频
    if ctx.voice_client.is_playing():
        await ctx.reply("当前正在播放音频,请稍候")
        return
    # 加载同目录下对应名称的MP3文件播放
    source = FFmpegPCMAudio(f"{musicname}.mp3")
    ctx.voice_client.play(source)


bot.run("my_token")

实现说明:

  • 所有需要播放的MP3文件请和机器人运行脚本放在同一工作目录下,文件名和命令传入的参数完全匹配即可,比如输入.play test就会自动加载同目录下的test.mp3文件
  • 如果需要调整播放音量,可以在加载音频源时套一层PCMVolumeTransformer,传入0-1之间的浮点数值作为音量系数即可。

内容的提问来源于stack exchange,提问作者hurakiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 23:36:04