discord.py调用指定Guild频道报错guild不能为整数如何修复
问题根因
- 你直接将整数类型的服务器ID赋值给
guild变量,discord.py框架中get_channel()是服务器实例对象的内置方法,纯整数ID没有该方法,因此触发“guild不能为整数类型”的类型错误。 - 代码还存在其他会导致运行失败的逻辑问题:
- 直接用字符串
"OfficialMember"赋值给role变量,没有获取实际的角色对象,无法调用.members属性拉取成员列表 - 代码中未定义
newRole变量,运行到角色判断逻辑时会直接抛出NameError - 框架中发送消息、获取频道/角色的接口都是异步方法,放在普通同步函数中不加
await调用不会实际执行 - 硬编码单个服务器、频道ID无法适配多服务器部署的需求
- 直接用字符串
修复方案
- 开启机器人的成员权限:前往Discord开发者后台,在对应机器人的Bot页面,打开
Privileged Gateway Intents分类下的Server Members Intent开关,否则机器人无法接收成员更新事件,也拉取不到完整的角色成员列表。 - 将更新成员列表的逻辑改为异步函数,不再硬编码服务器ID,从触发事件的成员对象中动态获取当前服务器信息,通过ID映射配置适配多服务器场景。
- 通过计算更新前后的角色差集获取用户新添加的角色,解决
newRole未定义的问题。
修复后可运行代码
import discord from discord.ext import commands # 开启成员意图 intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix='!', intents=intents) # 多服务器频道配置:key为服务器ID,value为该服务器要发送成员列表的频道ID CHANNEL_CONFIG = { 754778020639932516: 754778311573635213 # 新增服务器时按格式补充对应ID即可 } async def updatemsg(guild): # 查找当前服务器的正式成员角色 target_role = discord.utils.get(guild.roles, name="OfficialMember") if not target_role: return # 获取对应发送频道 target_channel_id = CHANNEL_CONFIG.get(guild.id) if not target_channel_id: return target_channel = guild.get_channel(target_channel_id) if not target_channel: return # 拼接成员列表并发送 member_list_str = "\n".join(str(member) for member in target_role.members) await target_channel.send(f"当前正式成员列表:\n{member_list_str}") @bot.event async def on_member_update(before, after): # 找出本次更新用户新增的所有角色 added_roles = [role for role in after.roles if role not in before.roles] for role in added_roles: if role.name == "OfficialMember": print("MemList Updated") await updatemsg(after.guild) return print("Not OfficialMember Role") # 替换为你自己的机器人Token bot.run("YOUR_BOT_TOKEN")
额外说明
- 如果后续接入新的服务器,只需要在
CHANNEL_CONFIG字典中添加新的服务器ID和对应频道ID的键值对即可,不需要修改核心逻辑。 - 所有和Discord接口交互的异步方法必须加
await关键字调用,且需要放在async def定义的异步函数中,否则逻辑不会生效。
内容的提问来源于stack exchange,提问作者JaWarrior
相关产品推荐
相关产品推荐

