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
相关产品推荐
相关产品推荐

