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

Discord机器人on_ready()无法赋值全局变量问题排查

问题分析与解决:Discord机器人中on_ready无法正确为全局变量channel赋值的原因

错误原因

你遇到的TypeError: 'int' object has no attribute 'send',本质是线程启动时机过早:

  • 代码里先启动了执行send()函数的线程,此时client.run()还没完成登录流程,on_ready事件根本没触发,channel还是初始赋值的整数613。
  • 当send()里执行await channel.send(...)时,自然会因为channel是整数而非Discord频道对象报错。
  • 另外,Discord.py是异步框架,直接用Thread混用同步/异步代码,会引发线程安全问题,这也是隐患之一。

解决方案

核心思路是:确保channel被正确赋值为频道对象后,再启动消息发送循环,同时抛弃线程,用Discord.py原生的异步任务来实现。

修正后的代码

import discord
from asyncio import create_task

intents = discord.Intents.all()
intents.message_content = True  # Discord.py v2.x必须显式开启该意图才能读取消息内容
client = discord.Client(intents=intents, chunk_guilds_at_startup=False)

main_channel_id = int(input('Enter channel ID you want to chat in: '))
channel = None

@client.event
async def on_ready():
    global channel
    channel = await client.fetch_channel(main_channel_id)
    print(f"已登录为 {client.user},绑定频道:{channel.name}")
    # 登录完成后启动发送消息的异步任务
    create_task(send_messages())

async def send_messages():
    while True:
        msg_content = input('Send a message: ')
        if channel:  # 确保频道对象已初始化
            await channel.send(msg_content)

@client.event
async def on_message(message):
    # 打印新消息(排除机器人自己发的消息)
    if message.author != client.user:
        print(f"[{message.channel.name}] {message.author.name}: {message.content}")

try:
    client.run('你的机器人Token')
except discord.errors.HTTPException:
    from os import system
    system('kill 1')

关键改进点

  • 把发送消息的逻辑改成异步任务create_task,在on_ready里启动,确保channel已经被赋值为有效的频道对象。
  • 开启message_content意图,满足打印新消息的功能需求。
  • 在send_messages里增加channel非空判断,避免意外报错。
  • 移除了线程,符合Discord.py的异步编程模型,避免线程安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17