如何在 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
对象 的 属性 。
我正在尝试使用 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
对象 的 属性 。