新手用Python开发的Discord Bot代码运行异常,该如何排查修复?
Discord Bot 代码故障排查与修复
核心问题说明
- 重复定义事件导致逻辑被覆盖:Python中后定义的同名函数会直接覆盖之前的实现,你先后两次定义了
on_ready、on_message事件,最初编写的“收到Hello回复Hi”的逻辑会被完全冲掉,根本不会生效。 - 重复触发客户端启动逻辑:两次调用
client.run(os.getenv('TOKEN'))会导致Discord客户端重复初始化,直接抛出连接冲突错误,程序崩溃退出。 - 代码执行顺序完全错乱:你把情绪词列表、鼓励语列表、随机语录获取函数等定义,放在了第一次
client.run()的后方。由于client.run()是阻塞运行的,程序执行到第一次调用位置就会卡住,后续所有定义的代码根本没有机会被执行到。 - 缺少新版本discord.py要求的权限配置:discord.py 2.0及以上版本默认关闭消息内容读取权限,即便代码逻辑完全正确,也无法获取频道内的消息内容,所有触发逻辑都不会响应。
修复后的完整可用代码
import discord import os import requests import json import random # 显式声明所需的权限意图 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) # 先定义所有常量、工具函数 sad_words = ["sad","alone","scared","depressed","SAD","Sad"] starter_encouragements = [ "You got this. I know you do 😁", "I know it's hard, but you'll get through this :)" ] def get_quote(): response = requests.get("https://zenquotes.io/api/random") json_data = json.loads(response.text) quote = json_data[0]['q'] + " -" + json_data[0]['a'] return(quote) # 全局仅定义一次on_ready事件 @client.event async def on_ready(): print('We have logged in as {0.user}'.format(client)) # 全局仅定义一次on_message事件,合并所有消息响应逻辑 @client.event async def on_message(message): # 跳过机器人自身发送的消息,避免无限循环 if message.author == client.user: return msg = message.content # 合并原有Hello回复逻辑 if message.content.startswith('Hello'): await message.channel.send('Hi!') # 触发随机语录的逻辑 if message.content.startswith('inspire'): quote = get_quote() await message.channel.send(quote) # 情绪触发鼓励语的逻辑 if any(word in msg for word in sad_words): await message.channel.send(random.choice(starter_encouragements)) # 程序末尾仅启动一次客户端 client.run(os.getenv('TOKEN'))
额外注意事项
- 需要在Discord开发者平台的机器人配置页,手动开启
MESSAGE CONTENT INTENT权限开关,否则即便代码配置了对应意图,也会被Discord服务端拒绝连接。 - 编写Python代码时要遵循从上到下的执行逻辑:常量、工具函数优先定义,其次注册事件,最后在程序末尾调用启动命令,不要把启动逻辑插在代码中间。
内容的提问来源于stack exchange,提问作者Abdurrahman A
相关产品推荐
相关产品推荐

