You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:36:04