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

如何通过Django触发Nextcord开发的Discord Bot发送消息?

实现Django触发Discord Bot发送订单通知的方案

根据你的需求,不用webhook、不轮询,让Django主动触发Bot发消息,核心思路是给Bot加一个轻量的API接口,Django在生成新订单时调用这个接口即可。以下是具体实现步骤:

1. 给Discord Bot添加API服务

Nextcord基于asyncio,所以用aiohttp搭个异步API,和Bot的事件循环共存,不用单独开进程。

示例代码(整合到Bot中)

import nextcord
from nextcord.ext import commands
import aiohttp
from aiohttp import web

# 初始化Bot,按你现有的配置来
intents = nextcord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)

# 替换成你要发消息的频道ID(可以用slash命令先获取频道ID)
TARGET_CHANNEL_ID = 123456789012345678

async def handle_new_order(request):
    # 从Django请求里拿订单数据
    order_data = await request.json()
    
    # 获取目标频道
    channel = bot.get_channel(TARGET_CHANNEL_ID)
    if not channel:
        return web.Response(status=404, text="目标频道不存在")
    
    # 构造通知消息,按需调整格式
    msg_content = (
        f"📢 新订单来了!\n"
        f"订单ID: {order_data['order_id']}\n"
        f"客户: {order_data['customer_name']}\n"
        f"金额: {order_data['amount']}元\n"
        f"商品清单: {', '.join(order_data['products'])}"
    )
    await channel.send(msg_content)
    return web.Response(status=200, text="通知已发送")

async def start_api_server():
    # 创建aiohttp应用
    app = web.Application()
    # 注册POST接口,Django调用这个地址
    app.add_routes([web.post('/trigger-order-notify', handle_new_order)])
    # 启动服务,监听EC2的0.0.0.0和8001端口(可自行修改端口)
    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, '0.0.0.0', 8001)
    await site.start()

@bot.event
async def on_ready():
    print(f"Bot已登录: {bot.user}")
    # Bot启动后立刻启动API服务
    await start_api_server()

# 保留你现有的slash命令
@bot.slash_command(name="test", description="测试Bot是否正常")
async def test_cmd(interaction: nextcord.Interaction):
    await interaction.response.send_message("Bot在线!")

# 运行Bot,替换成你的Token
bot.run("YOUR_BOT_TOKEN")

2. 配置EC2安全组

确保EC2服务器的安全组开放你指定的端口(比如8001),并且只允许你的Django服务器IP访问这个端口,避免无关请求调用API。

3. Django端触发API调用

在Django创建新订单的逻辑里(比如信号或者视图),发送POST请求到Bot的API接口。

示例代码(用requests库)

先安装依赖:pip install requests

然后在订单模型的信号里添加触发逻辑:

import requests
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Order  # 替换成你的订单模型

@receiver(post_save, sender=Order)
def send_order_to_discord(sender, instance, created, **kwargs):
    # 只在订单刚创建时触发
    if not created:
        return
    
    # 整理订单数据,按需调整字段
    order_info = {
        "order_id": instance.id,
        "customer_name": instance.customer.username,  # 替换成你的客户字段
        "amount": float(instance.total_amount),
        "products": [item.product.name for item in instance.order_items.all()]  # 替换成你的商品关联字段
    }
    
    # 调用Bot的API
    try:
        resp = requests.post(
            "http://你的EC2公网IP:8001/trigger-order-notify",
            json=order_info,
            # 可选:加API密钥验证,防止恶意调用
            headers={"X-Secret-Key": "YOUR_RANDOM_SECRET_KEY"}
        )
        resp.raise_for_status()
    except requests.exceptions.RequestException as e:
        # 这里可以记录日志或者做异常处理
        print(f"发送Discord通知失败: {str(e)}")

额外优化建议

  • API安全:一定要加验证,比如上面的X-Secret-Key,Bot端在handle_new_order里检查请求头的密钥是否正确,避免被恶意调用。
  • 异常处理:Bot端要处理频道不存在、消息发送失败的情况,Django端也要处理请求超时、API不可达的情况,避免影响订单创建流程。
  • 后续部署:如果更换服务器,只需要修改Django里的API地址即可。如果用容器部署,可以把Bot和API放在同一个容器,或者用内部网络通信,更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:32:35