如何用Python+discord.py无事件触发发送Discord频道消息
实现思路与代码参考
核心逻辑
discord.py 是基于 asyncio 的异步框架,要实现无阻塞的消息推送,需将币安的条件检查逻辑包装成异步任务,嵌入到 discord.py 的事件循环中,避免阻塞主进程。
步骤与代码示例
- 安装依赖
pip install discord.py python-binance python-dotenv
- 完整代码
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
相关产品推荐
相关产品推荐

