Discord机器人无法读取聊天消息问题排查求助
Discord机器人无法读取聊天消息的问题修复
核心问题
你重复定义了多个on_message事件处理函数,discord.py只会执行最后一个被定义的函数,所以只有!resume命令能被响应,!play和!pause的逻辑完全不会触发。
修复方案
1. 合并所有命令逻辑到同一个on_message函数
把三个独立的on_message合并成一个,通过分支判断处理不同命令:
import discord import youtube_dl intents = discord.Intents.default() intents.message_content = True intents.voice_states = True intents.members = True client = discord.Client(intents=intents) @client.event async def on_ready(): print('Logged in as') print(client.user.name) print(client.user.id) print('------') @client.event async def on_message(message): # 忽略机器人自身发送的消息,避免循环触发 if message.author == client.user: return # !play 命令处理 if message.content.startswith('!play'): print(message.content) youtube_url = message.content[7:] ydl_opts = { 'format': 'bestaudio/best', 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', }], } with youtube_dl.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(youtube_url, download=False) audio_url = info['url'] voice_channel = message.author.voice.channel vc = await voice_channel.connect() vc.play(discord.FFmpegPCMAudio(audio_url)) # !pause 命令处理 elif message.content.startswith('!pause'): vc = message.guild.voice_client if vc and vc.is_playing(): vc.pause() # !resume 命令处理 elif message.content.startswith('!resume'): vc = message.guild.voice_client if vc and vc.is_paused(): vc.resume() client.run('DISCORD_TOKEN')
2. 确认Discord开发者门户的意图权限
即使代码中开启了message_content意图,你还需要在Discord开发者后台的机器人页面,找到Privileged Gateway Intents板块,开启Message Content Intent开关,否则机器人无法读取消息内容。
补充优化说明:
- 增加
if message.author == client.user: return,避免机器人响应自身消息造成循环 - 在语音客户端状态判断前增加
vc and,防止机器人未连接语音时抛出错误
内容的提问来源于stack exchange,提问作者Alex Frolov
相关产品推荐
相关产品推荐

