脚本无法抓取上一次运行和这次运行期间公众号发布的所有信息,只会识别到距离这次运行最近的一篇发布文章,举例:公众号于7:00、9:00、10:00:11:00分别发布了四篇文章,脚本第一次运行为8:00,可以抓到7:00的这篇文章;第二次运行为12:00,就只能抓到11:00这篇文章,中间9:00、10:00这两篇文章就抓不到(以前不会这样)。第二个问题是,脚本没有办法抓取图片文章(以前是可以的)。
回答
你遇到的两个问题在微信自动化脚本中非常典型。“以前不会这样”通常是因为微信客户端更新后,无障碍节点结构、列表加载机制或推文渲染方式发生了变化,导致原有选择器或遍历逻辑失效。下面针对两个问题给出排查方向与优化方案:
问题一:只能抓到最近一篇,遗漏中间文章
根本原因
- 列表懒加载与视图复用:微信公众号历史消息列表采用动态加载。如果脚本未触发滚动或未等待节点渲染完成,无障碍服务只能获取当前屏幕可见的节点,历史文章不会被加载到节点树中。
- 状态比对逻辑不严谨:如果脚本仅用“本次运行时间”做过滤,或去重/断点记录方式不准确,容易跳过中间时段的内容。
- 微信节点结构变更:微信可能调整了列表项的父容器或子节点层级,导致
find()获取的集合不完整。
解决建议
- 强制滚动加载完整列表
在抓取前循环滚动,直到无新节点加载为止,确保目标时间段内的文章全部渲染。// 文档地址 https://docs.hamibot.com/ auto.waitFor(); var list = className("androidx.recyclerview.widget.RecyclerView").findOne(3000); if (list) { while (true) { var countBefore = list.childCount(); scrollDown(); sleep(600); if (list.childCount() == countBefore) { log("列表已加载到底部"); break; } } } - 使用持久化存储记录断点
不要依赖时间模糊匹配。使用storages记录上次成功抓取的最后一篇文章标题或唯一标识,本次从上往下遍历,匹配到断点即停止。// 文档地址 https://docs.hamibot.com/ var storage = storages.create("wechat_mp_tracker"); var lastTitle = storage.get("last_title", ""); // 遍历逻辑中遇到 lastTitle 时 break,并在成功抓取后更新 storage.put("last_title", currentTitle); - 检查遍历集合获取方式
确保使用find()获取全部列表项,而不是findOne()。微信列表项通常有固定的className或id,需结合 UI 查看器确认当前版本的准确选择器。
问题二:无法抓取纯图片文章
根本原因
微信对纯图片/海报类推文的无障碍节点结构与常规图文不同。图片文章通常缺少 text 属性,标题可能为空,或改用 desc(contentDescription)承载信息。如果脚本的选择器强依赖 text() 或固定文本匹配,会直接过滤掉这类节点。
解决建议
- 放宽节点匹配条件,兼容多属性
同时检查text()和desc(),并增加兜底逻辑。// 文档地址 https://docs.hamibot.com/ var items = className("android.widget.LinearLayout").find(); for (var i = 0; i < items.length; i++) { var item = items[i]; var titleNode = item.findOne(textMatches(".+")); var descNode = item.findOne(descMatches(".+")); var title = ""; if (titleNode) { title = titleNode.text(); } else if (descNode) { title = descNode.desc(); } else { title = "[无文本标题-可能为图片推文]"; } log("识别到文章: " + title); } - 使用 Hamibot 无障碍调试工具定位差异
在脚本中临时加入log(item.className() + " | text:" + item.text() + " | desc:" + item.desc()),对比图文文章与图片文章的节点树差异。微信版本更新后,图片推文的容器className或层级可能已改变,需据此调整父级选择器。 - 避免过度过滤
检查脚本中是否存在类似if (!text) continue;的硬过滤逻辑。图片文章的有效信息可能在子节点或兄弟节点中,需扩大查找范围或使用findOne(depth)限制层级。
通用调试与最佳实践
- 微信更新频繁:无障碍节点结构可能随微信小版本更新而变化。建议关键操作前始终使用
findOne(timeout)并判空,避免直接调用导致脚本崩溃退出。 - 打印节点树排查:在选择器失效位置使用
log()输出childCount()、text()、desc()、bounds(),快速定位是“没找到节点”还是“属性变了”。 - Rhino 语法兼容:Hamibot 使用 Rhino 1.7.15 引擎,编写或修改脚本时避免使用箭头函数、默认参数、模板字符串等 ES6+ 语法,使用传统
function和字符串拼接确保稳定运行。 - 动态延迟替代固定 sleep:尽量用
waitFor()或轮询节点状态替代长sleep(),提升脚本在不同机型上的兼容性。
如果你能提供当前脚本中用于定位文章列表、判断文章类型以及记录运行状态的核心代码段,我可以直接帮你指出需要修改的选择器与逻辑位置。有其他 Hamibot 调试或自动化实现问题,随时告诉我。
ℹ️ 内容由 AI 生成,可能不准确,请注意核实