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

Discord VC音乐机器人定时播放功能故障求助

解决Discord音乐机器人定时播放音频的问题

你的代码存在几个核心问题:

  • ctx变量未定义:checkTime函数里调用play(ctx, ...),但ctx不在该函数的作用域内,会直接触发NameError,导致函数执行失败。
  • 定时器堆积:每秒启动新的threading.Timer会导致大量定时器实例堆积,浪费系统资源,甚至引发逻辑混乱。
  • 时间匹配精度不足:用%H:%M:%S每秒轮询匹配,可能因为系统时间的毫秒级差错过目标时间点,导致触发失败。
  • 语音频道依赖缺失:play函数需要机器人已连接到目标语音频道,否则播放逻辑会直接失效。

修正后的实现思路和代码:

  1. 直接计算目标时间与当前时间的差值,设置单次定时器,避免轮询和定时器堆积。
  2. 直接通过频道ID获取目标语音频道,确保机器人能主动连接并播放。
  3. 处理重复定时逻辑,当天目标时间过了就自动顺延到次日。
import datetime
import threading
import discord
from discord.ext import commands

# 初始化Bot,根据需求配置intents
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix='!', intents=intents)

# 替换成你要使用的目标语音频道ID
TARGET_VOICE_CHANNEL_ID = 123456789012345678

async def play_audio_in_vc():
    # 获取目标语音频道对象
    target_channel = bot.get_channel(TARGET_VOICE_CHANNEL_ID)
    if not isinstance(target_channel, discord.VoiceChannel):
        print("无法找到有效目标语音频道")
        return

    # 处理语音连接:如果未连接则发起连接,已连接则复用客户端
    voice_client = target_channel.guild.voice_client
    if not voice_client or not voice_client.is_connected():
        try:
            voice_client = await target_channel.connect()
        except discord.ClientException as e:
            print(f"连接语音频道失败: {e}")
            return

    # 加载并播放音频(这里以YouTube链接为例,需提前安装yt-dlp和ffmpeg)
    try:
        # 替换为你的音频加载逻辑,比如使用yt-dlp获取音频流
        from yt_dlp import YoutubeDL
        ydl_opts = {'format': 'bestaudio/best', 'noplaylist': True}
        with YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info('https://youtu.be/dQw4w9WgXcQ', download=False)
            audio_url = info['url']
        source = await discord.FFmpegOpusAudio.from_probe(audio_url)
        voice_client.play(source)
    except Exception as e:
        print(f"播放音频失败: {e}")
        # 播放失败后断开连接(可选)
        await voice_client.disconnect()

def schedule_next_play():
    now = datetime.datetime.now()
    # 设置每日触发时间:04:13:40
    target_time = now.replace(hour=4, minute=13, second=40, microsecond=0)
    
    # 如果当天的目标时间已过,自动顺延到次日
    if target_time < now:
        target_time += datetime.timedelta(days=1)
    
    # 计算需要等待的秒数
    wait_duration = (target_time - now).total_seconds()
    # 启动定时器,到时间后执行播放逻辑
    threading.Timer(wait_duration, lambda: bot.loop.create_task(play_audio_in_vc())).start()

# Bot启动后初始化定时任务
@bot.event
async def on_ready():
    print(f"Bot已登录为 {bot.user}")
    schedule_next_play()

# 运行Bot,替换为你的Bot令牌
bot.run("YOUR_BOT_TOKEN_HERE")

注意事项:

  • 确保Bot拥有连接语音频道和播放音频的权限。
  • 需安装依赖:pip install discord.py yt-dlp,同时系统需要安装ffmpeg(用于音频解码)。
  • 如果不需要每日重复播放,可去掉顺延次日的逻辑,只执行一次定时任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:20:33