如何制作可发送HTTP请求并返回Embed的Discord斜杠命令机器人
实现Discord斜杠命令机器人方案
所需模块
discord.py:核心库,用于构建Discord机器人并处理斜杠命令交互requests:发送HTTP请求获取外部数据python-dotenv(可选):安全管理机器人令牌等敏感配置
分步实现
1. 前置准备
- 在Discord开发者平台创建机器人应用,获取机器人令牌,开启消息内容特权和应用命令权限
- 安装依赖:
pip install discord.py requests python-dotenv
2. 基础代码结构
import discord from discord import app_commands import requests from dotenv import load_dotenv import os # 加载环境变量(令牌) load_dotenv() # 初始化客户端与命令树 intents = discord.Intents.default() client = discord.Client(intents=intents) tree = app_commands.CommandTree(client)
3. 实现斜杠命令逻辑
@tree.command(name="findsomething", description="根据输入内容查询信息") @app_commands.describe(something="要查询的内容(必填)") async def find_something(interaction: discord.Interaction, something: str): # 存储用户输入的参数 search_query = something # 发送HTTP请求(替换为你的目标API地址) try: api_response = requests.get(f"https://your-api-url.com/search?query={search_query}") api_response.raise_for_status() response_data = api_response.json() except requests.exceptions.RequestException as err: await interaction.response.send_message(f"请求失败:{str(err)}", ephemeral=True) return # 构建Discord Embed消息 result_embed = discord.Embed( title=f"查询结果:{search_query}", color=discord.Color.green() ) # 遍历响应数据并填充Embed(根据你的API返回结构调整) if isinstance(response_data, list) and len(response_data) > 0: for item in response_data: # 示例:假设每个结果项包含name和detail字段,按需修改 result_embed.add_field( name=item.get("name", "未知名称"), value=item.get("detail", "无详细信息"), inline=False ) else: result_embed.description = "未找到匹配的结果" # 回复用户 await interaction.response.send_message(embed=result_embed)
4. 启动机器人并同步命令
@client.event async def on_ready(): # 全局同步命令(生效需等待1-2小时),测试时建议指定服务器同步 await tree.sync() # 测试用:同步到指定服务器,替换为你的服务器ID # await tree.sync(guild=discord.Object(id=123456789012345678)) print(f"机器人已登录:{client.user}") # 启动机器人 client.run(os.getenv("DISCORD_TOKEN"))
关键注意事项
- 令牌不要硬编码,用
.env文件存储,格式为DISCORD_TOKEN=你的机器人令牌 - 必须根据目标API的实际响应结构调整数据遍历和Embed填充逻辑
- 异常处理不可少,避免因网络问题或API错误导致机器人崩溃
- 服务器级命令同步会立即生效,适合开发测试;全局同步需等待Discord审核生效
内容的提问来源于stack exchange,提问作者wdp
相关产品推荐
相关产品推荐

