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

Discord机器人报告按钮交互开发:重启后生效的实现需求

实现持久化报告按钮与频道管理功能

核心思路

要让按钮在机器人重启后仍能正常响应,必须满足两个核心条件:

  • 给每个交互按钮设置唯一的custom_id(不能用系统自动生成的ID)
  • 在机器人启动时注册对应的View,让Discord服务器记住这些交互处理逻辑

完整代码实现

import discord
from discord.ext import commands

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

# 定义删除频道的持久化视图
class DeleteChannelView(discord.ui.View):
    def __init__(self):
        # timeout=None 表示视图永久有效,不会过期
        super().__init__(timeout=None)

    @discord.ui.button(label="删除此举报频道 🗑️", style=discord.ButtonStyle.danger, custom_id="delete_report_channel")
    async def delete_channel(self, interaction: discord.Interaction, button: discord.ui.Button):
        # 权限校验:仅允许管理员或频道创建相关人员删除
        if interaction.user.guild_permissions.manage_channels:
            await interaction.channel.delete()
            await interaction.response.send_message("频道已删除", ephemeral=True)
        else:
            await interaction.response.send_message("你没有权限删除此频道", ephemeral=True)

# 定义报告按钮的持久化视图
class ReportView(discord.ui.View):
    def __init__(self):
        super().__init__(timeout=None)

    @discord.ui.button(label="用户举报 🚫", style=discord.ButtonStyle.red, custom_id="report_user")
    async def report_user(self, interaction: discord.Interaction, button: discord.ui.Button):
        await self.create_report_channel(interaction, "用户举报频道")

    @discord.ui.button(label="违规举报 🚫", style=discord.ButtonStyle.red, custom_id="report_violation")
    async def report_violation(self, interaction: discord.Interaction, button: discord.ui.Button):
        await self.create_report_channel(interaction, "违规举报频道")

    @discord.ui.button(label="其他反馈 📩", style=discord.ButtonStyle.green, custom_id="report_feedback")
    async def report_feedback(self, interaction: discord.Interaction, button: discord.ui.Button):
        await self.create_report_channel(interaction, "其他反馈频道")

    async def create_report_channel(self, interaction: discord.Interaction, channel_name: str):
        guild = interaction.guild
        # 设置频道权限:仅发起者和机器人可访问
        overwrites = {
            guild.default_role: discord.PermissionOverwrite(read_messages=False),
            interaction.user: discord.PermissionOverwrite(read_messages=True, send_messages=True),
            guild.me: discord.PermissionOverwrite(read_messages=True, manage_channels=True)
        }
        # 创建专属频道
        channel = await guild.create_text_channel(
            name=channel_name,
            overwrites=overwrites,
            reason=f"用户{interaction.user.name}发起的{channel_name}"
        )
        # 在新频道发送带删除按钮的引导消息
        embed = discord.Embed(title=f"📩 {channel_name}", description="请在这里描述你的内容,完成后可点击下方按钮删除频道", color=0x3994d4)
        await channel.send(embed=embed, view=DeleteChannelView())
        # 给发起者发送私密反馈
        await interaction.response.send_message(f"已为你创建专属频道:{channel.mention}", ephemeral=True)

# 机器人启动时注册所有持久化视图
@bot.event
async def on_ready():
    bot.add_view(ReportView())
    bot.add_view(DeleteChannelView())
    print(f"机器人登录成功,已注册持久化视图")

# 触发报告按钮的命令
@bot.command()
async def report(ctx):
    embed = discord.Embed(title="📮 举报与反馈", description="点击下方按钮提交你的需求", color=0x3994d4)
    await ctx.send(embed=embed, view=ReportView())

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

关键细节说明

  1. 持久化机制:每个按钮的custom_id是唯一标识,timeout=None让视图永久生效,on_ready中注册视图确保机器人重启后仍能响应历史消息的按钮交互。
  2. 权限控制:创建频道时设置了严格的权限规则,避免无关人员干扰举报流程;删除频道时增加权限校验,防止误操作。
  3. 替代on_interaction:直接给按钮绑定回调函数比全局on_interaction逻辑更清晰,模块化的代码更易维护,也更适配持久化需求。

内容的提问来源于stack exchange,提问作者Heeryun Cho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:55:16