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

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权限,要么是机器人根本没加入目标频道所在的服务器,或是没有目标频道的查看权限。
修复步骤
  1. 修正频道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)
  1. 检查客户端初始化的Intents配置,确保开启必要权限,同时去Discord开发者后台的机器人设置页,打开Privileged Gateway Intents分类下的消息内容、服务器成员相关权限开关:
import discord
# 配置必要意图
intents = discord.Intents.default()
intents.message_content = True # 读取消息内容、识别命令必须开启
client = discord.Client(intents=intents)

# 后续你的命令逻辑、client.run(token) 保持原有位置即可
  1. 权限校验:确认邀请机器人进服务器时给了足够的权限,机器人在目标频道内拥有「查看频道」「发送消息」的权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:15:46