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
相关产品推荐
相关产品推荐

