Discord.py如何识别提及的用户ID为指定ID并触发对应消息回复
Discord机器人提及检测功能修复方案
核心错误点
- 同时实例化了
discord.Client和commands.Bot两个机器人实例,你用client注册事件、登录运行,却用未登录的bot调用fetch_member接口,必然会请求失败 - 变量
peter存储的是字符串格式的用户ID,而fetch_member返回的是Member对象,直接用==比较两者永远返回False,应该比较Member对象的id属性 - 已经通过
message.mentions直接获取到了被提及用户的Member对象,无需再手动拆分消息内容、解析ID二次拉取用户信息,多余操作不仅冗余还容易触发解包报错 - 时间接口返回的本身就是JSON对象,不需要转成字符串后切片取值,直接读取对象内的字段更稳定
- 用文本匹配判断
@everyone/@here逻辑不准确,直接使用消息对象自带的mention_everyone属性更可靠
修正后的完整代码
import os import discord import requests from discord.ext import commands # 仅保留一个Bot实例即可,不需要额外声明Client bot = commands.Bot(command_prefix = '$', intents=discord.Intents.all()) # 替换成Peter的实际数字ID,注意是int类型 PETER_USER_ID = 1234567890 @bot.event async def on_ready(): print(f'We have logged in as {bot.user}') def get_athens_time(): response = requests.get("http://api.timezonedb.com/v2.1/get-time-zone?key=W9BJQ3QMGG69&format=json&by=position&lat=37.9838&lng=23.7275") time_data = response.json() # 直接提取时间字段,比字符串切片更稳定 full_time = time_data['formatted'] return full_time.split()[1][:5] @bot.event async def on_message(message): if message.author == bot.user: return # 直接用内置属性判断是否@了全体成员 if message.mention_everyone: return # 检测第一个被提及用户是否为目标用户 if message.mentions and message.mentions[0].id == PETER_USER_ID: athens_time = get_athens_time() await message.channel.send(f"The time in Athens is currently: {athens_time}") bot.run(os.environ['TOKEN'])
额外注意事项
- 新版Discord API需要手动开启消息内容权限,你需要进入Discord开发者后台的Bot设置页,打开
Message Content Intent开关,否则无法正常读取消息内容 - 建议给时间接口请求逻辑增加异常捕获,避免接口超时或报错导致机器人崩溃
内容的提问来源于stack exchange,提问作者Adam Marx
相关产品推荐
相关产品推荐

