开发定时踢出语音频道机器人遇报错:'list' object has no attribute 'move_to'
Discord机器人踢出语音频道报错解决
错误原因
你创建的memids是成员ID的列表,而move_to()是Discord.py中Member对象的专属方法,列表类型没有这个属性,所以触发'list' object has no attribute 'move_to'错误。
修正方案
直接保留channel_voice.members返回的Member对象列表,遍历列表逐个对成员执行踢出操作即可。同时要确保机器人拥有移动语音频道成员的权限。
修改后的代码
import discord import asyncio from discord.ext import commands from discord import FFmpegPCMAudio @client.command(pass_context=True) async def outro(ctx): if ctx.author.voice: channel = ctx.message.author.voice.channel voice = await channel.connect() # 播放指定音频 source = FFmpegPCMAudio(source_song) voice.play(source) # 获取目标语音频道 channel_voice = client.get_channel(1014932059279605770) # 直接获取频道内的Member对象列表 members_in_channel = channel_voice.members # 等待指定时间 await asyncio.sleep(58) # 遍历成员逐个踢出 for member in members_in_channel: try: # move_to(None) 会将成员移出语音频道 await member.move_to(None) print(f"成功踢出: {member.display_name}") except discord.Forbidden: print(f"权限不足,无法踢出: {member.display_name}") except discord.HTTPException: print(f"踢出 {member.display_name} 时发生网络错误") # 播放完成后断开机器人的语音连接 await voice.disconnect()
关键修改点
- 移除了不必要的
memidsID列表,直接使用Member对象操作 - 遍历成员列表,对每个成员单独调用
move_to(None) - 添加异常处理,避免单个成员操作失败导致整个命令中断
- 新增机器人语音断开逻辑,防止资源占用
内容的提问来源于stack exchange,提问作者Peppy
相关产品推荐
相关产品推荐

