Discord.py Bot向指定频道发消息报AttributeError错误排查
问题根因
你遇到的'NoneType' object has no attribute 'send'报错,是因为client.get_channel()没有找到对应ID的频道,返回了空值None,对空值调用send()方法就会触发异常,具体触发原因有两个:
- 传参类型错误:
client.get_channel()要求传入整数类型的频道ID,你的代码里用f'{canal}'把ID转成了字符串类型,方法匹配不到对应频道缓存,直接返回None。哪怕你打印canal能看到正确的ID数字,字符串和整数类型不匹配也会导致查找失败。 - 缓存/权限问题:如果类型修正后还是返回None,大概率是机器人没有缓存目标频道信息:要么是初始化客户端时没开启必要的Intents权限,要么是机器人根本没加入目标频道所在的服务器,或是没有目标频道的查看权限。
修复步骤
- 修正频道ID的传参类型,增加空值校验,修改对应代码段如下:
async def ping(message, canal, role): if message.author.guild_permissions.administrator: await message.channel.purge(limit=1) # 将传入的频道ID转为整数,不要转成字符串 try: channel_id = int(canal) except ValueError: await message.channel.send("频道ID格式错误,请输入纯数字的频道ID") return channel = client.get_channel(channel_id) # 增加空判断,避免直接抛出异常 if not channel: await message.channel.send("未找到指定频道,请确认ID正确、机器人已加入对应服务器且拥有频道查看权限") return await channel.send(role)
- 检查客户端初始化的Intents配置,确保开启必要权限,同时去Discord开发者后台的机器人设置页,打开Privileged Gateway Intents分类下的消息内容、服务器成员相关权限开关:
import discord # 配置必要意图 intents = discord.Intents.default() intents.message_content = True # 读取消息内容、识别命令必须开启 client = discord.Client(intents=intents) # 后续你的命令逻辑、client.run(token) 保持原有位置即可
- 权限校验:确认邀请机器人进服务器时给了足够的权限,机器人在目标频道内拥有「查看频道」「发送消息」的权限。
内容的提问来源于stack exchange,提问作者Crapts
相关产品推荐
相关产品推荐

