You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian环境下Python开发Discord电台Bot的报错排查求助

解决Discord电台Bot的两个常见错误

第一个错误:TypeError: 'NoneType' object is not iterable

错误原因

你代码里的PREFIX是None,因为os.getenv('DISCORD_PREFIX')没读到对应的环境变量——要么是.env文件里没配置DISCORD_PREFIX,要么是load_dotenv()没正确加载文件。当你尝试把None转成列表list(PREFIX)时,就会触发这个错误。

解决方法

选以下任意一种即可:

  • 修复.env文件:确保你的.env文件里有一行DISCORD_PREFIX=!(!可以换成你想用的任意前缀,比如$),并且文件和radio.py在同一目录下。
  • 给PREFIX设默认值:把获取前缀的代码改成:
    PREFIX = os.getenv('DISCORD_PREFIX', '!')
    
  • 直接指定前缀:不用从环境变量读,直接写死前缀:
    client = Bot(command_prefix='!')
    
    (Bot的command_prefix参数支持直接传字符串,不需要转成列表)

第二个错误:NameError: name 'player' is not defined

错误原因

你的try-except块里,如果机器人已经在语音频道里(channel.connect()会抛出异常),except直接pass导致player变量没被赋值,后面调用player.play()自然找不到这个变量。而且用全局变量player本身就容易出问题——比如多服务器使用时会混乱。

解决方法

  1. 不要用全局变量:通过ctx.guild.voice_client获取当前服务器的语音客户端,而不是依赖全局变量。
  2. 完善错误处理:检查用户是否在语音频道,避免空值报错。

修改后的完整代码:

import os

from discord import FFmpegPCMAudio
from discord.ext.commands import Bot
from dotenv import load_dotenv

load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
# 给PREFIX加默认值,避免None的情况
PREFIX = os.getenv('DISCORD_PREFIX', '!')

client = Bot(command_prefix=PREFIX)


@client.event
async def on_ready():
    print('Music Bot Ready')


@client.command(aliases=['p', 'pla'])
async def play(ctx, url: str = 'http://stream.radioparadise.com/rock-128'):
    # 检查用户是否在语音频道
    if not ctx.message.author.voice:
        await ctx.send('你得先加入一个语音频道啊!')
        return
    
    channel = ctx.message.author.voice.channel
    voice_client = ctx.guild.voice_client

    # 处理连接状态:没连接就连接,不在当前频道就移动
    if not voice_client:
        voice_client = await channel.connect()
    elif voice_client.channel != channel:
        await voice_client.move_to(channel)
    
    # 开始播放
    voice_client.play(FFmpegPCMAudio(url))
    await ctx.send(f'正在播放:{url}')


@client.command(aliases=['s', 'sto'])
async def stop(ctx):
    voice_client = ctx.guild.voice_client
    if voice_client and voice_client.is_playing():
        voice_client.stop()
        await ctx.send('已停止播放')
    else:
        await ctx.send('现在没在播放任何内容啊!')


client.run(TOKEN)

额外注意事项

  • 确保你的Debian系统安装了ffmpeg,Discord.py依赖它处理音频:sudo apt install ffmpeg
  • 检查机器人权限:确保它有“连接语音频道”和“说话”的权限

内容的提问来源于stack exchange,提问作者H.LK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:45:33