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

discord.py调用指定Guild频道报错guild不能为整数如何修复

问题根因
  • 你直接将整数类型的服务器ID赋值给guild变量,discord.py框架中get_channel()是服务器实例对象的内置方法,纯整数ID没有该方法,因此触发“guild不能为整数类型”的类型错误。
  • 代码还存在其他会导致运行失败的逻辑问题:
    • 直接用字符串"OfficialMember"赋值给role变量,没有获取实际的角色对象,无法调用.members属性拉取成员列表
    • 代码中未定义newRole变量,运行到角色判断逻辑时会直接抛出NameError
    • 框架中发送消息、获取频道/角色的接口都是异步方法,放在普通同步函数中不加await调用不会实际执行
    • 硬编码单个服务器、频道ID无法适配多服务器部署的需求
修复方案
  1. 开启机器人的成员权限:前往Discord开发者后台,在对应机器人的Bot页面,打开Privileged Gateway Intents分类下的Server Members Intent开关,否则机器人无法接收成员更新事件,也拉取不到完整的角色成员列表。
  2. 将更新成员列表的逻辑改为异步函数,不再硬编码服务器ID,从触发事件的成员对象中动态获取当前服务器信息,通过ID映射配置适配多服务器场景。
  3. 通过计算更新前后的角色差集获取用户新添加的角色,解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:01:06