You need to enable JavaScript to run this app. 新手用Python开发的Discord Bot代码运行异常,该如何排查修复?
优惠活动
大模型
产品
解决方案
定价
更多

新手用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 11:24:10