@web-auto/webauto 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/apps/desktop-console/default-settings.json +1 -0
  2. package/apps/desktop-console/dist/main/index.mjs +1618 -0
  3. package/apps/desktop-console/{src → dist}/main/preload.mjs +10 -0
  4. package/apps/desktop-console/dist/renderer/index.js +3063 -0
  5. package/apps/desktop-console/entry/ui-console.mjs +299 -0
  6. package/apps/webauto/entry/account.mjs +356 -0
  7. package/apps/webauto/entry/lib/account-detect.mjs +160 -0
  8. package/apps/webauto/entry/lib/account-store.mjs +587 -0
  9. package/apps/webauto/entry/lib/profilepool.mjs +1 -1
  10. package/apps/webauto/entry/xhs-install.mjs +27 -3
  11. package/apps/webauto/entry/xhs-status.mjs +152 -0
  12. package/apps/webauto/entry/xhs-unified.mjs +595 -17
  13. package/bin/webauto.mjs +247 -12
  14. package/dist/apps/webauto/server.js +66 -0
  15. package/dist/modules/camo-backend/src/index.js +575 -0
  16. package/dist/modules/camo-backend/src/internal/BrowserSession.js +817 -0
  17. package/dist/modules/camo-backend/src/internal/ElementRegistry.js +61 -0
  18. package/dist/modules/camo-backend/src/internal/ProfileLock.js +85 -0
  19. package/dist/modules/camo-backend/src/internal/SessionManager.js +172 -0
  20. package/dist/modules/camo-backend/src/internal/container-matcher.js +852 -0
  21. package/dist/modules/camo-backend/src/internal/engine-manager.js +258 -0
  22. package/dist/modules/camo-backend/src/internal/fingerprint.js +203 -0
  23. package/dist/modules/camo-backend/src/internal/pageRuntime.js +29 -0
  24. package/dist/modules/camo-backend/src/internal/runtimeInjector.js +30 -0
  25. package/dist/modules/camo-backend/src/internal/state-bus.js +46 -0
  26. package/dist/modules/camo-backend/src/internal/storage-paths.js +36 -0
  27. package/dist/modules/camo-backend/src/internal/ws-server.js +1202 -0
  28. package/dist/modules/camo-runtime/src/utils/browser-service.mjs +423 -0
  29. package/dist/modules/camo-runtime/src/utils/config.mjs +77 -0
  30. package/dist/modules/container-registry/src/index.js +184 -0
  31. package/dist/modules/logging/src/index.js +92 -0
  32. package/dist/modules/operations/src/builtin.js +27 -0
  33. package/dist/modules/operations/src/container-binding.js +75 -0
  34. package/dist/modules/operations/src/executor.js +146 -0
  35. package/dist/modules/operations/src/operations/click.js +167 -0
  36. package/dist/modules/operations/src/operations/extract.js +204 -0
  37. package/dist/modules/operations/src/operations/find-child.js +17 -0
  38. package/dist/modules/operations/src/operations/highlight.js +138 -0
  39. package/dist/modules/operations/src/operations/key.js +61 -0
  40. package/dist/modules/operations/src/operations/navigate.js +148 -0
  41. package/dist/modules/operations/src/operations/scroll.js +126 -0
  42. package/dist/modules/operations/src/operations/type.js +190 -0
  43. package/dist/modules/operations/src/queue.js +100 -0
  44. package/dist/modules/operations/src/registry.js +11 -0
  45. package/dist/modules/operations/src/system/mouse.js +33 -0
  46. package/dist/modules/state/src/atomic-json.js +33 -0
  47. package/dist/modules/workflow/blocks/AnchorVerificationBlock.js +71 -0
  48. package/dist/modules/workflow/blocks/BehaviorRandomizer.js +26 -0
  49. package/dist/modules/workflow/blocks/CallWorkflowBlock.js +38 -0
  50. package/dist/modules/workflow/blocks/CloseDetailBlock.js +209 -0
  51. package/dist/modules/workflow/blocks/CollectBatch.js +137 -0
  52. package/dist/modules/workflow/blocks/CollectCommentsBlock.js +415 -0
  53. package/dist/modules/workflow/blocks/CollectSearchListBlock.js +599 -0
  54. package/dist/modules/workflow/blocks/CollectWeiboPosts.js +229 -0
  55. package/dist/modules/workflow/blocks/DetectPageStateBlock.js +259 -0
  56. package/dist/modules/workflow/blocks/EnsureLoginBlock.js +162 -0
  57. package/dist/modules/workflow/blocks/EnsureSession.js +426 -0
  58. package/dist/modules/workflow/blocks/ErrorClassifier.js +164 -0
  59. package/dist/modules/workflow/blocks/ErrorRecoveryBlock.js +319 -0
  60. package/dist/modules/workflow/blocks/ExpandCommentsBlock.js +1032 -0
  61. package/dist/modules/workflow/blocks/ExtractDetailBlock.js +310 -0
  62. package/dist/modules/workflow/blocks/ExtractPostFields.js +88 -0
  63. package/dist/modules/workflow/blocks/GenerateSmartReplyBlock.js +68 -0
  64. package/dist/modules/workflow/blocks/GoToSearchBlock.js +497 -0
  65. package/dist/modules/workflow/blocks/GracefulFallbackBlock.js +104 -0
  66. package/dist/modules/workflow/blocks/HighlightBlock.js +66 -0
  67. package/dist/modules/workflow/blocks/InitAutoScroll.js +65 -0
  68. package/dist/modules/workflow/blocks/LoadContainerDefinition.js +50 -0
  69. package/dist/modules/workflow/blocks/LoadContainerIndex.js +43 -0
  70. package/dist/modules/workflow/blocks/LocateAndGuardBlock.js +176 -0
  71. package/dist/modules/workflow/blocks/LoginRecoveryBlock.js +242 -0
  72. package/dist/modules/workflow/blocks/MatchContainers.js +64 -0
  73. package/dist/modules/workflow/blocks/MonitoringBlock.js +190 -0
  74. package/dist/modules/workflow/blocks/OpenDetailBlock.js +1240 -0
  75. package/dist/modules/workflow/blocks/OrganizeXhsNotesBlock.js +117 -0
  76. package/dist/modules/workflow/blocks/PersistXhsNoteBlock.js +270 -0
  77. package/dist/modules/workflow/blocks/PickSinglePost.js +69 -0
  78. package/dist/modules/workflow/blocks/ProgressTracker.js +125 -0
  79. package/dist/modules/workflow/blocks/RecordFixtureBlock.js +44 -0
  80. package/dist/modules/workflow/blocks/RenderMarkdown.js +48 -0
  81. package/dist/modules/workflow/blocks/SaveFile.js +54 -0
  82. package/dist/modules/workflow/blocks/ScrollNextBatch.js +72 -0
  83. package/dist/modules/workflow/blocks/SessionHealthBlock.js +73 -0
  84. package/dist/modules/workflow/blocks/StartBrowserService.js +45 -0
  85. package/dist/modules/workflow/blocks/ValidateContainerDefinition.js +67 -0
  86. package/dist/modules/workflow/blocks/ValidateExtract.js +35 -0
  87. package/dist/modules/workflow/blocks/WaitSearchPermitBlock.js +162 -0
  88. package/dist/modules/workflow/blocks/WaitStable.js +74 -0
  89. package/dist/modules/workflow/blocks/WarmupCommentsBlock.js +120 -0
  90. package/dist/modules/workflow/blocks/WorkflowExecutor.js +156 -0
  91. package/dist/modules/workflow/blocks/XiaohongshuCollectFromLinksBlock.js +1004 -0
  92. package/dist/modules/workflow/blocks/XiaohongshuCollectLinksBlock.js +1049 -0
  93. package/dist/modules/workflow/blocks/XiaohongshuFullCollectBlock.js +782 -0
  94. package/dist/modules/workflow/blocks/helpers/anchorVerify.js +198 -0
  95. package/dist/modules/workflow/blocks/helpers/asyncWorkQueue.js +53 -0
  96. package/dist/modules/workflow/blocks/helpers/commentScroller.js +334 -0
  97. package/dist/modules/workflow/blocks/helpers/commentSectionLocator.js +126 -0
  98. package/dist/modules/workflow/blocks/helpers/containerAnchors.js +301 -0
  99. package/dist/modules/workflow/blocks/helpers/debugArtifacts.js +6 -0
  100. package/dist/modules/workflow/blocks/helpers/downloadPaths.js +29 -0
  101. package/dist/modules/workflow/blocks/helpers/expandCommentsController.js +53 -0
  102. package/dist/modules/workflow/blocks/helpers/expandCommentsExtractor.js +129 -0
  103. package/dist/modules/workflow/blocks/helpers/macosVisionOcrPlugin.js +116 -0
  104. package/dist/modules/workflow/blocks/helpers/mergeXhsMarkdown.js +109 -0
  105. package/dist/modules/workflow/blocks/helpers/openDetailController.js +56 -0
  106. package/dist/modules/workflow/blocks/helpers/openDetailTypes.js +7 -0
  107. package/dist/modules/workflow/blocks/helpers/openDetailViewport.js +474 -0
  108. package/dist/modules/workflow/blocks/helpers/openDetailWaiter.js +104 -0
  109. package/dist/modules/workflow/blocks/helpers/operationLogger.js +195 -0
  110. package/dist/modules/workflow/blocks/helpers/persistedNotes.js +107 -0
  111. package/dist/modules/workflow/blocks/helpers/replyExpander.js +260 -0
  112. package/dist/modules/workflow/blocks/helpers/scrollIntoView.js +138 -0
  113. package/dist/modules/workflow/blocks/helpers/searchExecutor.js +328 -0
  114. package/dist/modules/workflow/blocks/helpers/searchGate.js +46 -0
  115. package/dist/modules/workflow/blocks/helpers/searchPageState.js +164 -0
  116. package/dist/modules/workflow/blocks/helpers/searchResultWaiter.js +64 -0
  117. package/dist/modules/workflow/blocks/helpers/simpleAnchor.js +134 -0
  118. package/dist/modules/workflow/blocks/helpers/smartReply.js +40 -0
  119. package/dist/modules/workflow/blocks/helpers/systemInput.js +635 -0
  120. package/dist/modules/workflow/blocks/helpers/targetCountMode.js +9 -0
  121. package/dist/modules/workflow/blocks/helpers/xhsCliArgs.js +80 -0
  122. package/dist/modules/workflow/blocks/helpers/xhsCommentDom.js +805 -0
  123. package/dist/modules/workflow/blocks/helpers/xhsNoteOrganizer.js +140 -0
  124. package/dist/modules/workflow/blocks/restore/RestorePhaseBlock.js +204 -0
  125. package/dist/modules/workflow/config/workflowRegistry.js +32 -0
  126. package/dist/modules/workflow/definitions/batch-collect-workflow.js +63 -0
  127. package/dist/modules/workflow/definitions/scroll-extract-workflow.js +74 -0
  128. package/dist/modules/workflow/definitions/xiaohongshu-collect-workflow-v2.js +81 -0
  129. package/dist/modules/workflow/definitions/xiaohongshu-collect-workflow.js +57 -0
  130. package/dist/modules/workflow/definitions/xiaohongshu-full-collect-workflow-v3.js +68 -0
  131. package/dist/modules/workflow/definitions/xiaohongshu-note-collect.js +49 -0
  132. package/dist/modules/workflow/definitions/xiaohongshu-phase1-workflow-v3.js +30 -0
  133. package/dist/modules/workflow/definitions/xiaohongshu-phase2-links-workflow-v3.js +40 -0
  134. package/dist/modules/workflow/definitions/xiaohongshu-phase3-collect-workflow-v1.js +54 -0
  135. package/dist/modules/workflow/definitions/xiaohongshu-phase34-from-links-workflow-v3.js +25 -0
  136. package/dist/modules/workflow/src/WeiboEventDrivenWorkflowRunner.js +308 -0
  137. package/dist/modules/workflow/src/context.js +70 -0
  138. package/dist/modules/workflow/src/index.js +5 -0
  139. package/dist/modules/workflow/src/orchestrator.js +230 -0
  140. package/dist/modules/workflow/src/runner.js +55 -0
  141. package/dist/modules/workflow/src/runtime.js +70 -0
  142. package/dist/modules/workflow/workflows/WeiboFeedExtractionWorkflow.js +359 -0
  143. package/dist/modules/workflow/workflows/XiaohongshuLoginWorkflow.js +110 -0
  144. package/dist/modules/xiaohongshu/app/src/blocks/MatchCommentsBlock.js +139 -0
  145. package/dist/modules/xiaohongshu/app/src/blocks/Phase1EnsureServicesBlock.js +36 -0
  146. package/dist/modules/xiaohongshu/app/src/blocks/Phase1MonitorCookieBlock.js +213 -0
  147. package/dist/modules/xiaohongshu/app/src/blocks/Phase1StartProfileBlock.js +121 -0
  148. package/dist/modules/xiaohongshu/app/src/blocks/Phase2CollectLinksBlock.js +1249 -0
  149. package/dist/modules/xiaohongshu/app/src/blocks/Phase2SearchBlock.js +703 -0
  150. package/dist/modules/xiaohongshu/app/src/blocks/Phase34CloseDetailBlock.js +41 -0
  151. package/dist/modules/xiaohongshu/app/src/blocks/Phase34CloseTabsBlock.js +44 -0
  152. package/dist/modules/xiaohongshu/app/src/blocks/Phase34CollectCommentsBlock.js +150 -0
  153. package/dist/modules/xiaohongshu/app/src/blocks/Phase34ExtractDetailBlock.js +117 -0
  154. package/dist/modules/xiaohongshu/app/src/blocks/Phase34OpenDetailBlock.js +102 -0
  155. package/dist/modules/xiaohongshu/app/src/blocks/Phase34OpenTabsBlock.js +109 -0
  156. package/dist/modules/xiaohongshu/app/src/blocks/Phase34PersistDetailBlock.js +117 -0
  157. package/dist/modules/xiaohongshu/app/src/blocks/Phase34ProcessSingleNoteBlock.js +114 -0
  158. package/dist/modules/xiaohongshu/app/src/blocks/Phase34ValidateLinksBlock.js +90 -0
  159. package/dist/modules/xiaohongshu/app/src/blocks/Phase3InteractBlock.js +1009 -0
  160. package/dist/modules/xiaohongshu/app/src/blocks/Phase4MultiTabHarvestBlock.js +233 -0
  161. package/dist/modules/xiaohongshu/app/src/blocks/ReplyInteractBlock.js +291 -0
  162. package/dist/modules/xiaohongshu/app/src/blocks/XhsDiscoverFallbackBlock.js +240 -0
  163. package/dist/modules/xiaohongshu/app/src/blocks/helpers/commentMatchDsl.js +126 -0
  164. package/dist/modules/xiaohongshu/app/src/blocks/helpers/commentMatcher.js +99 -0
  165. package/dist/modules/xiaohongshu/app/src/blocks/helpers/evidence.js +27 -0
  166. package/dist/modules/xiaohongshu/app/src/blocks/helpers/sharding.js +42 -0
  167. package/dist/modules/xiaohongshu/app/src/blocks/helpers/xhsComments.js +270 -0
  168. package/dist/modules/xiaohongshu/app/src/index.js +9 -0
  169. package/dist/modules/xiaohongshu/app/src/utils/checkpoints.js +222 -0
  170. package/dist/modules/xiaohongshu/app/src/utils/controllerAction.js +43 -0
  171. package/dist/services/controller/src/controller.js +1476 -0
  172. package/dist/services/controller/src/index.js +2 -0
  173. package/dist/services/controller/src/payload-normalizer.js +129 -0
  174. package/dist/services/shared/heartbeat.js +120 -0
  175. package/dist/services/shared/lib/errorHandler.js +2 -0
  176. package/dist/services/shared/serviceProcessLogger.js +139 -0
  177. package/dist/services/unified-api/RemoteBrowserSession.js +176 -0
  178. package/dist/services/unified-api/RemoteSessionManager.js +148 -0
  179. package/dist/services/unified-api/container-operations-handler.js +115 -0
  180. package/dist/services/unified-api/server.js +652 -0
  181. package/dist/services/unified-api/state-registry.js +274 -0
  182. package/dist/services/unified-api/task-persistence.js +66 -0
  183. package/dist/services/unified-api/task-state.js +130 -0
  184. package/modules/camo-runtime/src/autoscript/action-providers/xhs/search.mjs +12 -5
  185. package/modules/xiaohongshu/app/pnpm-lock.yaml +24 -0
  186. package/package.json +37 -9
  187. package/.beads/README.md +0 -81
  188. package/.beads/config.yaml +0 -67
  189. package/.beads/interactions.jsonl +0 -0
  190. package/.beads/issues.jsonl +0 -180
  191. package/.beads/metadata.json +0 -4
  192. package/.claude/settings.local.json +0 -10
  193. package/.github/workflows/ci.yml +0 -55
  194. package/AGENTS.md +0 -253
  195. package/apps/desktop-console/README.md +0 -27
  196. package/apps/desktop-console/package-lock.json +0 -897
  197. package/apps/desktop-console/package.json +0 -20
  198. package/apps/desktop-console/scripts/build-and-install.mjs +0 -19
  199. package/apps/desktop-console/scripts/build.mjs +0 -45
  200. package/apps/desktop-console/scripts/test-preload.mjs +0 -13
  201. package/apps/desktop-console/src/main/config.mts +0 -26
  202. package/apps/desktop-console/src/main/core-daemon-manager.mts +0 -131
  203. package/apps/desktop-console/src/main/desktop-settings.mts +0 -267
  204. package/apps/desktop-console/src/main/heartbeat-watchdog.mts +0 -50
  205. package/apps/desktop-console/src/main/heartbeat-watchdog.test.mts +0 -68
  206. package/apps/desktop-console/src/main/index-streaming.test.mts +0 -20
  207. package/apps/desktop-console/src/main/index.mts +0 -980
  208. package/apps/desktop-console/src/main/profile-store.mts +0 -239
  209. package/apps/desktop-console/src/main/profile-store.test.mts +0 -54
  210. package/apps/desktop-console/src/main/state-bridge.mts +0 -114
  211. package/apps/desktop-console/src/main/task-state-types.ts +0 -32
  212. package/apps/desktop-console/src/renderer/hooks/use-task-state.mts +0 -120
  213. package/apps/desktop-console/src/renderer/index.mts +0 -133
  214. package/apps/desktop-console/src/renderer/index.test.mts +0 -34
  215. package/apps/desktop-console/src/renderer/path-helpers.mts +0 -46
  216. package/apps/desktop-console/src/renderer/path-helpers.test.mts +0 -14
  217. package/apps/desktop-console/src/renderer/tabs/debug.mts +0 -48
  218. package/apps/desktop-console/src/renderer/tabs/debug.test.mts +0 -22
  219. package/apps/desktop-console/src/renderer/tabs/logs.mts +0 -421
  220. package/apps/desktop-console/src/renderer/tabs/logs.test.mts +0 -27
  221. package/apps/desktop-console/src/renderer/tabs/preflight.mts +0 -486
  222. package/apps/desktop-console/src/renderer/tabs/preflight.test.mts +0 -33
  223. package/apps/desktop-console/src/renderer/tabs/profile-pool.mts +0 -213
  224. package/apps/desktop-console/src/renderer/tabs/results.mts +0 -171
  225. package/apps/desktop-console/src/renderer/tabs/run.test.mts +0 -63
  226. package/apps/desktop-console/src/renderer/tabs/runtime.mts +0 -151
  227. package/apps/desktop-console/src/renderer/tabs/settings.mts +0 -146
  228. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/account-flow.mts +0 -486
  229. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/guide-browser-check.mts +0 -56
  230. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/helpers.mts +0 -262
  231. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/layout-block.mts +0 -430
  232. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/live-stats.mts +0 -847
  233. package/apps/desktop-console/src/renderer/tabs/xiaohongshu/run-flow.mts +0 -443
  234. package/apps/desktop-console/src/renderer/tabs/xiaohongshu-state.mts +0 -425
  235. package/apps/desktop-console/src/renderer/tabs/xiaohongshu.mts +0 -497
  236. package/apps/desktop-console/src/renderer/tabs/xiaohongshu.test.mts +0 -291
  237. package/apps/desktop-console/src/renderer/ui-components.mts +0 -31
  238. package/docs/README_camoufox_chinese.md +0 -141
  239. package/docs/USAGE_V3.md +0 -163
  240. package/docs/arch/OCR_MACOS_PLUGIN.md +0 -39
  241. package/docs/arch/PORTS.md +0 -40
  242. package/docs/arch/REGRESSION_CHECKLIST.md +0 -121
  243. package/docs/arch/SEARCH_GATE.md +0 -224
  244. package/docs/arch/VIEWPORT_SAFETY.md +0 -182
  245. package/docs/arch/XIAOHONGSHU_OFFLINE_MOCK_DESIGN.md +0 -267
  246. package/docs/xiaohongshu-container-driven-summary.md +0 -221
  247. package/docs/xiaohongshu-full-collect-runbook.md +0 -134
  248. package/docs/xiaohongshu-next-steps.md +0 -228
  249. package/docs/xiaohongshu-quickstart.md +0 -73
  250. package/docs/xiaohongshu-workflow-summary.md +0 -227
  251. package/modules/container-registry/tests/container-registry.test.ts +0 -16
  252. package/modules/logging/tests/logging.test.ts +0 -38
  253. package/modules/operations/tests/operations.test.ts +0 -22
  254. package/modules/operations/tests/viewport-filter.test.ts +0 -161
  255. package/modules/operations/tests/visible-only.test.ts +0 -250
  256. package/modules/session-manager/tests/session-manager.test.ts +0 -23
  257. package/modules/state/src/atomic-json.test.ts +0 -30
  258. package/modules/state/src/paths.test.ts +0 -59
  259. package/modules/state/src/xiaohongshu-collect-state.test.ts +0 -259
  260. package/modules/workflow/blocks/AnchorVerificationBlock.d.ts.map +0 -1
  261. package/modules/workflow/blocks/AnchorVerificationBlock.js.map +0 -1
  262. package/modules/workflow/blocks/DetectPageStateBlock.d.ts.map +0 -1
  263. package/modules/workflow/blocks/DetectPageStateBlock.js.map +0 -1
  264. package/modules/workflow/blocks/ErrorRecoveryBlock.d.ts.map +0 -1
  265. package/modules/workflow/blocks/ErrorRecoveryBlock.js.map +0 -1
  266. package/modules/workflow/blocks/WaitSearchPermitBlock.d.ts.map +0 -1
  267. package/modules/workflow/blocks/WaitSearchPermitBlock.js.map +0 -1
  268. package/modules/workflow/blocks/helpers/containerAnchors.d.ts.map +0 -1
  269. package/modules/workflow/blocks/helpers/containerAnchors.js.map +0 -1
  270. package/modules/workflow/blocks/helpers/downloadPaths.test.ts +0 -62
  271. package/modules/workflow/blocks/helpers/mergeXhsMarkdown.test.ts +0 -121
  272. package/modules/workflow/blocks/helpers/operationLogger.d.ts.map +0 -1
  273. package/modules/workflow/blocks/helpers/operationLogger.js.map +0 -1
  274. package/modules/workflow/blocks/helpers/persistedNotes.test.ts +0 -268
  275. package/modules/workflow/blocks/helpers/searchPageState.d.ts.map +0 -1
  276. package/modules/workflow/blocks/helpers/searchPageState.js.map +0 -1
  277. package/modules/workflow/blocks/helpers/targetCountMode.test.ts +0 -29
  278. package/modules/workflow/blocks/helpers/xhsCliArgs.test.ts +0 -75
  279. package/modules/workflow/tests/smartReply.test.ts +0 -32
  280. package/modules/xiaohongshu/app/src/blocks/Phase3Interact.matcher.test.ts +0 -33
  281. package/modules/xiaohongshu/app/src/utils/__tests__/checkpoints.test.ts +0 -141
  282. package/modules/xiaohongshu/app/tests/commentMatchDsl.test.ts +0 -50
  283. package/modules/xiaohongshu/app/tests/commentMatcher.test.ts +0 -46
  284. package/modules/xiaohongshu/app/tests/sharding.test.ts +0 -31
  285. package/package-scripts.json +0 -8
  286. package/runtime/infra/utils/README.md +0 -13
  287. package/runtime/infra/utils/scripts/README.md +0 -0
  288. package/runtime/infra/utils/scripts/development/eval-in-session.mjs +0 -40
  289. package/runtime/infra/utils/scripts/development/highlight-search-containers.mjs +0 -35
  290. package/runtime/infra/utils/scripts/service/kill-port.mjs +0 -24
  291. package/runtime/infra/utils/scripts/service/start-api.mjs +0 -39
  292. package/runtime/infra/utils/scripts/service/start-browser-service.mjs +0 -106
  293. package/runtime/infra/utils/scripts/service/stop-api.mjs +0 -18
  294. package/runtime/infra/utils/scripts/service/stop-browser-service.mjs +0 -104
  295. package/runtime/infra/utils/scripts/test-services.mjs +0 -94
  296. package/services/shared/heartbeat.test.ts +0 -102
  297. package/services/unified-api/__tests__/task-state.test.ts +0 -95
  298. package/sitecustomize.py +0 -19
  299. package/tests/README.md +0 -194
  300. package/tests/e2e/workflows/weibo-feed-extraction.test.ts +0 -171
  301. package/tests/fixtures/data/container-definitions.json +0 -67
  302. package/tests/fixtures/pages/simple-page.html +0 -69
  303. package/tests/integration/01-test-container-match.mjs +0 -188
  304. package/tests/integration/02-test-dom-branch.mjs +0 -161
  305. package/tests/integration/03-test-container-operation-system.mjs +0 -91
  306. package/tests/integration/05-test-container-lifecycle-events.mjs +0 -224
  307. package/tests/integration/05-test-container-lifecycle-with-events.mjs +0 -250
  308. package/tests/integration/06-test-container-dom-tree-drawing.mjs +0 -256
  309. package/tests/integration/07-test-weibo-container-lifecycle.mjs +0 -355
  310. package/tests/integration/08-test-weibo-feed-workflow.test.mjs +0 -164
  311. package/tests/integration/10-test-visual-analyzer.mjs +0 -312
  312. package/tests/integration/11-test-visual-loop.mjs +0 -284
  313. package/tests/integration/12-test-simple-visual-loop.mjs +0 -242
  314. package/tests/integration/13-test-visual-robust.mjs +0 -185
  315. package/tests/integration/14-test-visual-highlight-loop.mjs +0 -271
  316. package/tests/integration/inspect-page.mjs +0 -50
  317. package/tests/integration/run-all-tests.mjs +0 -95
  318. package/tests/patch_verification/CODEX_PATCH_TEST.md +0 -103
  319. package/tests/patch_verification/PHASE2_ANALYSIS.md +0 -179
  320. package/tests/patch_verification/PHASE2_OPTIMIZATION_REPORT.md +0 -55
  321. package/tests/patch_verification/PHASE2_TO_PHASE4_SUMMARY.md +0 -126
  322. package/tests/patch_verification/QUICK_TEST_SEQUENCE.md +0 -262
  323. package/tests/patch_verification/README.md +0 -143
  324. package/tests/patch_verification/RUN_TESTS.md +0 -60
  325. package/tests/patch_verification/TEST_EXECUTION.md +0 -99
  326. package/tests/patch_verification/TEST_PLAN.md +0 -328
  327. package/tests/patch_verification/TEST_RESULTS.md +0 -34
  328. package/tests/patch_verification/TOOL_TEST_PLAN.md +0 -48
  329. package/tests/patch_verification/run-tool-test.mjs +0 -121
  330. package/tests/patch_verification/temp_test_files/test01.txt +0 -1
  331. package/tests/patch_verification/temp_test_files/test02.txt +0 -3
  332. package/tests/patch_verification/temp_test_files/test02_gnu.txt +0 -3
  333. package/tests/patch_verification/temp_test_files/test03.txt +0 -1
  334. package/tests/patch_verification/temp_test_files/test03_multiline.txt +0 -5
  335. package/tests/patch_verification/temp_test_files/test04_function.ts +0 -5
  336. package/tests/patch_verification/temp_test_files/test05_import.ts +0 -4
  337. package/tests/patch_verification/temp_test_files/test06_special_chars.txt +0 -4
  338. package/tests/patch_verification/temp_test_files/test07_indentation.ts +0 -5
  339. package/tests/patch_verification/temp_test_files/test08_mismatch.txt +0 -1
  340. package/tests/patch_verification/temp_test_files/test_add_02.txt +0 -3
  341. package/tests/patch_verification/temp_test_files/test_simple.txt +0 -1
  342. package/tests/runner/TestReporter.mjs +0 -57
  343. package/tests/runner/TestRunner.mjs +0 -244
  344. package/tests/unit/commands/profile.test.mjs +0 -10
  345. package/tests/unit/container/change-notifier.test.mjs +0 -181
  346. package/tests/unit/lifecycle/session-registry.test.mjs +0 -135
  347. package/tests/unit/operations/registry.test.ts +0 -73
  348. package/tests/unit/utils/browser-service.test.mjs +0 -153
  349. package/tests/unit/utils/config.test.mjs +0 -166
  350. package/tests/unit/utils/fingerprint.test.mjs +0 -166
  351. package/tsconfig.json +0 -31
  352. package/tsconfig.services.json +0 -26
  353. /package/apps/desktop-console/{src → dist}/renderer/index.html +0 -0
  354. /package/apps/desktop-console/{src/renderer/tabs → dist/renderer}/run.mts +0 -0
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env node
2
- import http from 'node:http';
3
-
4
- const UNIFIED_API = 'http://127.0.0.1:7701';
5
- const PROFILE = 'weibo_fresh';
6
-
7
- async function httpPost(path, data) {
8
- return new Promise((resolve, reject) => {
9
- const payload = JSON.stringify(data);
10
- const req = http.request(
11
- `${UNIFIED_API}${path}`,
12
- { method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) } },
13
- (res) => {
14
- let body = '';
15
- res.on('data', (chunk) => body += chunk);
16
- res.on('end', () => { try { resolve(JSON.parse(body)); } catch (err) { resolve({ body }); } });
17
- }
18
- );
19
- req.on('error', reject);
20
- req.write(payload);
21
- req.end();
22
- });
23
- }
24
-
25
- async function main() {
26
- const result = await httpPost('/v1/controller/action', {
27
- action: 'browser:execute',
28
- payload: {
29
- profile: PROFILE,
30
- script: `
31
- (function() {
32
- const links = Array.from(document.querySelectorAll('a'));
33
- const visibleLinks = links.filter(a => {
34
- const r = a.getBoundingClientRect();
35
- return r.width > 0 && r.height > 0 && r.top >= 0 && r.left >= 0 && r.top < window.innerHeight;
36
- }).slice(0, 5);
37
-
38
- return visibleLinks.map(a => ({
39
- tagName: a.tagName.toLowerCase(),
40
- className: a.className,
41
- text: a.textContent.substring(0, 20),
42
- rect: a.getBoundingClientRect()
43
- }));
44
- })()
45
- `
46
- }
47
- });
48
- console.log(JSON.stringify(result, null, 2));
49
- }
50
- main();
@@ -1,95 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * 运行所有集成测试
4
- */
5
-
6
- import { execSync } from 'child_process';
7
- import fs from 'fs';
8
-
9
- console.log('🧪 WebAuto 集成测试套件');
10
- console.log('='.repeat(60));
11
-
12
- const REPORT_FILE = '/tmp/integration-test-report.txt';
13
- fs.writeFileSync(REPORT_FILE, '');
14
-
15
- const log = (msg) => {
16
- console.log(msg);
17
- fs.appendFileSync(REPORT_FILE, `${msg}\n`);
18
- };
19
-
20
- const tests = [
21
- {
22
- name: '容器匹配功能',
23
- script: 'tests/integration/01-test-container-match.mjs',
24
- required: true
25
- },
26
- {
27
- name: 'DOM 分支拉取功能',
28
- script: 'tests/integration/02-test-dom-branch.mjs',
29
- required: true
30
- }
31
- ];
32
-
33
- let passed = 0;
34
- let failed = 0;
35
- const results = [];
36
-
37
- for (const test of tests) {
38
- log(`\n${'='.repeat(60)}`);
39
- log(`运行: ${test.name}`);
40
- log(`${'='.repeat(60)}`);
41
-
42
- try {
43
- const output = execSync(`node ${test.script}`, {
44
- encoding: 'utf8',
45
- stdio: 'inherit',
46
- timeout: 60000
47
- });
48
-
49
- log(`✅ ${test.name} - 通过`);
50
- results.push({ name: test.name, status: 'PASS' });
51
- passed++;
52
-
53
- } catch (err) {
54
- log(`❌ ${test.name} - 失败`);
55
- results.push({ name: test.name, status: 'FAIL', error: err.message });
56
- failed++;
57
-
58
- if (test.required) {
59
- log(`\n⚠️ 必需测试失败,停止后续测试`);
60
- break;
61
- }
62
- }
63
- }
64
-
65
- // 生成报告
66
- log(`\n${'='.repeat(60)}`);
67
- log('测试报告');
68
- log(`${'='.repeat(60)}`);
69
-
70
- results.forEach(r => {
71
- const icon = r.status === 'PASS' ? '✅' : '❌';
72
- log(`${icon} ${r.name}: ${r.status}`);
73
- if (r.error) {
74
- log(` 错误: ${r.error}`);
75
- }
76
- });
77
-
78
- log(`\n总计: ${passed} 通过, ${failed} 失败`);
79
-
80
- // 输出文件位置
81
- log(`\n${'='.repeat(60)}`);
82
- log('生成的文件:');
83
- log(' - /tmp/test-container-match.log');
84
- log(' - /tmp/container-match-result.json');
85
- log(' - /tmp/test-dom-branch.log');
86
- log(' - /tmp/dom-branch-result.json');
87
- log(` - ${REPORT_FILE}`);
88
-
89
- if (failed > 0) {
90
- log(`\n💡 检查日志文件以了解失败原因`);
91
- process.exit(1);
92
- } else {
93
- log(`\n🎉 所有测试通过!`);
94
- process.exit(0);
95
- }
@@ -1,103 +0,0 @@
1
- # Codex apply_patch 工具验证方案
2
-
3
- ## 目标
4
- 验证 Codex 的 `functions.apply_patch` 能够可靠地修改代码文件
5
-
6
- ## 测试策略
7
- 每个测试独立执行,按顺序验证不同场景
8
-
9
- ---
10
-
11
- ## 测试执行计划
12
-
13
- ### Phase 1: 基础操作 (必须100%通过)
14
-
15
- **TEST-01: 创建新文件**
16
- - 操作: 创建一个新的空文件并添加内容
17
- - 验证: 文件存在且内容正确
18
-
19
- **TEST-02: 单行替换**
20
- - 操作: 替换文件中的一行文本
21
- - 验证: 目标行被替换,其他行不变
22
-
23
- **TEST-03: 多行替换**
24
- - 操作: 替换连续的多行文本
25
- - 验证: 所有目标行被替换,前后行不变
26
-
27
- **TEST-04: 文件中间插入**
28
- - 操作: 在文件中间位置插入新内容
29
- - 验证: 新内容插入正确位置,原有内容完整
30
-
31
- **TEST-05: 文件末尾追加**
32
- - 操作: 在文件末尾添加新行
33
- - 验证: 新内容追加成功
34
-
35
- ---
36
-
37
- ### Phase 2: 代码场景 (必须100%通过)
38
-
39
- **TEST-06: 替换函数实现**
40
- - 操作: 替换整个函数体
41
- - 验证: 函数被完整替换,语法正确
42
-
43
- **TEST-07: 添加 import 语句**
44
- - 操作: 在现有 import 后添加新 import
45
- - 验证: import 顺序正确
46
-
47
- **TEST-08: 修改对象属性**
48
- - 操作: 修改 JSON/对象中的某个属性值
49
- - 验证: 目标属性被修改,其他属性不变
50
-
51
- **TEST-09: 添加类方法**
52
- - 操作: 在类中添加新方法
53
- - 验证: 新方法添加成功,类结构完整
54
-
55
- ---
56
-
57
- ### Phase 3: 边界场景 (≥90%通过)
58
-
59
- **TEST-10: 特殊字符**
60
- - 操作: 处理包含 `"` `'` `\` `/` 等特殊字符的内容
61
- - 验证: 特殊字符不被破坏
62
-
63
- **TEST-11: 保持缩进**
64
- - 操作: 修改带缩进的代码
65
- - 验证: 缩进格式保持一致
66
-
67
- **TEST-12: 大块内容替换**
68
- - 操作: 替换超过10行的大块代码
69
- - 验证: 替换准确,性能可接受
70
-
71
- ---
72
-
73
- ### Phase 4: 错误处理 (必须正确报错)
74
-
75
- **TEST-13: 文件不存在**
76
- - 操作: 尝试修改不存在的文件
77
- - 验证: 返回清晰错误信息
78
-
79
- **TEST-14: 内容不匹配**
80
- - 操作: 尝试替换不存在的内容
81
- - 验证: 返回清晰错误信息
82
-
83
- ---
84
-
85
- ## 执行方式
86
-
87
- 我会逐个测试执行:
88
- 1. 准备测试文件(通过 shell)
89
- 2. 应用补丁(调用 apply_patch)
90
- 3. 验证结果(读取文件内容)
91
- 4. 报告状态(✓ PASS / ✗ FAIL)
92
- 5. 继续下一个测试
93
-
94
- 所有测试文件在 `tests/patch_verification/temp_test_files/` 目录下
95
-
96
- ## 成功标准
97
- - Phase 1: 5/5 通过
98
- - Phase 2: 4/4 通过
99
- - Phase 3: ≥3/3 通过
100
- - Phase 4: 2/2 正确报错
101
-
102
- **总计: ≥13/14 通过**
103
-
@@ -1,179 +0,0 @@
1
- # Phase 2 搜索流程分析报告
2
-
3
- ## 当前 Phase 2 脚本
4
-
5
- **文件**: `scripts/xiaohongshu/tests/phase2-search-v3.mjs`
6
-
7
- ## 流程步骤
8
-
9
- ### 1️⃣ 进入前检查
10
- - **目的**: 确认当前在主页
11
- - **方法**: `detectPageState()` 获取根容器 ID
12
- - **问题**: 仅检查根容器存在,未强制验证必须是主页
13
-
14
- ### 2️⃣ 请求 SearchGate 许可
15
- - **目的**: 防止频繁搜索触发风控
16
- - **方法**: 调用 `http://127.0.0.1:7790/permit`
17
- - **问题**: 如果 SearchGate 未启动会直接失败退出
18
-
19
- ### 3️⃣ 检查风控状态
20
- - **目的**: 检测是否出现验证码/登录框
21
- - **方法**: 在容器树中查找 `qrcode_guard` 容器
22
- - **问题**: 如果已风控,会尝试返回发现页,但没有重试机制
23
-
24
- ### 4️⃣ 验证搜索框锚点
25
- - **目的**: 确认搜索框可见
26
- - **方法**: 高亮 `xiaohongshu_home.search_input` 容器
27
- - **问题**: ✅ 使用容器高亮,符合规范
28
-
29
- ### 5️⃣ 执行搜索
30
- - **目的**: 输入关键字并触发搜索
31
- - **方法**: 调用 `container:operation` 的 `type` 操作,`submit: true`
32
- - **问题**: ✅ 通过容器操作,符合安全规范
33
-
34
- ### 6️⃣ 等待导航
35
- - **目的**: 等待搜索结果页加载
36
- - **方法**: 固定等待 3 秒
37
- - **问题**: ⚠️ 硬编码等待时间,可能过短或过长
38
-
39
- ### 7️⃣ 退出后检查
40
- - **目的**: 确认已导航到搜索结果页
41
- - **方法**: 检查根容器 ID 是否包含 'search'
42
- - **问题**: ⚠️ 仅检查根容器名称,未验证实际内容
43
-
44
- ### 8️⃣ 验证搜索结果列表锚点
45
- - **目的**: 确认搜索结果列表存在
46
- - **方法**: 高亮 `xiaohongshu_search.search_result_list` 容器
47
- - **问题**: ✅ 使用容器定位
48
-
49
- ### 9️⃣ 采集结果
50
- - **目的**: 获取搜索结果列表
51
- - **方法**: 调用 `containers:inspect-container` 获取子容器
52
- - **返回**: `note_id`, `title` 等字段
53
- - **去重**: 基于 `note_id`
54
- - **问题**: ⚠️ 未验证每个 note_id 的有效性
55
-
56
- ## 核心问题汇总
57
-
58
- ### 🔴 高优先级问题
59
-
60
- 1. **链接有效性未验证**
61
- - 当前只采集 `note_id`,但未验证这些 ID 是否可访问
62
- - 可能返回失效/风控的链接
63
-
64
- 2. **导航等待不可靠**
65
- - 固定等待 3 秒可能不够
66
- - 应该监听实际页面加载完成事件
67
-
68
- 3. **SearchGate 依赖强制**
69
- - 如果 SearchGate 未启动直接失败
70
- - 应该提供降级方案或更清晰的错误提示
71
-
72
- ### 🟡 中优先级问题
73
-
74
- 4. **风控恢复机制不完善**
75
- - 检测到风控后尝试返回,但只尝试一次
76
- - 应该有更完善的恢复策略
77
-
78
- 5. **采集数量验证不充分**
79
- - 只检查是否 >= 5 条,但不验证质量
80
- - 应该验证每条是否包含必需字段
81
-
82
- ### 🟢 低优先级问题
83
-
84
- 6. **日志输出不够详细**
85
- - 缺少时间戳
86
- - 缺少每步耗时统计
87
-
88
- ## 建议改进方案
89
-
90
- ### 方案 A: 最小改动(快速修复)
91
-
92
- 1. 在步骤 9 后增加"链接有效性验证":
93
- - 随机抽取 1-2 条结果
94
- - 尝试访问详情页
95
- - 验证是否成功加载
96
-
97
- 2. 将步骤 6 的固定等待改为:
98
- - 轮询检查搜索结果容器是否出现
99
- - 最多等待 10 秒
100
-
101
- 3. SearchGate 降级:
102
- - 如果 SearchGate 未响应,警告但继续执行
103
- - 记录跳过 SearchGate 的次数
104
-
105
- ### 方案 B: 完整重构(推荐)
106
-
107
- 1. 增加 `validateSearchResult()` 函数:
108
- ```javascript
109
- async function validateSearchResult(noteId) {
110
- // 构造详情页容器 ID
111
- const detailUrl = `https://www.xiaohongshu.com/explore/${noteId}`;
112
-
113
- // 通过容器导航(禁止直接构造 URL)
114
- // 方法:在搜索结果中找到对应 note_id 的容器并点击
115
-
116
- // 验证详情页是否成功加载
117
- // 返回 true/false
118
- }
119
- ```
120
-
121
- 2. 采集后验证:
122
- ```javascript
123
- // 采集结果后
124
- const validItems = [];
125
- for (const item of dedupedItems.slice(0, 3)) {
126
- const isValid = await validateSearchResult(item.note_id);
127
- if (isValid) {
128
- validItems.push(item);
129
- }
130
- }
131
-
132
- if (validItems.length < MIN_RESULTS) {
133
- console.error('❌ 有效结果不足');
134
- process.exit(1);
135
- }
136
- ```
137
-
138
- 3. 改进导航等待:
139
- ```javascript
140
- async function waitForSearchResults(maxWaitMs = 10000) {
141
- const startTime = Date.now();
142
- while (Date.now() - startTime < maxWaitMs) {
143
- const exists = await checkContainerExists('xiaohongshu_search.search_result_list');
144
- if (exists) return true;
145
- await delay(500);
146
- }
147
- return false;
148
- }
149
- ```
150
-
151
- ## 下一步行动
152
-
153
- ### 选项 1: 先执行当前版本,记录问题
154
- - 运行 phase2-search-v3.mjs
155
- - 记录实际采集的 note_id
156
- - 手动验证这些 ID 是否可访问
157
- - 根据实际情况决定是否需要改进
158
-
159
- ### 选项 2: 立即实施方案 A(推荐)
160
- - 预计耗时:30 分钟
161
- - 修改 phase2-search-v3.mjs
162
- - 增加链接验证逻辑
163
- - 测试验证
164
-
165
- ### 选项 3: 实施方案 B(彻底解决)
166
- - 预计耗时:2 小时
167
- - 重构 phase2-search-v3.mjs
168
- - 增加完整验证机制
169
- - 编写测试用例
170
-
171
- ## 结论
172
-
173
- **当前 Phase 2 脚本基本可用,但缺少链接有效性验证**
174
-
175
- 建议:
176
- 1. 先执行一次当前版本,观察实际效果
177
- 2. 如果采集的链接有效率低,立即实施方案 A
178
- 3. 长期规划实施方案 B
179
-
@@ -1,55 +0,0 @@
1
- # Phase 2 脚本优化与测试报告
2
-
3
- ## 优化内容
4
-
5
- ### 1. 模块化重构
6
- - 拆分为 `modules/xiaohongshu/src/`:
7
- - `utils/browser.mjs`: 基础操作封装
8
- - `actions/search.mjs`: 搜索逻辑
9
- - `actions/collect.mjs`: 列表采集
10
- - `actions/detail.mjs`: 详情页操作
11
- - 脚本入口 `scripts/xiaohongshu/tests/phase2-v4-modular.mjs` 逻辑更清晰
12
-
13
- ### 2. 搜索交互优化
14
- - **输入逻辑增强**:
15
- - 先获取元素坐标
16
- - 使用 `browser:command mouse:click` 点击中心点
17
- - 使用系统组合键(Meta+A / Ctrl+A + Backspace)清空
18
- - 使用 `keyboard:type` 系统输入
19
- - 增加输入后内容验证与重试
20
- - **触发逻辑兜底**:
21
- - 回车键触发
22
- - 点击搜索按钮触发(双重保障)
23
-
24
- ### 3. 点击跳转优化
25
- - **多种点击策略**:
26
- - 优先尝试容器 `click`(配置为 `self`)
27
- - 备用方案:JS 强制点击 `item` 和 `link`
28
- - **页面状态检测**:
29
- - 点击前尝试 `scrollIntoView` 并避让 Header
30
- - 点击后检测 URL 变化和弹窗容器
31
-
32
- ### 4. 链接安全与校验
33
- - **searchUrl 校验**:记录点击前的搜索 URL,确保采集内容来源正确
34
- - **xsec_token 检查**:强制要求详情页 URL 包含 `xsec_token`
35
-
36
- ## 测试结果
37
-
38
- ### ✅ 成功项
39
- - **搜索触发**:优化后的输入逻辑能正确输入关键词并触发搜索
40
- - **列表采集**:DOM 备用方案能稳定采集到搜索结果列表(28条)
41
- - **Fallback 跳转**:当交互搜索失败时,能通过构造 URL 跳转到搜索页(虽然 URL 显式仍为 /explore)
42
-
43
- ### ❌ 阻塞项(环境风控)
44
- - **详情页跳转失败**:
45
- - 无论使用何种点击方式,页面均未跳转
46
- - URL 始终保持在 `/explore`
47
- - 手动构造详情页 URL 跳转也被重定向回 `/explore`
48
- - **结论**:当前测试环境(账号/IP)触发了小红书的详情页访问风控(禁止直连,点击无效)。
49
-
50
- ## 下一步建议
51
-
52
- 1. **更换测试环境**:需要在一个未被风控的浏览器环境/账号下验证 Phase 2-4。
53
- 2. **代码就绪**:脚本逻辑已优化且模块化,等待环境就绪即可验证。
54
- 3. **风控策略升级**:考虑增加更像真人的交互(随机鼠标轨迹、浏览停留等),但这属于高级反爬范畴。
55
-
@@ -1,126 +0,0 @@
1
- # Phase 2-4 脚本流程总结报告
2
-
3
- ## 概述
4
-
5
- 基于代码审查,Phase 2-4 脚本的稳定性和可靠性分析。
6
-
7
- ---
8
-
9
- ## Phase 2: 搜索采集
10
-
11
- **文件**: `scripts/xiaohongshu/tests/phase2-search-v3.mjs`
12
- **代码行数**: ~250 行
13
-
14
- ### ✅ 优点
15
- - 使用容器驱动操作(符合安全规范)
16
- - 有 SearchGate 节流机制
17
- - 有风控检测和恢复机制
18
- - 基于 note_id 去重
19
-
20
- ### ❌ 核心问题
21
- 1. **链接有效性未验证** 🔴
22
- - 只采集 `note_id`,未验证是否可访问
23
- - 可能返回失效/风控的链接
24
-
25
- 2. **导航等待不可靠** 🟡
26
- - 固定等待 3 秒
27
- - 应该轮询检查容器是否出现
28
-
29
- 3. **SearchGate 依赖强制** 🟡
30
- - 如果未启动直接退出
31
- - 应该有降级方案
32
-
33
- ### 🎯 建议
34
- **立即执行一次,观察实际有效率,再决定是否改进**
35
-
36
- ---
37
-
38
- ## Phase 3: 详情页采集
39
-
40
- **文件**: `scripts/xiaohongshu/tests/phase3-detail-v3.mjs`
41
- **代码行数**: 178 行
42
-
43
- ### ✅ 优点
44
- - 进入前检查搜索结果是否存在
45
- - 使用容器高亮验证元素
46
-
47
- ### ❌ 核心问题
48
- 1. **使用 DOM 选择器而非容器 ID** 🔴
49
- ```javascript
50
- verifyAnchor('.feeds-container .note-item', '第一条搜索结果')
51
- verifyAnchor('.author-container, .user-info', '作者信息区域')
52
- verifyAnchor('.note-content, .desc', '正文区域')
53
- ```
54
- - **违反规范**:应该使用容器 ID(如 `xiaohongshu_detail.header`)
55
- - **风险**:DOM 结构变化会导致失败
56
-
57
- 2. **点击操作未使用容器** 🔴
58
- - 应该通过 `container:operation` 点击,而非直接执行 JS
59
-
60
- ### 🎯 建议
61
- **必须改造**:将所有 DOM 选择器替换为容器 ID
62
-
63
- ---
64
-
65
- ## Phase 4: 评论采集
66
-
67
- **文件**: `scripts/xiaohongshu/tests/phase4-comments.mjs`
68
- **代码行数**: 313 行
69
-
70
- ### ✅ 优点
71
- - 使用 Workflow Block(CollectCommentsBlock)
72
- - 有错误恢复机制(ErrorRecoveryBlock)
73
- - 输出到标准化路径(~/.webauto/download/)
74
-
75
- ### ❓ 未知
76
- - Block 内部是否使用容器 ID(需要检查 Block 源码)
77
-
78
- ### 🎯 建议
79
- 检查 `CollectCommentsBlock` 实现是否符合容器驱动规范
80
-
81
- ---
82
-
83
- ## 整体问题优先级
84
-
85
- ### 🔴 P0 - 必须立即修复
86
- 1. Phase 3 使用 DOM 选择器(违反规范)
87
-
88
- ### 🟡 P1 - 应该尽快修复
89
- 2. Phase 2 链接有效性验证
90
- 3. Phase 2 导航等待优化
91
-
92
- ### 🟢 P2 - 可以延后
93
- 4. SearchGate 降级方案
94
- 5. 日志输出优化
95
-
96
- ---
97
-
98
- ## 推荐执行策略
99
-
100
- ### 步骤 1: 快速验证(30 分钟)
101
- 1. 执行 Phase 2(观察采集的 note_id)
102
- 2. 手动访问 2-3 个 note_id 验证有效性
103
- 3. 记录有效率
104
-
105
- ### 步骤 2: 必要修复(2 小时)
106
- 如果 Phase 2 有效率 < 90%:
107
- - 增加链接验证逻辑
108
-
109
- **必须执行**(无论 Phase 2 结果):
110
- - 修复 Phase 3 的 DOM 选择器问题
111
-
112
- ### 步骤 3: 完整测试(1 小时)
113
- 1. Phase 2 → Phase 3 → Phase 4 串联测试
114
- 2. 验证完整采集流程
115
- 3. 检查输出数据完整性
116
-
117
- ---
118
-
119
- ## 结论
120
-
121
- **Phase 2-4 脚本基本框架正确,但 Phase 3 存在规范性问题,必须修复**
122
-
123
- 建议优先级:
124
- 1. 修复 Phase 3 DOM 选择器 → 容器 ID
125
- 2. 验证 Phase 2 链接有效率
126
- 3. 完整串联测试