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

Discord Bot调用get_channel返回NoneType引发send属性错误

问题原因及解决思路

你遇到的'NoneType' object has no attribute 'send'本质是外部文件里的bot对象不是主文件中已经登录的那个Bot实例,导致get_channel找不到频道——这个未正确关联的bot根本没连接到Discord服务器,自然拿不到任何频道数据。

核心问题点

你在discord_general.py里直接写了bot.get_channel(),但这个bot并没有指向主文件中bot = commands.Bot(...)创建的、已经完成登录并关联服务器的实例。外部文件里的bot要么是未正确导入的无效对象,要么是另一个未初始化的Bot实例,所以调用get_channel必然返回None。

而把代码放到主文件里能正常运行,就是因为主文件里的bot是已经完成登录、能获取服务器频道列表的有效实例。

可行的解决方法

方法1:把Bot实例作为参数传给外部函数

修改外部文件的函数,让它接收bot实例作为参数:

# discord_general.py
async def online_msg(bot):
    channel = bot.get_channel(998723366473187378)
    if channel:  # 先判断频道是否存在,避免报错
        await channel.send("hello")

然后在主文件的命令里调用时传入bot:

# 主文件
@bot.command()
async def t(ctx):
    await dg.online_msg(bot)
    await ctx.send("Done")

方法2:调整文件结构,避免循环导入

如果不想传参,可以拆分Bot初始化逻辑,让所有文件共用同一个实例:

  1. 新建bot_setup.py专门负责初始化Bot:
# bot_setup.py
import discord
from discord.ext import commands
from dotenv import load_dotenv
import os
import discord_general as dg

load_dotenv()
intents = discord.Intents.default()
intents.members = True
intents.messages = True

bot = commands.Bot(intents=intents, command_prefix="!", help_command=dg.MyHelp())
  1. 主文件导入这个bot:
# main.py
from bot_setup import bot
import discord_general as dg

@bot.command()
async def t(ctx):
    await dg.online_msg()
    await ctx.send("Done")

bot.run(os.getenv('TOKEN'))
  1. 外部文件也从bot_setup.py导入bot:
# discord_general.py
from bot_setup import bot

async def online_msg():
    channel = bot.get_channel(998723366473187378)
    if channel:
        await channel.send("hello")

额外注意事项

  • 确保Bot在目标服务器里有查看频道和发送消息的权限
  • 再次确认频道ID无空格、无多余字符
  • 主文件里的await dg.online(msg)是笔误,应该是await dg.online_msg()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:36:32