百鬼夜行开始撒豆脚本异常退出,重试必现
在提问之前...
- [x] 我已经搜索了现有的 issues
- [x] 我在提问题之前至少花费了 5 分钟来思考和准备
- [x] 我已经阅读了文档中的 常见问题(FAQ)
- [x] 这个问题出现了至少三次,不是偶发的
- [x] 我使用 OAS 的 dev 分支
描述你的问题
百鬼夜行开始撒豆脚本异常退出,重试必现
如何复现
- 前往 '...'
- 点击 '....'
- 滑动到 '....'
- 出现问题
预期行为
No response
相关 Logs
════════════════════════════════════════════════════════════════════════════════
───────────────────────────────── HYAKKIYAKOU ──────────────────────────────────
════════════════════════════════════════════════════════════════════════════════
2025-10-18 20:53:29.899 | config_model.py:0169 | INFO | auto save config
2025-10-18 20:53:29.906 | nemu_ipc.py:0235 | INFO | NemuIpcImpl init, nemu_folder=D:\MuMu12\MuMu Player 12, ipc_dll=D:\MuMu12\MuMu Player
12\nx_device\12.0\shell\sdk\external_renderer_ipc.dll, instance_id=1, display_id=0
2025-10-18 20:53:29.917 | logger.py:0320 | INFO | [Screen_size] 1280x720
2025-10-18 20:53:29.920 | script.py:0375 | INFO | module_path:
D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\tasks\Hyakkiyakou\script_task.py, module_name: script_task
2025-10-18 20:53:30.205 | game_ui.py:0138 | INFO | UI get current page
2025-10-18 20:53:30.217 | logger.py:0320 | INFO | [UI] page_town
2025-10-18 20:53:30.219 | logger.py:0312 | INFO | <<< UI GOTO PAGE_HYAKKIYAKOU >>>
2025-10-18 20:53:31.219 | game_ui.py:0270 | INFO | Current page: page_town. Following shortest path:
2025-10-18 20:53:31.221 | game_ui.py:0272 | INFO | page_town -> page_hyakkiyakou
2025-10-18 20:53:31.223 | game_ui.py:0299 | INFO | Page switch: page_town -> page_hyakkiyakou
2025-10-18 20:53:32.348 | control.py:0074 | INFO | Click ( 898, 228) @ PAGE_TOWN_GOTO_HYAKKIYAKOU
2025-10-18 20:53:32.350 | logger.py:0312 | INFO | <<< MINITOUCH INIT >>>
2025-10-18 20:53:32.359 | logger.py:0320 | INFO | [Device Orientation] 1 (HOME key on the right)
2025-10-18 20:53:32.362 | connection.py:0440 | INFO | Reuse forward: ForwardItem(serial='127.0.0.1:16416', local='tcp:20597',
remote='localabstract:minitouch')
2025-10-18 20:53:32.365 | minitouch.py:0448 | INFO | v 1
2025-10-18 20:53:32.367 | minitouch.py:0452 | INFO | ^ 10 720 1280 0
2025-10-18 20:53:32.368 | minitouch.py:0475 | INFO | $ 23158
2025-10-18 20:53:32.369 | minitouch.py:0479 | INFO | minitouch running on port: 20597, pid: 23158
2025-10-18 20:53:32.372 | minitouch.py:0482 | INFO | max_contact: 10; max_x: 720; max_y: 1280; max_pressure: 0
2025-10-18 20:53:32.424 | game_ui.py:0105 | INFO | Waiting for page_hyakkiyakou
2025-10-18 20:53:33.427 | game_ui.py:0325 | INFO | [1.0s]Page arrived page_hyakkiyakou
2025-10-18 20:53:33.738 | control.py:0074 | INFO | Click (1144, 625) @ HYA_HACCESS
2025-10-18 20:53:34.933 | control.py:0074 | INFO | Click (1136, 590) @ HYA_HSTART
2025-10-18 20:53:35.252 | control.py:0074 | INFO | Click (1013, 301) @ hselect_3
2025-10-18 20:53:37.040 | control.py:0074 | INFO | Click (1207, 597) @ HYA_HSTART
2025-10-18 20:53:37.349 | control.py:0074 | INFO | Click ( 950, 424) @ hselect_3
2025-10-18 20:53:39.144 | control.py:0074 | INFO | Click (1136, 640) @ HYA_HSTART
2025-10-18 20:53:40.047 | device.py:0135 | INFO | Add stuck record: BATTLE_STATUS_S
2025-10-18 20:53:40.051 | logger.py:0312 | INFO | <<< START HYAKKIYAKOU >>>
2025-10-18 20:53:40.054 | logger.py:0354 | ERROR | AttributeError: 'Device' object has no attribute 'root_node'
╭───────────────────────────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────────────────────────╮
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\script.py:377 in run │
│ │
│ 374 │ │ │ module_path = str(Path.cwd() / 'tasks' / command / (module_name+'.py')) │
│ 375 │ │ │ logger.info(f'module_path: {module_path}, module_name: {module_name}') │
│ 376 │ │ │ task_module = load_module(module_name, module_path) │
│ ❱ 377 │ │ │ task_module.ScriptTask(config=self.config, device=self.device).run() │
│ 378 │ │ except TaskEnd: │
│ 379 │ │ │ return True │
│ 380 │ │ except GameNotRunningError as e: │
│ │
│ ╭───────────────────────────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────────────────────────╮ │
│ │ command = 'Hyakkiyakou' │ │
│ │ e = AttributeError("'Device' object has no attribute 'root_node'") │ │
│ │ module_name = 'script_task' │ │
│ │ module_path = 'D:\\yys_script\\oas\\OnmyojiAutoScript-easy-install\\OnmyojiAutoScript-easy-install\\'+32 │ │
│ │ self = <script.Script object at 0x000002252D414100> │ │
│ │ task_module = <module 'script_task' from │ │
│ │ 'D:\\yys_script\\oas\\OnmyojiAutoScript-easy-install\\OnmyojiAutoScript-easy-install\\tasks\\Hyakkiyakou\\script_task.py'> │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\tasks\Hyakkiyakou\script_task.py:139 in run │
│ │
│ 136 │ │ │ │ logger.info('Hyakkiyakou time limit out') │
│ 137 │ │ │ │ break │
│ 138 │ │ │ │
│ ❱ 139 │ │ │ self.one() │
│ 140 │ │ │ hya_count += 1 │
│ 141 │ │ │
│ 142 │ │ while 1: │
│ │
│ ╭────────────────────────────── locals ──────────────────────────────╮ │
│ │ hya_count = 0 │ │
│ │ limit_time = datetime.time(0, 20) │ │
│ │ self = <script_task.ScriptTask object at 0x000002254FCD9F90> │ │
│ ╰────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\tasks\Hyakkiyakou\script_task.py:181 in one │
│ │
│ 178 │ │ if self._config.debug_config.hya_show: │
│ 179 │ │ │ self.debugger.show_start() │
│ 180 │ │ while 1: │
│ ❱ 181 │ │ │ │
│ self.fast_screenshot(screenshot=self._config.debug_config.hya_screenshot_method) │
│ 182 │ │ │ if self.appear(self.I_HEND): │
│ 183 │ │ │ │ break │
│ 184 │ │ │ if not self.appear(self.I_CHECK_RUN): │
│ │
│ ╭────────────────────────────────── locals ───────────────────────────────────╮ │
│ │ click_button = <module.atom.click.RuleClick object at 0x000002254FD4B160> │ │
│ │ init_bean_flag = False │ │
│ │ last_action = [0, 0, False, 10] │ │
│ │ self = <script_task.ScriptTask object at 0x000002254FCD9F90> │ │
│ ╰─────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\tasks\Hyakkiyakou\slave\hya_device.py:34 in fast_screenshot │
│ │
│ 31 │ def fast_screenshot(self, screenshot: ScreenshotMethod): │
│ 32 │ │ self.hya_screenshot_interval.wait() │
│ 33 │ │ self.hya_screenshot_interval.reset() │
│ ❱ 34 │ │ self.device.image = self.device.screenshot_window_background() if screenshot == │
│ ScreenshotMethod.WINDOW_BACKGROUND else self.device.screenshot_nemu_ipc() │
│ 35 │ │ if image_black(self.device.image): │
│ 36 │ │ │ logger.error('Screenshot image is black, try again') │
│ 37 │ │ │ raise RequestHumanTakeover('Screenshot image is black, try again') │
│ │
│ ╭──────────────────────────────── locals ────────────────────────────────╮ │
│ │ screenshot = <ScreenshotMethod.WINDOW_BACKGROUND: 'window_background'> │ │
│ │ self = <script_task.ScriptTask object at 0x000002254FCD9F90> │ │
│ ╰────────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\module\device\method\window.py:43 in screenshot_window_background │
│ │
│ 40 │ │ 后台截屏 │
│ 41 │ │ :return: │
│ 42 │ │ """ │
│ ❱ 43 │ │ widthScreen, heightScreen = self.screenshot_size │
│ 44 │ │ # 返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框 │
│ 45 │ │ hwndDc = GetWindowDC(self.screenshot_handle_num) │
│ 46 │ │ # 创建设备描述表 │
│ │
│ ╭───────────────────────────── locals ──────────────────────────────╮ │
│ │ self = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ ╰───────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\toolkit\lib\site-packages\cached_property.py:36 in __get__ │
│ │
│ 33 │ │ if asyncio and asyncio.iscoroutinefunction(self.func): │
│ 34 │ │ │ return self._wrap_in_coroutine(obj) │
│ 35 │ │ │
│ ❱ 36 │ │ value = obj.__dict__[self.func.__name__] = self.func(obj) │
│ 37 │ │ return value │
│ 38 │ │
│ 39 │ def _wrap_in_coroutine(self, obj): │
│ │
│ ╭─────────────────────────────── locals ────────────────────────────────╮ │
│ │ cls = <class 'module.device.device.Device'> │ │
│ │ obj = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ │ self = <cached_property.cached_property object at 0x000002254F2FB190> │ │
│ ╰───────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\module\device\handle.py:381 in screenshot_size │
│ │
│ 378 │ │ 2023.7.1 在高缩放的设备上应该输出1280X720 │
│ 379 │ │ :return: │
│ 380 │ │ """ │
│ ❱ 381 │ │ winRect = GetWindowRect(self.screenshot_handle_num) │
│ 382 │ │ scale_rate = window_scale_rate() │
│ 383 │ │ width_before: int = winRect[2] - winRect[0] # 右x-左x │
│ 384 │ │ height_before: int = winRect[3] - winRect[1] # 下y - 上y 计算高度 │
│ │
│ ╭───────────────────────────── locals ──────────────────────────────╮ │
│ │ self = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ ╰───────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\toolkit\lib\site-packages\cached_property.py:36 in __get__ │
│ │
│ 33 │ │ if asyncio and asyncio.iscoroutinefunction(self.func): │
│ 34 │ │ │ return self._wrap_in_coroutine(obj) │
│ 35 │ │ │
│ ❱ 36 │ │ value = obj.__dict__[self.func.__name__] = self.func(obj) │
│ 37 │ │ return value │
│ 38 │ │
│ 39 │ def _wrap_in_coroutine(self, obj): │
│ │
│ ╭─────────────────────────────── locals ────────────────────────────────╮ │
│ │ cls = <class 'module.device.device.Device'> │ │
│ │ obj = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ │ self = <cached_property.cached_property object at 0x000002254F2FB100> │ │
│ ╰───────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\module\device\handle.py:341 in screenshot_handle_num │
│ │
│ 338 │ │ 截屏的句柄其实并不是根句柄 │
│ 339 │ │ :return: 出错返回None │
│ 340 │ │ """ │
│ ❱ 341 │ │ if self.emulator_family == EmulatorFamily.FAMILY_MUMU: │
│ 342 │ │ │ # 使用正则匹配12 来判定是不是mumu12这并不是一个好的方法 │
│ 343 │ │ │ name = self.root_node.children[0].name │
│ 344 │ │ │ num = self.root_node.children[0].num │
│ │
│ ╭───────────────────────────── locals ──────────────────────────────╮ │
│ │ self = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ ╰───────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\toolkit\lib\site-packages\cached_property.py:36 in __get__ │
│ │
│ 33 │ │ if asyncio and asyncio.iscoroutinefunction(self.func): │
│ 34 │ │ │ return self._wrap_in_coroutine(obj) │
│ 35 │ │ │
│ ❱ 36 │ │ value = obj.__dict__[self.func.__name__] = self.func(obj) │
│ 37 │ │ return value │
│ 38 │ │
│ 39 │ def _wrap_in_coroutine(self, obj): │
│ │
│ ╭─────────────────────────────── locals ────────────────────────────────╮ │
│ │ cls = <class 'module.device.device.Device'> │ │
│ │ obj = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ │ self = <cached_property.cached_property object at 0x000002254F2FB130> │ │
│ ╰───────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\yys_script\oas\OnmyojiAutoScript-easy-install\OnmyojiAutoScript-easy-install\module\device\handle.py:304 in emulator_family │
│ │
│ 301 │ │ 通过句柄树来判断这个是那个模拟器大类 │
│ 302 │ │ :return: │
│ 303 │ │ """ │
│ ❱ 304 │ │ children_num = len(self.root_node.children) │
│ 305 │ │ if children_num == 1: # │
│ 306 │ │ │ name = self.root_node.children[0].name │
│ 307 │ │ │ if name == 'MuMuPlayer': │
│ │
│ ╭───────────────────────────── locals ──────────────────────────────╮ │
│ │ self = <module.device.device.Device object at 0x000002254F59FC70> │ │
│ ╰───────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'Device' object has no attribute 'root_node'
2025-10-18 20:53:40.512 | script.py:0104 | WARNING | Saving error: ./log/error/1760792020512
截图
还有别的吗?
No response
我最开始的时候也是出现你这个错误
│ ╭───────────────────────────── locals ──────────────────────────────╮ │
│ │ self = <module.device.device.Device object at 0x0000025A387AAC50> │ │
│ ╰───────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\ONMYOJ~1\ONMYOJ~1\toolkit\lib\site-packages\cached_property.py:36 in get │
│ │
│ 33 │ │ if asyncio and asyncio.iscoroutinefunction(self.func): │
│ 34 │ │ │ return self._wrap_in_coroutine(obj) │
│ 35 │ │ │
│ ❱ 36 │ │ value = obj.dict[self.func.name] = self.func(obj) │
│ 37 │ │ return value │
│ 38 │ │
│ 39 │ def _wrap_in_coroutine(self, obj): │
│ │
│ ╭─────────────────────────────── locals ────────────────────────────────╮ │
│ │ cls = <class 'module.device.device.Device'> │ │
│ │ obj = <module.device.device.Device object at 0x0000025A387AAC50> │ │
│ │ self = <cached_property.cached_property object at 0x0000025A3858F040> │ │
│ ╰───────────────────────────────────────────────────────────────────────╯ │
│ │
│ D:\ONMYOJ~1\ONMYOJ~1\module\device\handle.py:304 in emulator_family │
│ │
│ 301 │ │ 通过句柄树来判断这个是那个模拟器大类 │
│ 302 │ │ :return: │
│ 303 │ │ """ │
│ ❱ 304 │ │ children_num = len(self.root_node.children) │
│ 305 │ │ if children_num == 1: # │
│ 306 │ │ │ name = self.root_node.children[0].name │
│ 307 │ │ │ if name == 'MuMuPlayer': │
│ │
│ ╭───────────────────────────── locals ──────────────────────────────╮ │
│ │ self = <module.device.device.Device object at 0x0000025A387AAC50> │ │
│ ╰───────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
AttributeError: 'Device' object has no attribute 'root_node'
2025-11-05 23:59:33.923 | script.py:0104 | WARNING | Saving error: ./log/error/1762358373923
更换撒豆方式截图后就更换异常了
应该是这块判断撒豆截图方式的时候去识别模拟器有问题
ERROR | 00:03:15.726 | Unable to use NemuIpc because emulator instance not
CRITICAL | 00:03:15.756 | Request human takeover