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

如何编写支持用户自定义参数变量的Python Discord机器人命令?

可自定义触发角色的Discord机器人消息功能实现方案

核心逻辑

  • 用本地文件(或数据库)存储各服务器的触发角色ID,避免硬编码
  • 提供管理员专属斜杠命令,用于设置/移除触发角色
  • 监听用户角色更新事件,检测到用户获得触发角色时发送指定消息

代码实现(基于discord.py v2.x)

1. 初始化准备

先创建trigger_roles.json文件(初始内容为{}),用来存储服务器ID与触发角色ID的映射关系。同时在Discord开发者门户开启成员意图(Member Intent),否则无法监听角色变化。

2. 完整代码

import discord
from discord import app_commands
import json
import os

# 初始化机器人意图
intents = discord.Intents.default()
intents.members = True  # 必须开启成员意图
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)

# 加载/保存触发角色数据
def load_trigger_roles():
    return json.load(open('trigger_roles.json')) if os.path.exists('trigger_roles.json') else {}

def save_trigger_roles(data):
    json.dump(data, open('trigger_roles.json', 'w'), indent=4)

trigger_roles = load_trigger_roles()

# 设置触发角色的斜杠命令
@tree.command(name="set_trigger_role", description="设置用户获得后触发消息的角色")
@app_commands.checks.has_permissions(manage_roles=True)
@app_commands.describe(role="目标触发角色")
async def set_trigger_role(interaction: discord.Interaction, role: discord.Role):
    guild_id = str(interaction.guild_id)
    trigger_roles[guild_id] = role.id
    save_trigger_roles(trigger_roles)
    await interaction.response.send_message(f已设置触发角色:{role.mention},用户获得该角色时将自动发送通知。", ephemeral=True)

# 移除触发角色的斜杠命令
@tree.command(name="remove_trigger_role", description="取消当前服务器的触发角色设置")
@app_commands.checks.has_permissions(manage_roles=True)
async def remove_trigger_role(interaction: discord.Interaction):
    guild_id = str(interaction.guild_id)
    if guild_id in trigger_roles:
        del trigger_roles[guild_id]
        save_trigger_roles(trigger_roles)
        await interaction.response.send_message("已移除触发角色设置。", ephemeral=True)
    else:
        await interaction.response.send_message("当前服务器未设置触发角色。", ephemeral=True)

# 监听角色变化事件
@client.event
async def on_member_update(before: discord.Member, after: discord.Member):
    guild_id = str(before.guild.id)
    if guild_id not in trigger_roles:
        return
    
    trigger_role_id = trigger_roles[guild_id]
    # 检查用户是否新增了触发角色
    before_role_ids = {r.id for r in before.roles}
    after_role_ids = {r.id for r in after.roles}
    
    if trigger_role_id in after_role_ids and trigger_role_id not in before_role_ids:
        # 自定义消息发送逻辑,示例:优先发私信,失败则发服务器系统频道
        try:
            await after.send(f🎉 恭喜你获得角色:<@&{trigger_role_id}>!")
        except discord.Forbidden:
            if before.guild.system_channel:
                await before.guild.system_channel.send(f🎉 恭喜{after.mention}获得角色:<@&{trigger_role_id}>!")

# 同步命令并启动机器人
@client.event
async def on_ready():
    await tree.sync()
    print(f"机器人已登录:{client.user}")

client.run("你的机器人TOKEN")

关键说明

  • 权限控制:斜杠命令通过manage_roles权限限制,仅管理员/版主可操作
  • 消息逻辑:示例中优先给用户发私信,若用户关闭私信则 fallback 到服务器系统频道,可根据需求修改为指定频道
  • 存储扩展:如果机器人服务大量服务器,建议将JSON替换为SQLite/MySQL等数据库,提升数据稳定性
  • 命令同步:首次启动机器人后,斜杠命令可能需要1-5分钟同步到服务器,耐心等待即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:08:29