运行Discord机器人无输出无报错,如何排查修复?
Discord机器人无输出仅显示exit code 0的解决方法
问题概述
开发私人服务器Discord机器人(包含LBot.py、main.py、LResponses.py三个文件,使用PyCharm Community Edition 2022)时,运行代码后无任何输出(无报错、无预期启动提示),仅显示Process finished with exit code 0,预期机器人启动后输出DiscordBotName is now up, and running!。
核心问题与修复
1. 致命错误:client.run(TOKEN)位置错误
原代码中client.run(TOKEN)被嵌套在on_message事件函数内部,而on_message仅在机器人收到消息时才会触发——但机器人根本未启动,这段代码永远不会执行,程序直接结束,因此无任何输出。
需将client.run(TOKEN)移至run_discord_bot函数的最外层,所有事件定义完成后执行。
修正后的LBot.py代码
import discord import LResponses async def send_message(message, user_message, is_private): try: response = LResponses.get_response(user_message) await message.author.send(response) if is_private else await message.channel.send(response) except Exception as e: print(e) def run_discord_bot(): # 替换为你实际的机器人Token,格式为类似"xxxxxxxxxxxx.xxxxxx.xxxxxxxxxxxxxxxxxxxxxxxx"的字符串 TOKEN = "你的Discord机器人Token" intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event async def on_ready(): print(f'{client.user} is now up, and running!') @client.event async def on_message(message): if message.author == client.user: return username = str(message.author) user_message = str(message.content) channel = str(message.channel) print(f'{username} said "{user_message}" ({channel})') # 改用startswith更安全,避免空消息引发索引错误 if user_message.startswith('%'): user_message = user_message[1:] await send_message(message, user_message, is_private=True) else: await send_message(message, user_message, is_private=False) # 将启动语句移至事件定义完成后 client.run(TOKEN)
其他优化点
2. Token语法错误修正
原代码中TOKEN = '*Discord Bot 'Token' goes here*'存在字符串嵌套单引号的语法错误,需替换为正确的机器人Token,用双引号或转义单引号包裹。
3. 命令匹配大小写统一
原LResponses.py中$roll10的判断区分大小写,建议改为和其他命令一致的小写匹配,提升用户体验:
import random def get_response(message: str) -> str: p_message = message.lower() if p_message == '$hello': return 'Hello!' if p_message == '$roll10': # 改为小写匹配,取消大小写限制 return str(random.randint(1, 10)) if p_message == '$help': return '`If you see this Message, tell the programmer about the Morning Coffee.`'
4. 空消息安全处理
原代码中user_message[0] == '%'的判断,若用户发送空消息或仅输入%会引发索引错误,改用user_message.startswith('%')可避免该问题(已在修正代码中实现)。
内容的提问来源于stack exchange,提问作者Yehia-Afifi
相关产品推荐
相关产品推荐

