Python开发Discord bot不报错不崩溃但停止发消息问题求助
问题根因排查
你碰到的运行一段时间后无响应的问题由以下几个核心原因导致:
- 无意义的高频webhook创建触发Discord资源上限:你将
create_webhook逻辑放在了on_message事件的最开头,任何消息(包括bot自己发送的消息)触发事件时都会先创建新的webhook,之后才判断是否是bot自身发送的消息再return,这部分bot自身消息触发创建的webhook完全没有走删除逻辑。Discord单个频道最多允许创建10个webhook,累计超过上限后新的webhook创建请求会被拒绝,加上你没有做异常捕获,所以不会抛出报错,只会表现为后续操作无响应。 - 重复调用API触发速率限制:你在
on_message事件中反复调用await client.fetch_user()获取用户对象,该接口属于Discord高频限制接口,调用次数超限后会被Discord服务端限流,后续请求会被挂起,也会导致操作无响应。 - 全量删除webhook的冗余操作:每次执行功能时都会拉取频道所有webhook遍历删除,不必要的API请求进一步提升了限流概率。
修复方案
你可以按照以下逻辑调整代码即可解决问题:
- 调整执行顺序,先判断消息发送者是否为bot自身,是则直接终止事件处理,避免无意义的资源消耗
- 提前将需要匹配的用户ID存为常量,直接比对
message.author.id即可,不需要每次调用API拉取用户对象 - 将webhook创建逻辑移到实际需要使用的分支内,用完仅删除本次创建的webhook即可,不需要全量遍历删除
- 给API操作增加异常捕获,方便后续排查问题
修改后参考代码
import discord TOKEN = '你的Bot Token' # 提前定义需要匹配的用户ID,注意是整数类型 ALLOWED_USER_IDS = {123456789, 987654321} # 替换成你自己的用户ID client = discord.Client() @client.event async def on_ready(): print('{0.user} is locked and loaded'.format(client)) @client.event async def on_message(message): # 第一步先判断是不是自己发的消息,是就直接返回 if message.author == client.user: return username = str(message.author).split('#')[0] user_message = str(message.content) channel = str(message.channel.name) print(f'{username}: {user_message} ({channel})') hook = None try: if user_message.lower() == '!hooktest' or message.author.id in ALLOWED_USER_IDS: # 只有需要用的时候才创建webhook hook = await message.channel.create_webhook(name="HookTest7033") if user_message.lower() == '!hooktest': await hook.send("Hello") await hook.send("Bye") else: await hook.send("Test response") except Exception as e: # 捕获异常打印日志 print(f"操作出错: {str(e)}") finally: # 不管执行成功还是出错,只要创建了webhook就删除本次创建的 if hook is not None: await hook.delete() client.run(TOKEN)
内容的提问来源于stack exchange,提问作者magicpants
相关产品推荐
相关产品推荐

