
在 discord.py 中,为机器人添加新功能通常涉及到处理用户消息。最直接的方法是在 on_message 事件监听器中检查消息内容。对于获取用户头像的需求,我们需要:
以下是在 on_message 函数中实现 !pfp 命令的基本代码片段:
import discord
# ... (其他导入和机器人初始化代码) ...
@client.event
async def on_message(message):
# 确保机器人不响应自己的消息
if message.author == client.user:
return
# 检查是否为 !pfp 命令
if message.content.startswith('!pfp'):
# 检查消息中是否有被提及的用户
if message.mentions:
user = message.mentions[0] # 获取第一个被提及的用户
pfp_url = user.avatar.url # 获取用户的头像 URL
await message.channel.send(pfp_url)
else:
await message.channel.send("请提及一个用户,例如:`!pfp @用户名`")
return # 处理完命令后返回,避免执行后续的 on_message 逻辑
# ... (此处可以放置其他非命令相关的 on_message 逻辑) ...
# 例如:
# username = str(message.author)
# user_message = str(message.content)
# channel = str(message.channel)
# print(f'{username} said: {user_message} ({channel})')
# await send_message(message, user_message, is_private=False)代码解析:
虽然这种方法能够实现功能,但将所有命令逻辑都堆砌在 on_message 函数中会导致代码难以维护和扩展。当机器人功能增多时,on_message 会变得非常臃肿。
为了更清晰、模块化地管理机器人命令,discord.py 提供了 discord.ext.commands 扩展。它允许我们定义独立的命令函数,并通过装饰器 @bot.command() 注册它们。
核心优势:
首先,我们需要将 discord.Client 替换为 discord.ext.commands.Bot。Bot 类是 Client 的子类,因此它继承了 Client 的所有功能,并添加了命令处理能力。
import discord
from discord.ext import commands
# 定义命令前缀,例如 '!'
COMMAND_PREFIX = '!'
# 创建 Bot 实例
# 需要指定 intents,特别是 message_content 和 members
intents = discord.Intents.default()
intents.message_content = True # 允许机器人读取消息内容
intents.members = True # 允许机器人获取成员信息(用于提及用户)
bot = commands.Bot(command_prefix=COMMAND_PREFIX, intents=intents)
@bot.event
async def on_ready():
print(f'{bot.user} 已经上线并运行!')
# 如果需要处理非命令消息,可以保留 on_message 事件,但要确保不与命令处理冲突
@bot.event
async def on_message(message):
if message.author == bot.user:
return
# 在这里处理非命令消息,例如:
if "@everyone" in message.content:
await message.channel.send(f"{message.author.mention}, 请勿提及所有人!")
return # 处理完后返回,避免将此消息传递给命令处理器
# 重要:将消息传递给命令处理器
await bot.process_commands(message)bot.process_commands(message) 的重要性: 当你在 on_message 事件中添加了自定义逻辑后,如果希望 commands.Bot 也能处理该消息中的命令,就必须调用 await bot.process_commands(message)。否则,你的自定义 on_message 逻辑会“吞掉”命令,导致 @bot.command() 注册的命令无法被触发。
现在,我们可以使用 @bot.command() 装饰器来定义 !pfp 命令:
@bot.command(name='pfp', help='获取指定用户的头像。用法: !pfp [@用户]')
async def get_profile_picture(ctx, user: discord.Member = None):
"""
获取被提及用户的头像。如果没有提及用户,则获取命令发送者的头像。
"""
if user is None:
user = ctx.author # 如果没有提及用户,则默认为命令发送者
pfp_url = user.avatar.url
embed = discord.Embed(
title=f"{user.display_name} 的头像",
color=discord.Color.blue()
)
embed.set_image(url=pfp_url)
embed.set_footer(text=f"请求者: {ctx.author.display_name}")
await ctx.send(embed=embed)代码解析:
下面是一个整合了 Bot 结构、!pfp 命令和 on_message 事件处理的完整示例:
import discord
from discord.ext import commands
import requests # 假设你还需要天气功能
# 机器人配置
TOKEN = 'YOUR_BOT_TOKEN' # 替换为你的机器人令牌
WEATHER_API_KEY = 'YOUR_WEATHER_API_KEY' # 替换为你的天气 API 密钥
COMMAND_PREFIX = '!'
# 配置 Intents (意图)
# 必须启用 message_content 和 members
intents = discord.Intents.default()
intents.message_content = True
intents.members = True # 对于获取用户头像和成员信息是必需的
# 创建 Bot 实例
bot = commands.Bot(command_prefix=COMMAND_PREFIX, intents=intents)
# 机器人上线事件
@bot.event
async def on_ready():
print(f'{bot.user} 已经上线并运行!')
print(f'Bot ID: {bot.user.id}')
print(f'Bot Name: {bot.user.name}')
# on_message 事件:处理非命令消息
@bot.event
async def on_message(message):
# 确保机器人不响应自己的消息
if message.author == bot.user:
return
# 打印消息日志
username = str(message.author)
user_message = str(message.content)
channel = str(message.channel)
print(f'{username} 在 {channel} 说: {user_message}')
# 示例:处理 @everyone 提及
if '@everyone' in message.content:
await message.channel.send(f"{message.author.mention}, 请勿提及所有人!")
# return # 如果希望处理完后不继续执行其他逻辑,可以取消注释
# 示例:处理特定关键词
if '重要' in user_message: # 假设 "önemli" 对应中文 "重要"
if message.mentions:
mentioned_user = message.mentions[0]
if mentioned_user != bot.user:
await mentioned_user.send(f'{message.author.display_name} 提醒您: {message.content}')
# return
# 重要:将消息传递给命令处理器,以便 @bot.command() 注册的命令能够被触发
await bot.process_commands(message)
# !pfp 命令:获取用户头像
@bot.command(name='pfp', help='获取指定用户的头像。用法: !pfp [@用户]')
async def get_profile_picture(ctx, user: discord.Member = None):
"""
获取被提及用户的头像。如果没有提及用户,则获取命令发送者的头像。
"""
if user is None:
user = ctx.author # 如果没有提及用户,则默认为命令发送者
pfp_url = user.avatar.url
embed = discord.Embed(
title=f"{user.display_name} 的头像",
color=discord.Color.blue()
)
embed.set_image(url=pfp_url)
embed.set_footer(text=f"请求者: {ctx.author.display_name}")
await ctx.send(embed=embed)
# 示例:!hava 命令(天气查询)
def get_weather(city):
base_url = 'http://api.openweathermap.org/data/2.5/weather'
params = {
'q': city,
'appid': WEATHER_API_KEY,
'units': 'metric'
}
try:
response = requests.get(base_url, params=params)
response.raise_for_status() # 检查 HTTP 错误
return response.json()
except requests.exceptions.RequestException as e:
print(f"天气查询失败: {e}")
return None
def create_weather_embed(city, data):
embed = discord.Embed(title=f"{city} 的天气状况:", color=0x00ff00)
embed.add_field(name="天气", value=data['weather'][0]['description'], inline=False)
embed.add_field(name="温度", value=f"{data['main']['temp']}°C", inline=True)
embed.add_field(name="体感温度", value=f"{data['main']['feels_like']}°C", inline=True)
embed.add_field(name="云量", value=f"{data['clouds']['all']}%", inline=True)
embed.add_field(name="湿度", value=f"{data['main']['humidity']}%", inline=True)
embed.set_thumbnail(url=f"http://openweathermap.org/img/w/{data['weather'][0]['icon']}.png")
return embed
@bot.command(name='hava', help='查询指定城市的天气。用法: !hava [城市名]')
async def weather(ctx, *, city: str): # 使用 *city 表示获取所有剩余的参数作为城市名
"""
查询指定城市的天气信息。
"""
weather_data = get_weather(city)
if weather_data:
embed = create_weather_embed(city, weather_data)
await ctx.send(embed=embed)
else:
await ctx.send(f"无法找到城市 '{city}' 的天气信息,或 API 出现错误。")
# 运行机器人
bot.run(TOKEN)Intents (意图):
机器人权限:
头像类型:
错误处理:
discord.Member 与 discord.User:
通过本教程,你已经学会了如何在 discord.py 机器人中实现一个获取用户头像的命令。我们强调了从基础的 on_message 实现到推荐的 discord.ext.commands.Bot 结构的转变,后者提供了更清晰、更易于维护的代码组织方式。正确配置 Intents 和理解 commands.Context 对象是成功构建功能强大且稳定的 Discord 机器人的关键。现在,你可以基于这些知识进一步扩展你的机器人功能,为用户提供更多互动体验。
以上就是Discord.py 机器人获取用户头像命令教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号