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

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正常登录,这部分逻辑根本不会被调度执行。
修复方案
  1. 调整导入顺序,优先执行猴子补丁
    把猴子补丁代码放到整个程序的最顶部,所有其他导入语句(包括discord、aiohttp、grequests、你自己写的业务模块)之前:

    from gevent import monkey
    monkey.patch_all()
    # 所有其他import语句全部移到这两行之后
    

    调整后MonkeyPatchWarning会直接消失,gevent能正确给所有网络模块打补丁。

  2. 正确注册后台轮询任务,避免阻塞主事件循环
    二选一即可:

    • 保留现有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依赖产生冲突。
  3. 增加全链路异常捕获
    在AH拉取、筛选、推送逻辑的最外层加异常捕获,把错误信息打印到控制台。之前你看不到具体报错,大概率是后台任务抛出的异常被异步事件循环直接吞掉,加捕获后可以快速定位剩余的隐性问题:

    async def ah_poll_task():
        try:
            # 全部AH业务逻辑放这里
        except Exception as e:
            print(f"AH任务运行异常: {repr(e)}")
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:36:26