NEF Discord Bot对接Hypixel Skyblock AH API运行异常排查
问题根源
- 猴子补丁执行顺序错误。你当前代码先导入了aiohttp、discord.py(依赖aiohttp实现网络通信)、ssl相关模块,之后才导入grequests或执行
gevent.monkey.patch_all(),才会触发MonkeyPatchWarning。gevent猴子补丁必须在所有网络相关第三方库导入前执行,晚于ssl、socket、aiohttp这类模块导入时,补丁不会对已加载模块生效,后续grequests发起请求时会出现SSL递归错误、请求卡死无返回的问题,直接打断拍卖行数据拉取流程。 - 核心拉取逻辑未绑定有效触发入口。目前你仅实现了
$verify这类指令的响应逻辑,拍卖行轮询拉取任务要么没有注册为Discord Bot的后台循环任务,要么作为同步阻塞代码被异步事件循环跳过,所以哪怕Bot正常登录,这部分逻辑根本不会被调度执行。
修复方案
调整导入顺序,优先执行猴子补丁
把猴子补丁代码放到整个程序的最顶部,所有其他导入语句(包括discord、aiohttp、grequests、你自己写的业务模块)之前:from gevent import monkey monkey.patch_all() # 所有其他import语句全部移到这两行之后调整后MonkeyPatchWarning会直接消失,gevent能正确给所有网络模块打补丁。
正确注册后台轮询任务,避免阻塞主事件循环
二选一即可:- 保留现有grequests实现:用discord.py自带的任务循环工具注册轮询任务,把同步阻塞的grequests请求放到线程池执行,避免卡住Bot的主异步循环:
from discord.ext import tasks import grequests @tasks.loop(seconds=60) # 轮询间隔可自行调整,不建议低于60秒避免触发接口限流 async def ah_poll_task(): # 同步grequests请求丢到线程池执行,不阻塞主循环 resp_list = await bot.loop.run_in_executor(None, lambda: grequests.map( # 这里放你构造的全部分页AH请求 )) # 后续接已有的BIN物品筛选、价格/品质规则校验、消息推送逻辑即可 @bot.event async def on_ready(): if not ah_poll_task.is_running(): ah_poll_task.start() - 彻底移除grequests/gevent(推荐):直接用discord.py自带的aiohttp客户端发异步请求拉取AH数据,从根源上避免猴子补丁的顺序冲突问题,性能更好也更适配异步生态,不需要额外打任何补丁,不会和现有Bot依赖产生冲突。
- 保留现有grequests实现:用discord.py自带的任务循环工具注册轮询任务,把同步阻塞的grequests请求放到线程池执行,避免卡住Bot的主异步循环:
增加全链路异常捕获
在AH拉取、筛选、推送逻辑的最外层加异常捕获,把错误信息打印到控制台。之前你看不到具体报错,大概率是后台任务抛出的异常被异步事件循环直接吞掉,加捕获后可以快速定位剩余的隐性问题:async def ah_poll_task(): try: # 全部AH业务逻辑放这里 except Exception as e: print(f"AH任务运行异常: {repr(e)}")
内容的提问来源于stack exchange,提问作者Tr0uBlz3
相关产品推荐
相关产品推荐

