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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:11:20