OnmyojiAutoScript icon indicating copy to clipboard operation
OnmyojiAutoScript copied to clipboard

百鬼夜行开始撒豆脚本异常退出,重试必现

Open beginner-wgc opened this issue 2 months ago • 1 comments

在提问之前...

  • [x] 我已经搜索了现有的 issues
  • [x] 我在提问题之前至少花费了 5 分钟来思考和准备
  • [x] 我已经阅读了文档中的 常见问题(FAQ)
  • [x] 这个问题出现了至少三次,不是偶发的
  • [x] 我使用 OAS 的 dev 分支

描述你的问题

百鬼夜行开始撒豆脚本异常退出,重试必现

如何复现

  1. 前往 '...'
  2. 点击 '....'
  3. 滑动到 '....'
  4. 出现问题

预期行为

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

截图

Image

还有别的吗?

No response

beginner-wgc avatar Oct 18 '25 12:10 beginner-wgc

我最开始的时候也是出现你这个错误 │ ╭───────────────────────────── 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

更换撒豆方式截图后就更换异常了

Image

应该是这块判断撒豆截图方式的时候去识别模拟器有问题

ERROR | 00:03:15.726 | Unable to use NemuIpc because emulator instance not
CRITICAL | 00:03:15.756 | Request human takeover

1875586605 avatar Nov 05 '25 16:11 1875586605