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

Discord.py机器人循环函数仅对首个服务器生效 如何适配所有接入服务器?

discord.py定时播放功能多服务器适配方案

问题根源

你的代码在遍历服务器的for guild in guilds循环末尾存在多余的break语句,执行完第一个服务器的逻辑后会直接终止全部服务器的遍历,因此只有首个被邀请的服务器能触发功能。

修复后代码

import datetime
from random import randrange
import asyncio

@tasks.loop(seconds = 5)
async def loop():
    # 提前判断时间,避免重复校验
    if datetime.datetime.now().strftime("%H:%M") != "22:22":
        return
    guilds = client.guilds
    for guild in guilds:
        # 跳过机器人已经在当前服务器连接语音的情况,避免报错
        if guild.voice_client is not None:
            continue
        voice_channel_list = guild.voice_channels
        for channel in voice_channel_list:
            # 直接读取频道成员长度,无需额外建列表
            if len(channel.members) > 0:
                await channel.connect()
                voice = guild.voice_client
                if randrange(1,100) <= 30:
                    voice.play(discord.FFmpegPCMAudio(source="sounds/music1.mp3"))
                else:
                    voice.play(discord.FFmpegPCMAudio(source="sounds/music2.mp3"))
                while voice.is_playing():
                    await asyncio.sleep(1)
                await voice.disconnect()
                # 跳出当前服务器的频道遍历,处理下一个服务器
                break

额外优化建议

  • 提前校验时间,避免每次遍历服务器、频道都重复判断当前时间,降低无效运算
  • 直接通过guild.voice_client获取当前服务器的语音客户端实例,无需调用discord.utils.get遍历全局列表
  • 新增机器人已连接校验,避免重复连接同一服务器的语音频道引发报错
  • 简化成员校验逻辑,直接使用len(channel.members)判断频道内是否有用户,无需额外构建成员列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:54:03