如何用discord.py实现Bot给非消息作者发私信及poke功能
解决Discord.py机器人的私信目标问题
嘿,我来帮你把这个戳人功能改对!你现在的问题是机器人只给发指令的人发私信,其实核心就是把目标用户从ctx.author换成被@的那个用户,下面一步步来:
1. 核心思路:获取被@的目标用户
当有人发送!poke @用户#0000时,Discord会把@的用户信息包含在消息的mentions属性里,我们可以直接从这里拿到目标用户对象。
2. 完整代码示例
下面是改好的poke命令代码,我会加上注释说明关键部分:
import discord from discord.ext import commands # 初始化机器人,记得替换成你的前缀和token bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.event async def on_ready(): print(f"Logged in as {bot.user}") @bot.command(name="poke") async def poke(ctx): # 检查消息里有没有提到用户 if not ctx.message.mentions: await ctx.send("你得@一个用户才能戳TA呀!") return # 取第一个被@的用户(如果@多个的话,这里默认戳第一个) target_user = ctx.message.mentions[0] try: # 给目标用户发私信 await target_user.send("Boop") await ctx.send(f"我已经戳了{target_user.mention}啦!") except discord.Forbidden: # 处理无法发送私信的情况(比如对方关了私信,或者Bot不在对方的服务器里) await ctx.send(f"哎呀,我没法给{target_user.mention}发私信,可能TA关了私信权限或者我和TA不在同一个服务器里!") # 运行机器人,替换成你的token bot.run("你的机器人Token")
3. 通用的非作者私信方法
如果想给任意用户发私信(不管是不是当前消息的作者),有三种常用方式:
- 通过@获取用户:就像上面的例子,用
ctx.message.mentions拿到目标用户对象,直接调用send()方法。 - 通过用户ID获取:如果你知道目标用户的ID(一串数字),可以用
bot.fetch_user()来获取用户对象,然后发私信:# 假设目标用户ID是123456789 target_user = await bot.fetch_user(123456789) await target_user.send("这是给你的私信!") - 从服务器成员列表获取:如果用户在当前服务器里,也可以用
ctx.guild.get_member(user_id)拿到成员对象,再发私信。
关键注意点
- 确保你的机器人开启了必要的Intents:比如
message_content和members权限,不然可能拿不到@的用户信息。 - 处理
Forbidden异常:不是所有用户都能收到Bot的私信,比如用户设置了“仅接受好友私信”,或者Bot和用户没有共同服务器,这时候发送会失败,一定要捕获这个异常给用户提示。
内容的提问来源于stack exchange,提问作者GooeyGreenMuffins
相关产品推荐
相关产品推荐

