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

如何为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)   

关键修改说明

  1. 开启消息内容意图:Discord默认关闭消息内容读取权限,需手动开启message_content意图,否则机器人无法获取消息文本
  2. 合并事件处理函数:将两个on_message合并为一个,统一处理所有指令,确保保留@client.event装饰器让客户端识别
  3. 调整启动流程:先启动保活服务再启动客户端,保证服务正常运行
  4. 添加边界判断:分割消息时先检查长度,避免空输入导致的索引错误
  5. 移除重复启动调用:仅保留一次client.run()调用,避免程序崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:30:49