如何为Discord机器人添加!say指令?零基础Python(Replit)求助
问题分析与修复方案
你的代码存在几个关键问题导致!say指令无法工作,以下是问题点和修正后的完整代码:
核心问题
- 重复定义
on_message函数,且第二个函数未添加@client.event装饰器,Discord客户端无法识别该事件处理逻辑 - 两次调用
client.run(),一个客户端实例只能启动一次,重复调用会直接导致程序崩溃 keep_alive()调用顺序错误,应在客户端启动前执行- 处理
!say时未做边界判断,若用户仅发送!say无后续内容会触发索引错误 - 未排除机器人自身消息,可能引发无限循环回复
修正后的完整代码
import os import discord from keep_alive import keep_alive # 初始化客户端,必须开启消息内容意图才能读取消息内容 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print("I'm in") print(client.user) @client.event async def on_message(message): # 跳过机器人自身发送的消息,避免循环 if message.author == client.user: return # !reverse 指令逻辑 if message.content.startswith("!reverse"): await message.channel.send(message.content[::-1]) # !say 指令逻辑 if message.content.startswith("!say"): # 分割指令与内容,处理空输入情况 message_parts = message.content.split(" ", 1) if len(message_parts) > 1: echo_content = message_parts[1] await message.channel.send(echo_content) else: await message.channel.send("请输入要我重复的内容哦!") # 启动保活服务 keep_alive() # 仅调用一次客户端启动 my_secret = os.environ['DISCORD_BOT_SECRET'] client.run(my_secret)
关键修改说明
- 开启消息内容意图:Discord默认关闭消息内容读取权限,需手动开启
message_content意图,否则机器人无法获取消息文本 - 合并事件处理函数:将两个
on_message合并为一个,统一处理所有指令,确保保留@client.event装饰器让客户端识别 - 调整启动流程:先启动保活服务再启动客户端,保证服务正常运行
- 添加边界判断:分割消息时先检查长度,避免空输入导致的索引错误
- 移除重复启动调用:仅保留一次
client.run()调用,避免程序崩溃
内容的提问来源于stack exchange,提问作者holey
相关产品推荐
相关产品推荐

