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

Discord(pycord)中custom_id属性含义解析及代码示例咨询

关于Pycord中custom_id属性的详解与代码示例

什么是custom_id?

custom_id是Pycord里给自定义交互组件(按钮、选择菜单、模态框这类)设置的唯一字符串标识,完全由你自己定义,用来给机器人区分不同的组件。

为什么需要它?

  • Discord交互系统的刚需:用户点按钮、选菜单时,Discord只会把组件的custom_id传给机器人,机器人得靠这个ID判断要执行啥逻辑。
  • 区分同类型组件:比如你放了三个红色按钮,一个删消息、一个清频道、一个踢人,没custom_id的话机器人根本不知道用户点的是哪个。
  • 持久化组件识别:如果消息里的按钮是长期存在的(不是一次性的),后续用户触发时,机器人还是能通过custom_id认出它,执行对应逻辑。

常见用途

  • 绑定组件的回调逻辑:每个custom_id对应一个处理函数,点到哪个ID就触发对应的代码。
  • 传递简单参数:可以把信息塞进custom_id里,比如"delete_msg_12345",回调时拆分字符串拿到消息ID12345,直接操作对应消息。
  • 批量组件管理:批量生成按钮时,用不同的custom_id给每个按钮标记功能,不用写重复的回调模板。

代码示例

1. 基础按钮使用

创建一个带custom_id的按钮,绑定打招呼逻辑:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

@bot.command()
async def test_btn(ctx):
    # 创建按钮,指定custom_id为"hello_btn"
    hello_btn = discord.ui.Button(label="点我打招呼", style=discord.ButtonStyle.primary, custom_id="hello_btn")
    
    # 给这个custom_id绑定回调函数
    @discord.ui.button(custom_id="hello_btn")
    async def hello_callback(interaction, button):
        await interaction.response.send_message(f"嗨,{interaction.user.mention}!", ephemeral=True)
    
    # 把按钮加到视图里发送
    view = discord.ui.View()
    view.add_item(hello_btn)
    await ctx.send("试试点击按钮:", view=view)

bot.run("你的机器人Token")

2. 多按钮区分逻辑

两个按钮用不同custom_id,分别实现发表情和删消息:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

@bot.command()
async def multi_btn(ctx):
    # 创建两个按钮,custom_id分别为"send_emoji"和"delete_msg"
    emoji_btn = discord.ui.Button(label="发个表情", style=discord.ButtonStyle.success, custom_id="send_emoji")
    delete_btn = discord.ui.Button(label="删这条消息", style=discord.ButtonStyle.danger, custom_id="delete_msg")
    
    # 对应第一个按钮的回调
    @discord.ui.button(custom_id="send_emoji")
    async def emoji_callback(interaction, button):
        await interaction.response.send_message("😎", ephemeral=True)
    
    # 对应第二个按钮的回调
    @discord.ui.button(custom_id="delete_msg")
    async def delete_callback(interaction, button):
        await interaction.message.delete()
        await interaction.response.send_message("消息已删", ephemeral=True)
    
    view = discord.ui.View()
    view.add_item(emoji_btn)
    view.add_item(delete_btn)
    await ctx.send("选一个操作:", view=view)

bot.run("你的机器人Token")

3. 从custom_id解析参数

把用户ID塞进custom_id,回调时提取并问候:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())

@bot.command()
async def param_btn(ctx):
    # custom_id格式为"greet_user_用户ID"
    target_id = ctx.author.id
    greet_btn = discord.ui.Button(
        label="问候我",
        style=discord.ButtonStyle.secondary,
        custom_id=f"greet_user_{target_id}"
    )
    
    # 用正则匹配带参数的custom_id,或者直接拆分字符串
    @discord.ui.button(custom_id=r"greet_user_(\d+)")
    async def greet_callback(interaction, button):
        # 拆分custom_id拿到用户ID
        user_id = int(button.custom_id.split("_")[-1])
        user = interaction.guild.get_member(user_id) or interaction.user
        await interaction.response.send_message(f"你好,{user.display_name}!", ephemeral=True)
    
    view = discord.ui.View()
    view.add_item(greet_btn)
    await ctx.send("点击按钮问候自己:", view=view)

bot.run("你的机器人Token")

内容的提问来源于stack exchange,提问作者Это я Билли

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:17:40