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

如何用Python+discord.py无事件触发发送Discord频道消息

实现思路与代码参考

核心逻辑

discord.py 是基于 asyncio 的异步框架,要实现无阻塞的消息推送,需将币安的条件检查逻辑包装成异步任务,嵌入到 discord.py 的事件循环中,避免阻塞主进程。

步骤与代码示例

  1. 安装依赖
pip install discord.py python-binance python-dotenv
  1. 完整代码
import asyncio
import os
from dotenv import load_dotenv
from discord import Client, Intents
from binance import AsyncClient, BinanceSocketManager

# 加载敏感配置(建议用.env文件,不要硬编码)
load_dotenv()
DISCORD_TOKEN = os.getenv('DISCORD_TOKEN')
TARGET_CHANNEL_ID = int(os.getenv('TARGET_CHANNEL_ID'))
BINANCE_API_KEY = os.getenv('BINANCE_API_KEY')
BINANCE_API_SECRET = os.getenv('BINANCE_API_SECRET')

# 初始化Discord客户端,开启消息内容权限(必须)
intents = Intents.default()
intents.message_content = True
discord_client = Client(intents=intents)

# 全局存储币安异步客户端
binance_client = None

async def monitor_binance_conditions():
    """异步监控币安条件,满足则推送Discord消息"""
    global binance_client
    await binance_client.__aenter__()

    # 示例1:实时监控交易行情(无延迟)
    socket_manager = BinanceSocketManager(binance_client)
    async with socket_manager.trade_socket('BTCUSDT') as trade_socket:
        while True:
            trade_data = await trade_socket.recv()
            current_price = float(trade_data['p'])
            # 自定义触发条件:价格低于30000USDT时推送
            if current_price < 30000:
                target_channel = discord_client.get_channel(TARGET_CHANNEL_ID)
                await target_channel.send(f"⚠️ BTCUSDT触发预警!当前价格:{current_price} USDT")
                # 添加冷却,避免重复刷屏
                await asyncio.sleep(60)

    # 示例2:定时轮询价格(适合非实时场景)
    # while True:
    #     ticker = await binance_client.get_symbol_ticker(symbol='BTCUSDT')
    #     current_price = float(ticker['price'])
    #     if current_price < 30000:
    #         target_channel = discord_client.get_channel(TARGET_CHANNEL_ID)
    #         await target_channel.send(f"⚠️ BTCUSDT触发预警!当前价格:{current_price} USDT")
    #         await asyncio.sleep(300)  # 5分钟冷却
    #     await asyncio.sleep(10)  # 每10秒检查一次

@discord_client.event
async def on_ready():
    print(f"Discord机器人已登录:{discord_client.user}")
    # 初始化币安异步客户端
    global binance_client
    binance_client = AsyncClient(api_key=BINANCE_API_KEY, api_secret=BINANCE_API_SECRET)
    # 启动监控任务,不阻塞主事件循环
    asyncio.create_task(monitor_binance_conditions())

# 启动Discord客户端
discord_client.run(DISCORD_TOKEN)

关键注意事项

  • Discord权限配置:机器人需要被邀请到目标服务器,且拥有「发送消息」权限;必须在Discord开发者后台开启message_content意图。
  • 币安API配置:确保API密钥开启了「读取行情」权限,切勿泄露密钥。
  • 无阻塞保障:用asyncio.create_task启动监控任务,让它在后台运行,不干扰discord.py的主事件循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:46:37