如何在Python Discord机器人开发中导入并正确使用ctx参数?
问题修复方案
错误原因
- 你导入的
ctx是完全无关的第三方模块,discord.py中的ctx是命令框架的上下文对象,不需要主动导入,只有使用@commands.command装饰的命令函数才会自动传入ctx参数。 - 你当前使用的是
on_message原生消息事件,触发时传入的参数就是message对象,不需要通过ctx获取消息所属服务器。
修复步骤
- 删掉代码中
import ctx这一行 - 将
guild = ctx.message.guild替换为guild = message.guild,直接使用事件传入的message对象即可获取所属服务器 - 修正
if message.content.startswith("")的判断条件:空串会匹配所有消息,意味着任何用户发任何内容都会触发创建频道,建议修改为自定义触发指令,例如if message.content.startswith("!创建频道") - 调整最后两行代码顺序:
client.run()会阻塞程序执行,后面的my_secret = os.environ['TOKEN']永远不会运行,如果你需要单独保存token可以把这行挪到client.run()前面,不需要的话可以直接删除无用的my_secret赋值行。
修正后的完整代码
import discord import os client = discord.Client() @client.event async def on_ready(): print('We have logged in as {0.user}'.format(client)) @client.event async def on_message(message): if message.author == client.user: return # 这里替换为你想要的触发指令 if message.content.startswith("!create_channel"): print(message.content) guild = message.guild await guild.create_text_channel('cool-channel') # 如果你需要单独存token可以取消下面这行注释 # my_secret = os.environ['TOKEN'] client.run(os.getenv('TOKEN'))
内容的提问来源于stack exchange,提问作者BDF_TacticsYT
相关产品推荐
相关产品推荐

