Ljzd-PRO / nonebot-plugin-mystool

QQ聊天、频道机器人插件 | 米游社工具-每日米游币任务、游戏签到、商品兑换、免抓包登录、原神崩铁便笺提醒
https://pypi.org/project/nonebot-plugin-mystool
MIT License
392 stars 47 forks source link

【日常自动签到报错】 #323

Closed Clulu1499 closed 1 week ago

Clulu1499 commented 1 month ago

每日到时间自动签到途中会出现报错,大佬能看看是什么原因吗 QQ截图20240629003608

Ljzd-PRO commented 3 weeks ago

和 #294 一样,貌似有时候就不会,可能和消息发送有关,用的是QQ频道还是onebot

Clulu1499 commented 2 weeks ago

和 #294 一样,貌似有时候就不会,可能和消息发送有关,用的是QQ频道还是onebot

是onebot,但是报错之后手动输入/任务 和/签到 就能跑完所有账号

dontdot commented 2 weeks ago

@Ljzd-PRO

image

https://github.com/Ljzd-PRO/nonebot-plugin-mystool/blob/a0dd139a043db38238d8a10c9675578fc56f8673/src/nonebot_plugin_mystool/api/myb_missions_api.py#L112 我在任务签到这每个return前都添加了logger查看需要return的内容,出现这个问题的时候

    sign_status, sign_points = await mission_obj.sign(user)
TypeError: cannot unpack non-iterable NoneType object

还是没有看到任何一条新增的logger日志。是不是因为with,所以出现异常导致的返回都是none的情况下才没有日志出现

Ljzd-PRO commented 2 weeks ago

可以检查一下 sign 函数内部运行情况。如果有异常且未被拦截的话,会抛出异常,而不是返回 None,目前没看出哪边有可能返回 None,有异常都会拦截,并且都会返回元组,没有异常的所有情况也都会有元组返回。

Ljzd-PRO commented 2 weeks ago

大概率和这里的 continue 有关

https://github.com/Ljzd-PRO/nonebot-plugin-mystool/blob/a0dd139a043db38238d8a10c9675578fc56f8673/src/nonebot_plugin_mystool/api/myb_missions_api.py#L146-L157

Ljzd-PRO commented 2 weeks ago

报错以后再手动运行能够成功,可能是因为之前已经完成人机验证了,不会进入人机验证有问题的那一环

dontdot commented 2 weeks ago

报错以后再手动运行能够成功,可能是因为之前已经完成人机验证了,不会进入人机验证有问题的那一环

是的,所以这个问题每天第一次才会有,奇怪的是如果所以情况都会有元组返回,这个实际上不是的,就如我截图log里一样,我在每个return前都有设置一个debug级的logger,且在每次迭代中新增了打印res.text的logger 每当出现这个问题时元组的logger和第二次迭代请求的res并没有打印出来,那是不是说明continue导致第二次迭代并没有成功还影响到了元组的返回

Ljzd-PRO commented 2 weeks ago

报错以后再手动运行能够成功,可能是因为之前已经完成人机验证了,不会进入人机验证有问题的那一环

是的,所以这个问题每天第一次才会有,奇怪的是如果所以情况都会有元组返回,这个实际上不是的,就如我截图log里一样,我在每个return前都有设置一个debug级的logger,且在每次迭代中新增了打印res.text的logger 每当出现这个问题时元组的logger和第二次迭代请求的res并没有打印出来,那是不是说明continue导致第二次迭代并没有成功还影响到了元组的返回

看了一下应该是第二次迭代在 tenacity 的 AsyncRetrying__anext__ 里就已经因为不满足重试条件,抛出了 StopAsyncIteration 提前停止了。然后继续执行 sign 函数,但是后续没有内容因此返回值是 None

Ljzd-PRO commented 2 weeks ago

解决方法是手动抛出一个异常来进入下一次重试,或者修改重试条件,刚刚补充返回值为 None 的情况下会重试(虽然不是函数,但是 tenacity 默认是记录为 None),现在可以再试试。

dontdot commented 2 weeks ago

明天看下结果 应该是没问题了