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

Discord Bot已上线但无消息响应,求问题排查

Discord机器人无响应问题排查与修复

问题描述

我制作了一个Discord机器人,它已成功上线,但完全无法正常工作。原本期望机器人至少能提示已收到消息,但没有任何反应。

相关代码

main.py

from typing import Final 
import os
from dotenv import load_dotenv
from discord import Intents, Client, Message
from responses import get_response

#load token
load_dotenv()
TOKEN: Final[str] = os.getenv('DISCORD_TOKEN')
# print(TOKEN)

#BOT SETUP

intents: Intents = Intents.default()
intents.message_content = True
client: Client = Client(intents=intents)

#message functionality
async def send_message(message: Message, user_message: str) -> None:
    if not user_message:
        print("(Message was empty because intents were not enabled problably)")
        return

    if is_private := user_message[0] ==  '?':
        user_message = user_message[1:]
        
    try: 
        response: str = get_response(user_message)
        await message.author.send(response) if is_private else await message.channel.send(response)
    except Exception as e:
        print(e)
        
#handle bot startup
@client.event
async def on_ready() -> None:
    print(f'{client.user} is now running!!')
    
#handle incoming messages
client.event
async def on_message(message: Message) -> None:
    print("A message was sent")
    if message.author == client.user:
        return
    
    username: str = str(message.author)
    user_message: str = message.content
    channel: str = str(message.channel)
    
    print(f'[{channel}] {username}: "{user_message}"')
    await send_message(message, user_message)
    
#main entry point
def main() -> None:
    client.run(token=TOKEN)
    
if __name__ == '__main__':
    main()

response.py

from random import choice, randint

def get_response(user_input: str) -> str:
    print("function called")
    lowered: str = user_input.lower()
    
    if lowered == '':
        return "Well, you're awfully silent..."
    elif 'hello' in lowered:
        return "hello there"
    elif 'roll dice' in lowered:
        return f'You rolled : {randint(1,6)}'
    else:
        return choice([
            'I do not understand',
            'what are you talking about',
            'do you mind rephrasing that'
        ])

问题根源

核心错误是**on_message事件未正确注册**:你在定义消息处理函数时,漏掉了装饰器的@符号。原代码中写的是client.event,正确的写法应该是@client.event——没有这个@,Discord客户端无法识别这是一个事件处理器,导致机器人完全不会监听和响应任何消息。

修复方法

修改main.py中的消息处理部分,给client.event加上@符号:

#handle incoming messages
@client.event
async def on_message(message: Message) -> None:
    print("A message was sent")
    if message.author == client.user:
        return
    
    username: str = str(message.author)
    user_message: str = message.content
    channel: str = str(message.channel)
    
    print(f'[{channel}] {username}: "{user_message}"')
    await send_message(message, user_message)

额外检查项

为确保机器人正常运行,还需确认以下几点:

  • 登录Discord开发者后台,在机器人设置中开启Message Content Intent(代码中已启用该意图,必须后台同步开启)
  • 验证.env文件中的DISCORD_TOKEN是否正确,无拼写或格式错误
  • 邀请机器人到服务器时,授予其必要权限(如发送消息、读取消息内容等)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:12:06