如何在 discord.py 中提及用户?

How do I mention a user in discord.py?

我正在尝试使用 discord.py 编写一个简单的机器人代码,所以我开始使用有趣的命令来熟悉该库。

import discord

client = discord.Client()

@client.event
async def on_message(message):
    # we do not want the bot to reply to itself
    if message.author == client.user:
        return

    if message.content.startswith('!hug'):
        await message.channel.send(f"hugs {message.author.mention}")

    if message.content.startswith('!best'):
        user_id = "201909896357216256"
        user_mention = ???  # How to convert user_id into a mention
        await message.channel.send(f'{user_mention} is the best')

User 对象中,使用属性 User.mention 获取代表用户提及的字符串。要从用户 ID 获取用户对象,您需要 Client.get_user_info(id)。要从用户名 ('ZERO') 和鉴别器 ('#6885') 获取用户,请使用效用函数 discord.utils.get(iterable, **attrs)。在上下文中:

if message.content.startswith('!best'):
    user = discord.utils.get(message.server.members, name = 'ZERO', discriminator = 6885)
    # user = client.get_user_info(id) is used to get User from ID, but OP doesn't need that
    await client.send_message(message.channel, user.mention + ' mentioned')

经过几天的反复试验,我终于想出了如何做到这一点,希望其他人能从中受益,并比我实际遭受的痛苦少。 解决方案最终很简单..

  if message.content.startswith('!best'):
        myid = '<@201909896357216256>'
        await client.send_message(message.channel, ' : %s is the best ' % myid)

如果你正在处理命令,你最好使用discord.py的内置命令函数,你的拥抱命令将变成:

import discord
from discord.ext import commands

@commands.command(pass_context=True)
async def hug(self, ctx):
    await self.bot.say("hugs {}".format(ctx.message.author.mention()))

这是假设您在代码开头做了类似的事情:

def __init__(self):
    self.bot = discord.Client(#blah)

discord.py 1.x - 2.x (2021) 的更新答案:

其他一些解决方案现在已过时,因为 discord.py 的语法已更改并且旧版本不再有效。

如果您只有用户 ID,则为:

user_id = "201909896357216256"
await message.channel.send(f"<@{user_id}> is the best")

如果您有 user/member 对象,那么它是:

await message.channel.send(f"{user.mention} is the best")

如果您只有用户名和鉴别符(机器人和用户必须共享服务器并且必须打开成员缓存):

user = discord.utils.get(client.users, name="USERNAME", discriminator="1234")
if user is None:
    print("User not found")
else:
    await message.channel.send(f"{user.mention} is the best")

如果您在使用命令而不是 on_message 时有 ctx,请替换 message.channel

如果你只想从 on_message 回调中回复,你可以像这样从作者那里获取提及字符串:

@bot.event
async def on_message(message):
    # No infinite bot loops
    if message.author == bot.user or message.author.bot:
        return

    mention = message.author.mention
    response = f"hey {mention}, you're great!"
    await message.channel.send(response)

虽然 OP 的问题早已解决(并且可能被遗忘)——如果您在 Python 中构建 Discord 机器人,仍然很难找到此信息——希望这对某人有所帮助。 如果您尝试使用 @bot.command 方法 - 以下将起作用(在 python3 中):

@bot.command(name='ping', help='Ping the bot to text name')
async def ping(ctx):
    await ctx.send('Pong ' + format(ctx.author))
    print("debug: " + dir(ctx.author))

如果你想显示"author"(调用命令的人)的昵称,你可以使用这个代替":

@bot.command(name='ping', help='Ping the bot to text name')
async def ping(ctx):
    # await ctx.send('Pong {0}'.format(ctx.author))
    await ctx.send('Pong ' + format(ctx.author.display_name))
    print("debug: " + dir(ctx.author))

另一个有用的提示: 您可以使用 dir(ctx.author) 查看 ctx.author 对象 属性